*/
package org.opendaylight.mdsal.singleton.dom.impl;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Verify.verify;
import static com.google.common.base.Verify.verifyNotNull;
import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
import org.opendaylight.yangtools.concepts.Registration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(ActiveServiceGroup.class);
private final @NonNull DOMEntityOwnershipService entityOwnershipService;
- private final @NonNull String identifier;
+ private final @NonNull ServiceGroupIdentifier identifier;
/* Entity instances */
private final @NonNull DOMEntity serviceEntity;
* @param parent parent service
* @param services Services list
*/
- ActiveServiceGroup(final String identifier, final DOMEntityOwnershipService entityOwnershipService,
+ ActiveServiceGroup(final ServiceGroupIdentifier identifier, final DOMEntityOwnershipService entityOwnershipService,
final DOMEntity serviceEntity, final DOMEntity cleanupEntity, final List<ServiceRegistration> services) {
- checkArgument(!identifier.isEmpty(), "Identifier may not be empty");
- this.identifier = identifier;
+ this.identifier = requireNonNull(identifier);
this.entityOwnershipService = requireNonNull(entityOwnershipService);
this.serviceEntity = requireNonNull(serviceEntity);
this.cleanupEntity = requireNonNull(cleanupEntity);
}
@VisibleForTesting
- ActiveServiceGroup(final String identifier, final DOMEntity serviceEntity,
+ ActiveServiceGroup(final ServiceGroupIdentifier identifier, final DOMEntity serviceEntity,
final DOMEntity cleanupEntity, final DOMEntityOwnershipService entityOwnershipService) {
this(identifier, entityOwnershipService, serviceEntity, cleanupEntity, ImmutableList.of());
}
@Override
- public String getIdentifier() {
+ public ServiceGroupIdentifier getIdentifier() {
return identifier;
}
private ClusterSingletonService verifyRegistration(final ServiceRegistration reg) {
final var service = reg.getInstance();
- verify(identifier.equals(service.getIdentifier().value()));
+ verify(identifier.equals(service.getIdentifier()));
return service;
}
import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.osgi.service.component.annotations.Activate;
@Override
public synchronized Registration registerClusterSingletonService(final ClusterSingletonService service) {
+ final var serviceIdentifier = requireNonNull(service.getIdentifier());
LOG.debug("Call registrationService {} method for ClusterSingletonService Provider {}", service, this);
- final var serviceIdentifier = service.getIdentifier().value();
+ final var identifierValue = serviceIdentifier.value();
final ServiceGroup serviceGroup;
- final var existing = serviceGroupMap.get(serviceIdentifier);
+ final var existing = serviceGroupMap.get(identifierValue);
if (existing == null) {
serviceGroup = createGroup(serviceIdentifier, new ArrayList<>(1));
- serviceGroupMap.put(serviceIdentifier, serviceGroup);
+ serviceGroupMap.put(identifierValue, serviceGroup);
try {
initializeOrRemoveGroup(serviceGroup);
return reg;
}
- private ServiceGroup createGroup(final String serviceIdentifier, final List<ServiceRegistration> services) {
- return new ActiveServiceGroup(serviceIdentifier, entityOwnershipService,
- createEntity(SERVICE_ENTITY_TYPE, serviceIdentifier),
- createEntity(CLOSE_SERVICE_ENTITY_TYPE, serviceIdentifier), services);
+ private ServiceGroup createGroup(final ServiceGroupIdentifier identifier,
+ final List<ServiceRegistration> services) {
+ return new ActiveServiceGroup(identifier, entityOwnershipService,
+ createEntity(SERVICE_ENTITY_TYPE, identifier), createEntity(CLOSE_SERVICE_ENTITY_TYPE, identifier),
+ services);
}
private void initializeOrRemoveGroup(final ServiceGroup group) throws CandidateAlreadyRegisteredException {
}
}
- private void removeRegistration(final String serviceIdentifier, final ServiceRegistration reg) {
+ private void removeRegistration(final ServiceGroupIdentifier serviceIdentifier, final ServiceRegistration reg) {
final PlaceholderServiceGroup placeHolder;
final ListenableFuture<?> future;
synchronized (this) {
- final var lookup = verifyNotNull(serviceGroupMap.get(serviceIdentifier));
+ final var lookup = verifyNotNull(serviceGroupMap.get(serviceIdentifier.value()));
future = lookup.unregisterService(reg);
if (future == null) {
return;
final var services = placeHolder.getServices();
if (services.isEmpty()) {
// No services, we are all done
- if (serviceGroupMap.remove(identifier, placeHolder)) {
+ if (serviceGroupMap.remove(identifier.value(), placeHolder)) {
LOG.debug("Service group {} removed", placeHolder);
} else {
- LOG.debug("Service group {} superseded by {}", placeHolder, serviceGroupMap.get(identifier));
+ LOG.debug("Service group {} superseded by {}", placeHolder, serviceGroupMap.get(identifier.value()));
}
return;
}
// Placeholder is being retired, we are reusing its services as the seed for the group.
final var group = createGroup(identifier, services);
- verify(serviceGroupMap.replace(identifier, placeHolder, group));
+ verify(serviceGroupMap.replace(identifier.value(), placeHolder, group));
placeHolder.setSuccessor(group);
LOG.debug("Service group upgraded from {} to {}", placeHolder, group);
}
@VisibleForTesting
- static String getServiceIdentifierFromEntity(final DOMEntity entity) {
+ static @NonNull String getServiceIdentifierFromEntity(final DOMEntity entity) {
final var yii = entity.getIdentifier();
final var niiwp = (NodeIdentifierWithPredicates) yii.getLastPathArgument();
return niiwp.values().iterator().next().toString();
* Creates an extended {@link DOMEntity} instance.
*
* @param entityType the type of the entity
- * @param entityIdentifier the identifier of the entity
+ * @param sgi the identifier of the entity
* @return instance of Entity extended GenericEntity type
*/
@VisibleForTesting
- static DOMEntity createEntity(final String entityType, final String entityIdentifier) {
- return new DOMEntity(entityType, entityIdentifier);
+ static DOMEntity createEntity(final String entityType, final ServiceGroupIdentifier sgi) {
+ return new DOMEntity(entityType, sgi.value());
}
}
import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
import org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange;
import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
}
@Override
- public String getIdentifier() {
+ public ServiceGroupIdentifier getIdentifier() {
return previous.getIdentifier();
}
import org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange;
import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
import org.opendaylight.yangtools.concepts.Identifiable;
/**
* ensure a service group instance has fully closed prior to relinquishing service ownership. To achieve ownership
* of the service group, a service group candidate must hold ownership of both these entities.
*/
-abstract sealed class ServiceGroup implements Identifiable<String> permits ActiveServiceGroup, PlaceholderServiceGroup {
+abstract sealed class ServiceGroup implements Identifiable<ServiceGroupIdentifier>
+ permits ActiveServiceGroup, PlaceholderServiceGroup {
/**
* This method must be called once on startup to initialize this group and register the relevant group entity
* candidate. It means create relevant Group Entity Candidate Registration.
}
static class TestClusterSingletonService implements ClusterSingletonService {
- private static final @NonNull ServiceGroupIdentifier SERVICE_ID = new ServiceGroupIdentifier(SERVICE_NAME);
-
private TestClusterSingletonServiceState serviceState = TestClusterSingletonServiceState.INITIALIZED;
@Override
}
}
- static final @NonNull String SERVICE_NAME = "testServiceName";
+ private static final @NonNull String SERVICE_NAME = "testServiceName";
+ private static final @NonNull ServiceGroupIdentifier SERVICE_ID = new ServiceGroupIdentifier(SERVICE_NAME);
static final @NonNull DOMEntity ENTITY = new DOMEntity(SERVICE_ENTITY_TYPE, SERVICE_NAME);
static final @NonNull DOMEntity DOUBLE_ENTITY = new DOMEntity(CLOSE_SERVICE_ENTITY_TYPE, SERVICE_NAME);
*/
@Test
public void makeEntityClusterSingletonServiceProviderTest() {
- final var testEntity = EOSClusterSingletonServiceProvider.createEntity(SERVICE_ENTITY_TYPE, SERVICE_NAME);
- assertEquals(ENTITY, testEntity);
- final var testDbEn = EOSClusterSingletonServiceProvider.createEntity(CLOSE_SERVICE_ENTITY_TYPE, SERVICE_NAME);
- assertEquals(DOUBLE_ENTITY, testDbEn);
+ assertEquals(ENTITY, EOSClusterSingletonServiceProvider.createEntity(SERVICE_ENTITY_TYPE, SERVICE_ID));
+ assertEquals(DOUBLE_ENTITY,
+ EOSClusterSingletonServiceProvider.createEntity(CLOSE_SERVICE_ENTITY_TYPE, SERVICE_ID));
}
/**
}
};
- singletonServiceGroup = new ActiveServiceGroup(SERVICE_IDENTIFIER, MAIN_ENTITY, CLOSE_ENTITY, mockEosService);
+ singletonServiceGroup = new ActiveServiceGroup(SERVICE_GROUP_IDENT, MAIN_ENTITY, CLOSE_ENTITY, mockEosService);
}
/**
() -> new ActiveServiceGroup(null, MAIN_ENTITY, CLOSE_ENTITY, mockEosService));
}
- /**
- * Test empty ServiceIdent input for new ServiceGroup instance.
- */
- @Test
- public void instantiationClusterSingletonServiceGroupEmptyIdentTest() {
- assertThrows(IllegalArgumentException.class,
- () -> new ActiveServiceGroup("", MAIN_ENTITY, CLOSE_ENTITY, mockEosService));
- }
-
/**
* Test NULL MainEntity input for new ServiceGroup instance.
*/
@Test
public void instantiationClusterSingletonServiceGroupNullMainEntityTest() {
assertThrows(NullPointerException.class,
- () -> new ActiveServiceGroup(SERVICE_IDENTIFIER, null, CLOSE_ENTITY, mockEosService));
+ () -> new ActiveServiceGroup(SERVICE_GROUP_IDENT, null, CLOSE_ENTITY, mockEosService));
}
/**
@Test
public void instantiationClusterSingletonServiceGroupNullCloseEntityTest() {
assertThrows(NullPointerException.class,
- () -> new ActiveServiceGroup(SERVICE_IDENTIFIER, MAIN_ENTITY, null, mockEosService));
+ () -> new ActiveServiceGroup(SERVICE_GROUP_IDENT, MAIN_ENTITY, null, mockEosService));
}
/**
@Test
public void instantiationClusterSingletonServiceGroupNullEOS_Test() {
assertThrows(NullPointerException.class,
- () -> new ActiveServiceGroup(SERVICE_IDENTIFIER, MAIN_ENTITY, CLOSE_ENTITY, null));
+ () -> new ActiveServiceGroup(SERVICE_GROUP_IDENT, MAIN_ENTITY, CLOSE_ENTITY, null));
}
/**