Add Delayed Owner selection base on strategy
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / entityownership / EntityOwnersModel.java
1 /*
2  * Copyright (c) 2015 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore.entityownership;
9
10 import java.util.Map.Entry;
11 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.EntityOwners;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.EntityType;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.entity.type.entity.Candidate;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
20 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
24 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
25 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
26 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
27
28 /**
29  * Utility methods for entity-owners yang model.
30  *
31  * @author Thomas Pantelis
32  */
33 final class EntityOwnersModel {
34     static final  QName ENTITY_QNAME = org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.
35             md.sal.clustering.entity.owners.rev150804.entity.owners.entity.type.Entity.QNAME;
36     static final QName CANDIDATE_NAME_QNAME = QName.create(Candidate.QNAME, "name");
37     static final QName ENTITY_ID_QNAME = QName.create(ENTITY_QNAME, "id");
38     static final QName ENTITY_OWNER_QNAME = QName.create(ENTITY_QNAME, "owner");
39     static final QName ENTITY_TYPE_QNAME = QName.create(EntityType.QNAME, "type");
40
41     static final NodeIdentifier ENTITY_OWNERS_NODE_ID = new NodeIdentifier(EntityOwners.QNAME);
42     static final NodeIdentifier ENTITY_OWNER_NODE_ID = new NodeIdentifier(ENTITY_OWNER_QNAME);
43     static final NodeIdentifier ENTITY_NODE_ID = new NodeIdentifier(ENTITY_QNAME);
44     static final NodeIdentifier ENTITY_ID_NODE_ID = new NodeIdentifier(ENTITY_ID_QNAME);
45     static final NodeIdentifier ENTITY_TYPE_NODE_ID = new NodeIdentifier(ENTITY_TYPE_QNAME);
46     static final NodeIdentifier CANDIDATE_NODE_ID = new NodeIdentifier(Candidate.QNAME);
47     static final NodeIdentifier CANDIDATE_NAME_NODE_ID = new NodeIdentifier(CANDIDATE_NAME_QNAME);
48     static final YangInstanceIdentifier ENTITY_OWNERS_PATH = YangInstanceIdentifier.of(EntityOwners.QNAME);
49     static final YangInstanceIdentifier ENTITY_TYPES_PATH =
50             YangInstanceIdentifier.of(EntityOwners.QNAME).node(EntityType.QNAME);
51
52     static YangInstanceIdentifier entityPath(String entityType, YangInstanceIdentifier entityId) {
53         return YangInstanceIdentifier.builder(ENTITY_OWNERS_PATH).node(EntityType.QNAME).
54                 nodeWithKey(EntityType.QNAME, ENTITY_TYPE_QNAME, entityType).node(ENTITY_QNAME).
55                         nodeWithKey(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).build();
56
57     }
58
59     static YangInstanceIdentifier candidatePath(String entityType, YangInstanceIdentifier entityId,
60             String candidateName) {
61         return YangInstanceIdentifier.builder(ENTITY_OWNERS_PATH).node(EntityType.QNAME).
62                 nodeWithKey(EntityType.QNAME, ENTITY_TYPE_QNAME, entityType).node(ENTITY_QNAME).
63                         nodeWithKey(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).node(Candidate.QNAME).
64                                 nodeWithKey(Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName).build();
65
66     }
67
68     static YangInstanceIdentifier candidatePath(YangInstanceIdentifier entityPath, String candidateName) {
69         return YangInstanceIdentifier.builder(entityPath).node(Candidate.QNAME).nodeWithKey(
70                 Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName).build();
71     }
72
73     static NodeIdentifierWithPredicates candidateNodeKey(String candidateName) {
74         return new NodeIdentifierWithPredicates(Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName);
75     }
76
77     static NormalizedNode<?, ?> entityOwnersWithCandidate(String entityType, YangInstanceIdentifier entityId,
78             String candidateName) {
79         return entityOwnersWithEntityTypeEntry(entityTypeEntryWithEntityEntry(entityType,
80                 entityEntryWithCandidateEntry(entityId, candidateName)));
81     }
82
83     static ContainerNode entityOwnersWithEntityTypeEntry(MapEntryNode entityTypeNode) {
84         return ImmutableContainerNodeBuilder.create().withNodeIdentifier(
85                 ENTITY_OWNERS_NODE_ID).addChild(ImmutableNodes.mapNodeBuilder(EntityType.QNAME).
86                         addChild(entityTypeNode).build()).build();
87     }
88
89     static MapEntryNode entityTypeEntryWithEntityEntry(String entityType, MapEntryNode entityNode) {
90         return ImmutableNodes.mapEntryBuilder(EntityType.QNAME,
91                 ENTITY_TYPE_QNAME, entityType).addChild(ImmutableNodes.mapNodeBuilder(
92                         ENTITY_QNAME).addChild(entityNode).build()).build();
93     }
94
95     static MapEntryNode entityEntryWithCandidateEntry(YangInstanceIdentifier entityId, String candidateName) {
96         return ImmutableNodes.mapEntryBuilder(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).addChild(
97                 candidateEntry(candidateName)).build();
98     }
99
100     static MapNode candidateEntry(String candidateName) {
101         return ImmutableOrderedMapNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(Candidate.QNAME)).
102                 addChild(candidateMapEntry(candidateName)).build();
103     }
104
105     static MapEntryNode candidateMapEntry(String candidateName) {
106         return ImmutableNodes.mapEntry(Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName);
107     }
108
109     static MapEntryNode entityEntryWithOwner(YangInstanceIdentifier entityId, String owner) {
110         return ImmutableNodes.mapEntryBuilder(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).addChild(
111                 ImmutableNodes.leafNode(ENTITY_OWNER_QNAME, owner)).build();
112     }
113
114     static String entityTypeFromEntityPath(YangInstanceIdentifier entityPath){
115         YangInstanceIdentifier parent = entityPath;
116         while(!parent.isEmpty()) {
117             if (EntityType.QNAME.equals(parent.getLastPathArgument().getNodeType())) {
118                 YangInstanceIdentifier.NodeIdentifierWithPredicates entityTypeLastPathArgument = (YangInstanceIdentifier.NodeIdentifierWithPredicates) parent.getLastPathArgument();
119                 return (String) entityTypeLastPathArgument.getKeyValues().get(ENTITY_TYPE_QNAME);
120             }
121             parent = parent.getParent();
122         }
123         return null;
124     }
125
126     static Entity createEntity(YangInstanceIdentifier entityPath) {
127         String entityType = null;
128         YangInstanceIdentifier entityId = null;
129         for(PathArgument pathArg: entityPath.getPathArguments()) {
130             if(pathArg instanceof NodeIdentifierWithPredicates) {
131                 NodeIdentifierWithPredicates nodeKey = (NodeIdentifierWithPredicates) pathArg;
132                 Entry<QName, Object> key = nodeKey.getKeyValues().entrySet().iterator().next();
133                 if(ENTITY_TYPE_QNAME.equals(key.getKey())) {
134                     entityType = key.getValue().toString();
135                 } else if(ENTITY_ID_QNAME.equals(key.getKey())) {
136                     entityId = (YangInstanceIdentifier) key.getValue();
137                 }
138             }
139         }
140
141         return new Entity(entityType, entityId);
142     }
143 }