+ private void updateContainmentEndpointRegChilds(WriteTransaction t, ContainmentEndpoint containmentEndpoint) {
+ ReadOnlyTransaction readTransaction = dataProvider.newReadOnlyTransaction();
+
+ for (ChildEndpoint child : nullToEmpty(containmentEndpoint.getChildEndpoint())) {
+ AddressEndpointKey key = new AddressEndpointKey(child.getAddress(), child.getAddressType(),
+ child.getContextId(), child.getContextType());
+ Optional<AddressEndpoint> addressEndpointOptional = DataStoreHelper
+ .readFromDs(LogicalDatastoreType.OPERATIONAL, IidFactory.addressEndpointIid(key), readTransaction);
+
+ if (addressEndpointOptional.isPresent()) {
+ ParentEndpointChoice parentEndpointChoice = addressEndpointOptional.get().getParentEndpointChoice();
+ List<ParentContainmentEndpoint> parentContainmentEndpoints =
+ getParentContainmentEndpoints(parentEndpointChoice);
+
+ ParentContainmentEndpoint parentContainmentEndpoint =
+ new ParentContainmentEndpointBuilder().setContextId(containmentEndpoint.getContextId())
+ .setContextType(containmentEndpoint.getContextType())
+ .build();
+
+ if (!nullToEmpty(parentContainmentEndpoints).contains(parentContainmentEndpoint)) {
+ parentContainmentEndpoints.add(parentContainmentEndpoint);
+ AddressEndpoint updatedAddressEndpoint = new AddressEndpointBuilder(addressEndpointOptional.get())
+ .setParentEndpointChoice(new ParentContainmentEndpointCaseBuilder()
+ .setParentContainmentEndpoint(parentContainmentEndpoints).build())
+ .build();
+
+ t.put(LogicalDatastoreType.OPERATIONAL, IidFactory.addressEndpointIid(key), updatedAddressEndpoint);
+ }
+ }
+ }
+ }
+
+ private ListenableFuture<RpcResult<Void>> verifyRegisterEndpointInput(RegisterEndpointInput input) {
+ ListenableFuture<RpcResult<Void>> result;
+ List<AddressEndpointReg> addressEndpointRegs = nullToEmpty(input.getAddressEndpointReg());
+ List<ContainmentEndpointReg> containmentEndpointRegs = nullToEmpty(input.getContainmentEndpointReg());
+
+ for (AddressEndpointReg addressEndpointReg : nullToEmpty(addressEndpointRegs)) {
+ result = verifyAddressEndpointChilds(addressEndpointRegs, addressEndpointReg);
+ if (result != null) {
+ return result;
+ }
+
+ result = verifyAddressEndpointParents(addressEndpointRegs, addressEndpointReg);
+ if (result != null) {
+ return result;
+ }
+ }
+
+ result = verifyContainmentEndpointChilds(addressEndpointRegs, containmentEndpointRegs);
+ if (result != null) {
+ return result;
+ }
+
+ return null;
+ }
+
+ private ListenableFuture<RpcResult<Void>> verifyContainmentEndpointChilds(
+ List<AddressEndpointReg> addressEndpointRegs, List<ContainmentEndpointReg> containmentEndpointRegs) {
+ for (ContainmentEndpointReg containmentEndpointReg : nullToEmpty(containmentEndpointRegs)) {
+ for (ChildEndpoint childEndpoint : nullToEmpty(containmentEndpointReg.getChildEndpoint())) {
+ AddressEndpointRegKey key = new AddressEndpointRegKey(childEndpoint.getAddress(),
+ childEndpoint.getAddressType(), childEndpoint.getContextId(), childEndpoint.getContextType());
+ AddressEndpointReg addressEndpointRegChild = findAddressEndpointReg(key, addressEndpointRegs);
+ if (addressEndpointRegChild == null) {
+ // todo this can be optimized if we move this to
+ // updateContainmentEndpointRegChilds and verify child in one step with update.
+ Optional<AddressEndpoint> addressEndpointOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(new AddressEndpointKey(key.getAddress(),
+ key.getAddressType(), key.getContextId(), key.getContextType())),
+ dataProvider.newReadOnlyTransaction());
+ if (!addressEndpointOptional.isPresent()) {
+ LOG.debug("Child AddressEndpoint {} does not exist in RPC and DS.", childEndpoint);
+ return buildFailFeature(
+ String.format("Child AddressEndpoint %s does not exist in RPC and DS.", childEndpoint));
+ }
+ } else {
+
+ if (!containmentEndpointReg.getKey().equals(new ContainmentEndpointRegKey(
+ addressEndpointRegChild.getContextId(), addressEndpointRegChild.getContextType()))) {
+ LOG.debug(
+ "Child AddressEndpoint {} in ContainmentEndpoint->ChildEndpoints does not contain a valid ContainmentEndpointRegKey.",
+ addressEndpointRegChild);
+ return buildFailFeature(String
+ .format("AddressEndpoint in ContainmentEndpoint->ChildEndpoints does not contain a valid ContainmentEndpointRegKey."
+ + "\nChild element: %s", addressEndpointRegChild));
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private ListenableFuture<RpcResult<Void>> verifyAddressEndpointParents(List<AddressEndpointReg> addressEndpointRegs,
+ AddressEndpointReg addressEndpointReg) {
+ ParentEndpointChoice parentEndpointChoice = addressEndpointReg.getParentEndpointChoice();
+ List<ParentEndpoint> parentEndpoints;
+ parentEndpoints =
+ (parentEndpointChoice instanceof ParentEndpointCase) ? ((ParentEndpointCase) parentEndpointChoice)
+ .getParentEndpoint() : null;
+
+ for (ParentEndpoint parentEndpoint : nullToEmpty(parentEndpoints)) {
+ AddressEndpointRegKey key = new AddressEndpointRegKey(parentEndpoint.getAddress(),
+ parentEndpoint.getAddressType(), parentEndpoint.getContextId(), parentEndpoint.getContextType());
+ AddressEndpointReg addressEndpointRegParent = findAddressEndpointReg(key, addressEndpointRegs);
+
+ if (addressEndpointRegParent == null) {
+ // todo this can be optimized if we move this to updateAddressEndpointRegParents and
+ // verify child in one step with update.
+ Optional<AddressEndpoint> addressEndpointOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(new AddressEndpointKey(key.getAddress(),
+ key.getAddressType(), key.getContextId(), key.getContextType())),
+ dataProvider.newReadOnlyTransaction());
+ if (!addressEndpointOptional.isPresent()) {
+ LOG.debug("Parent AddressEndpoint {} does not exist in RPC and DS.", parentEndpoint);
+ return buildFailFeature(
+ String.format("Parent AddressEndpoint %s does not exist in RPC and DS.", parentEndpoint));
+ }
+ } else {
+
+ List<ChildEndpoint> childEndpoints = addressEndpointRegParent.getChildEndpoint();
+
+ if (!nullToEmpty(childEndpoints).contains(new ChildEndpointBuilder(addressEndpointReg).build())) {
+ LOG.debug("Parent AddressEndpoint {} does not contain a valid child AddressEndpoint.",
+ addressEndpointRegParent);
+ return buildFailFeature(String.format(
+ "Parent AddressEndpoint does not contain a valid child AddressEndpoint."
+ + "\nParent AddressEndpoint: %s" + "\nChild AddressEndpoint: %s",
+ addressEndpointRegParent, addressEndpointReg));
+ }
+ }
+ }
+ return null;
+ }
+
+ private ListenableFuture<RpcResult<Void>> verifyAddressEndpointChilds(List<AddressEndpointReg> addressEndpointRegs,
+ AddressEndpointReg addressEndpointReg) {
+ for (ChildEndpoint childEndpoint : nullToEmpty(addressEndpointReg.getChildEndpoint())) {
+ AddressEndpointRegKey key = new AddressEndpointRegKey(childEndpoint.getAddress(),
+ childEndpoint.getAddressType(), childEndpoint.getContextId(), childEndpoint.getContextType());
+ AddressEndpointReg addressEndpointRegChild = findAddressEndpointReg(key, addressEndpointRegs);
+ if (addressEndpointRegChild == null) {
+ // todo this can be optimized if we move this to updateAddressEndpointRegChilds and
+ // verify child in one step with update.
+ Optional<AddressEndpoint> addressEndpointOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(new AddressEndpointKey(key.getAddress(),
+ key.getAddressType(), key.getContextId(), key.getContextType())),
+ dataProvider.newReadOnlyTransaction());
+ if (!addressEndpointOptional.isPresent()) {
+ LOG.debug("Child AddressEndpoint {} does not exist in RPC and DS.", childEndpoint);
+ return buildFailFeature(
+ String.format("Child AddressEndpoint %s does not exist in RPC and DS.", childEndpoint));
+ }
+ } else {
+
+ ParentEndpointChoice parentEndpointChoice = addressEndpointRegChild.getParentEndpointChoice();
+
+ if (!(parentEndpointChoice instanceof ParentEndpointCase)) {
+ LOG.debug("Child AddressEndpoint {} does not contain list of parent elements.", childEndpoint);
+ return buildFailFeature(String.format(
+ "Child AddressEndpoint does not contain list of parent elements." + "\nChild element: %s",
+ childEndpoint));
+ }
+
+ List<ParentEndpoint> parentEndpoints =
+ nullToEmpty(((ParentEndpointCase) parentEndpointChoice).getParentEndpoint());
+ if (!parentEndpoints.contains(new ParentEndpointBuilder(addressEndpointReg).build())) {
+ LOG.debug("Child AddressEndpoint {} does not contain a valid parent AddressEndpoint.",
+ addressEndpointRegChild);
+ return buildFailFeature(String.format(
+ "Child AddressEndpoint does not contain a valid parent AddressEndpoint."
+ + "\nChild element: %s" + "\nparent AddressEndpoint: %s",
+ addressEndpointRegChild, addressEndpointReg));
+ }
+ }
+ }
+ return null;
+ }
+
+ private AddressEndpointReg findAddressEndpointReg(AddressEndpointRegKey key, List<AddressEndpointReg> addressEndpointRegs) {
+ for (AddressEndpointReg addressEndpointReg : addressEndpointRegs) {
+ if (addressEndpointReg.getKey().equals(key)) {
+ return addressEndpointReg;
+ }
+ }
+ return null;
+ }
+
+ private void updateAddressEndpointRegParents(WriteTransaction t, AddressEndpoint endpoint) {
+ ParentEndpointCase parentEndpointCase = (ParentEndpointCase) endpoint.getParentEndpointChoice();
+ List<ParentEndpoint> parentEndpoints;
+ ReadOnlyTransaction readTransaction = dataProvider.newReadOnlyTransaction();
+
+ parentEndpoints = getParentEndpoints(parentEndpointCase);
+
+ for (ParentEndpoint parent : nullToEmpty(parentEndpoints)) {
+ Optional<AddressEndpoint> addressEndpointOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(new AddressEndpointKey(parent.getAddress(),
+ parent.getAddressType(), parent.getContextId(), parent.getContextType())),
+ readTransaction);
+
+ if (addressEndpointOptional.isPresent()) {
+
+ List<ChildEndpoint> childEndpoints;
+
+ childEndpoints = (addressEndpointOptional.get() == null || addressEndpointOptional.get()
+ .getChildEndpoint() == null) ? new ArrayList<>() : addressEndpointOptional.get().getChildEndpoint();
+
+ ChildEndpoint childEndpoint = new ChildEndpointBuilder(endpoint).build();
+ if (!childEndpoints.contains(childEndpoint)) {
+ childEndpoints.add(childEndpoint);
+ AddressEndpoint parentAddressEndpoint = new AddressEndpointBuilder(addressEndpointOptional.get())
+ .setChildEndpoint(childEndpoints).build();
+ t.put(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(parentAddressEndpoint.getKey()), parentAddressEndpoint);
+ }
+ }
+ }
+ }
+
+ private void updateAddressEndpointRegChilds(WriteTransaction t, AddressEndpoint endpoint) {
+ ReadTransaction readTransaction = dataProvider.newReadOnlyTransaction();
+
+ for (ChildEndpoint child : nullToEmpty(endpoint.getChildEndpoint())) {
+ Optional<AddressEndpoint> addressEndpointOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(new AddressEndpointKey(child.getAddress(),
+ child.getAddressType(), child.getContextId(), child.getContextType())),
+ readTransaction);
+
+ if (addressEndpointOptional.isPresent()) {
+ ParentEndpointCase parentEndpointCase =
+ (ParentEndpointCase) addressEndpointOptional.get().getParentEndpointChoice();
+ List<ParentEndpoint> parentEndpoints;
+
+ parentEndpoints = getParentEndpoints(parentEndpointCase);
+
+ ParentEndpoint parentEndpoint = new ParentEndpointBuilder(endpoint).build();
+ if (!parentEndpoints.contains(parentEndpoint)) {
+ parentEndpoints.add(parentEndpoint);
+ AddressEndpoint childAddressEndpoint =
+ new AddressEndpointBuilder(addressEndpointOptional.get())
+ .setParentEndpointChoice(
+ new ParentEndpointCaseBuilder().setParentEndpoint(parentEndpoints).build())
+ .build();
+ t.put(LogicalDatastoreType.OPERATIONAL,
+ IidFactory.addressEndpointIid(childAddressEndpoint.getKey()), childAddressEndpoint);
+ }
+ }
+ }
+ }
+