Add INFO.yaml for GBP
[groupbasedpolicy.git] / renderers / vpp / src / test / java / org / opendaylight / groupbasedpolicy / renderer / vpp / DtoFactory.java
1 /*
2  * Copyright (c) 2016 Cisco 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.groupbasedpolicy.renderer.vpp;
9
10 import java.util.Arrays;
11 import java.util.List;
12 import java.util.stream.Collectors;
13 import java.util.stream.Stream;
14
15 import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;
16 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
17 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.VppPathMapper;
18 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainment;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainmentBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.network.containment.containment.ForwardingContextContainmentBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.IpPrefixType;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2BridgeDomain;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L2FloodDomain;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.L3Context;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.MacAddressType;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.Subnet;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.SubnetAugmentRenderer;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.SubnetAugmentRendererBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev170511.has.subnet.SubnetBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.ParentBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.EndpointPolicyParticipation;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipation;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.rule.group.with.renderer.endpoint.participation.RuleGroupWithRendererEndpointParticipationBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.Endpoints;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.EndpointsBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererEndpointsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RendererForwardingBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroups;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocationKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpoint;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenantBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContext;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererForwardingContextBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomainBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
88 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
89 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
90 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
91 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
92 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
93 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
94 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
95 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
96
97 import com.google.common.base.Strings;
98 import com.google.common.collect.ImmutableList;
99 import com.google.common.collect.Lists;
100
101 public class DtoFactory {
102
103     static IpPrefix subnetPrefix = new IpPrefix(new Ipv4Prefix("10.0.0.0/24"));
104     static IpAddress virtRouterIp = new IpAddress(new Ipv4Address("10.0.0.1"));
105
106     public static final ContextId CTX_ID = new ContextId("ctx");
107     public static final ContextId L3_CTX = new ContextId("l3ctx");
108     public static final ContextId L2BD_CTX = new ContextId("l2bd");
109     public static final ContextId L2FD_CTX = new ContextId("l2fd");
110     public static final ContractId CONTRACT_ID = new ContractId("contract");
111     public static final TenantId TENANT_ID = new TenantId("tenant");
112     public static final SubjectName SUBJECT_NAME = new SubjectName("subject");
113     public static final RuleName RULE_NAME = new RuleName("rule");
114
115     public static final Name L2_FD_ID = new Name("l2fd");
116     public static final Name L3_CTX_ID = new Name("l3ctx");
117     public static final Name L2_BD_ID = new Name("l2bd");
118     public static final Name SUBNET_ID = new Name("subnetId");
119
120     public static final RuleGroupWithRendererEndpointParticipation RULE_GROUP_WITH_CONSUMER =
121             new RuleGroupWithRendererEndpointParticipationBuilder().setContractId(CONTRACT_ID)
122                 .setTenantId(TENANT_ID)
123                 .setSubjectName(SUBJECT_NAME)
124                 .setRendererEndpointParticipation(EndpointPolicyParticipation.CONSUMER)
125                 .build();
126     public static final RuleGroupWithRendererEndpointParticipation RULE_GROUP_WITH_PROVIDER =
127             new RuleGroupWithRendererEndpointParticipationBuilder().setContractId(CONTRACT_ID)
128                 .setTenantId(TENANT_ID)
129                 .setSubjectName(SUBJECT_NAME)
130                 .setRendererEndpointParticipation(EndpointPolicyParticipation.PROVIDER)
131                 .build();
132     public final static TopologyKey TOPO_KEY = new TopologyKey(new TopologyId("topology-netconf"));
133     public final static InstanceIdentifier<Node> VPP_NODE_1_IID = InstanceIdentifier.builder(NetworkTopology.class)
134         .child(Topology.class, TOPO_KEY)
135         .child(Node.class, new NodeKey(new NodeId("node1")))
136         .build();
137     public final static InstanceIdentifier<Node> VPP_NODE_2_IID = InstanceIdentifier.builder(NetworkTopology.class)
138         .child(Topology.class, TOPO_KEY)
139         .child(Node.class, new NodeKey(new NodeId("node2")))
140         .build();
141
142     public static Configuration createConfiguration(List<AddressEndpointWithLocation> consumers,
143             List<AddressEndpointWithLocation> providers) {
144         List<AddressEndpointWithLocation> eps =
145                 Stream.concat(consumers.stream(), providers.stream()).collect(Collectors.toList());
146         Endpoints endpoints = new EndpointsBuilder().setAddressEndpointWithLocation(eps).build();
147         List<RendererEndpoint> consumersAsRendererEps = consumers.stream().map(cons -> {
148             List<PeerEndpoint> peers = providers.stream()
149                 .map(web -> new PeerEndpointBuilder().setKey(KeyFactory.peerEndpointKey(web.getKey()))
150                     .setRuleGroupWithRendererEndpointParticipation(Arrays.asList(RULE_GROUP_WITH_CONSUMER))
151                     .build())
152                 .collect(Collectors.toList());
153             return new RendererEndpointBuilder().setKey(KeyFactory.rendererEndpointKey(cons.getKey()))
154                 .setPeerEndpoint(peers)
155                 .build();
156         }).collect(Collectors.toList());
157         List<RendererEndpoint> providersAsRendererEps = providers.stream().map(prov -> {
158             List<PeerEndpoint> peers = consumers.stream()
159                 .map(client -> new PeerEndpointBuilder().setKey(KeyFactory.peerEndpointKey(client.getKey()))
160                     .setRuleGroupWithRendererEndpointParticipation(Arrays.asList(RULE_GROUP_WITH_PROVIDER))
161                     .build())
162                 .collect(Collectors.toList());
163             return new RendererEndpointBuilder().setKey(KeyFactory.rendererEndpointKey(prov.getKey()))
164                 .setPeerEndpoint(peers)
165                 .build();
166         }).collect(Collectors.toList());
167         List<RendererEndpoint> rendererEps = Stream
168             .concat(consumersAsRendererEps.stream(), providersAsRendererEps.stream()).collect(Collectors.toList());
169         return new ConfigurationBuilder().setEndpoints(endpoints)
170             .setRendererEndpoints(new RendererEndpointsBuilder().setRendererEndpoint(rendererEps).build())
171             .setRuleGroups(new RuleGroupsBuilder(createRuleGroups()).build())
172             .setRendererForwarding(new RendererForwardingBuilder()
173                 .setRendererForwardingByTenant(ImmutableList.<RendererForwardingByTenant>of(createForwarding()))
174                 .build())
175             .build();
176     }
177
178     private static RendererForwardingByTenant createForwarding() {
179         RendererForwardingContext l2Fd = createRendererForwardingCtx(L2FD_CTX, L2_FD_ID, L2FloodDomain.class)
180             .setParent(createParent(L2BD_CTX, L2BridgeDomain.class)).build();
181         RendererForwardingContext l2Bd = createRendererForwardingCtx(L3_CTX, L3_CTX_ID, L3Context.class)
182             .setParent(createParent(L3_CTX, L3Context.class)).build();
183         RendererForwardingContext l3Ctx = createRendererForwardingCtx(L2BD_CTX, L2_BD_ID, L2BridgeDomain.class).build();
184         RendererNetworkDomain subnet =
185                 new RendererNetworkDomainBuilder().setNetworkDomainId(new NetworkDomainId(SUBNET_ID.getValue()))
186                     .setName(SUBNET_ID)
187                     .setNetworkDomainType(Subnet.class)
188                     .setParent(createParent(L2FD_CTX, L2FloodDomain.class))
189                     .addAugmentation(SubnetAugmentRenderer.class,
190                             new SubnetAugmentRendererBuilder().setSubnet(new SubnetBuilder().setIpPrefix(subnetPrefix)
191                                 .setVirtualRouterIp(virtRouterIp)
192                                 .setIsTenant(true)
193                                 .build()).build())
194                     .build();
195         return new RendererForwardingByTenantBuilder().setTenantId(TENANT_ID)
196             .setRendererForwardingContext(ImmutableList.<RendererForwardingContext>of(l2Fd, l2Bd, l3Ctx))
197             .setRendererNetworkDomain(ImmutableList.<RendererNetworkDomain>of(subnet))
198             .build();
199     }
200
201     static RendererForwardingContextBuilder createRendererForwardingCtx(ContextId id, Name name,
202             Class<? extends ContextType> type) {
203         return new RendererForwardingContextBuilder().setName(name).setContextId(id).setContextType(type);
204     }
205
206     static Parent createParent(ContextId ctxId, Class<? extends ContextType> type) {
207         return new ParentBuilder().setContextId(ctxId).setContextType(type).build();
208     }
209
210     public static RuleGroups createRuleGroups() {
211         ParameterValue param = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE)
212             .setName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM))
213             .build();
214         Classifier classif = new ClassifierBuilder().setClassifierDefinitionId(EtherTypeClassifierDefinition.ID)
215             .setDirection(Direction.In)
216             .setName(new ClassifierName("cl-name"))
217             .setParameterValue(ImmutableList.<ParameterValue>of(param))
218             .build();
219         Action action = new ActionBuilder().setActionDefinitionId(AllowActionDefinition.ID)
220             .setName(new ActionName("Allow"))
221             .build();
222         ResolvedRuleBuilder rrBuilder = new ResolvedRuleBuilder();
223         rrBuilder.setClassifier(ImmutableList.<Classifier>of(classif));
224         rrBuilder.setAction(ImmutableList.<Action>of(action));
225         rrBuilder.setName(RULE_NAME);
226         rrBuilder.setOrder(0);
227         RuleGroup ruleGroup = new RuleGroupBuilder().setTenantId(TENANT_ID)
228             .setOrder(0)
229             .setSubjectName(SUBJECT_NAME)
230             .setContractId(CONTRACT_ID)
231             .setResolvedRule(ImmutableList.<ResolvedRule>of(rrBuilder.build()))
232             .build();
233         return new RuleGroupsBuilder().setRuleGroup(ImmutableList.<RuleGroup>of(ruleGroup)).build();
234     }
235
236     public static AddressEndpointWithLocation createEndpoint(String ip, String mac, String l2FdIdAsNetCont,
237             AbsoluteLocation absoluteLocation) {
238         AddressEndpointWithLocationKey key =
239                 new AddressEndpointWithLocationKey(ip, IpPrefixType.class, CTX_ID, L3Context.class);
240         NetworkContainment networkContainment =
241                 new NetworkContainmentBuilder().setContainment(new ForwardingContextContainmentBuilder()
242                     .setContextType(L2FloodDomain.class).setContextId(new ContextId(l2FdIdAsNetCont)).build()).build();
243         return new AddressEndpointWithLocationBuilder().setKey(key)
244             .setChildEndpoint(Lists.newArrayList(new ChildEndpointBuilder()
245                 .setKey(new ChildEndpointKey(mac, MacAddressType.class, L2BD_CTX, L2BridgeDomain.class)).build()))
246             .setNetworkContainment(networkContainment)
247             .setAbsoluteLocation(absoluteLocation)
248             .setTenant(new TenantId(TENANT_ID))
249             .build();
250     }
251
252     public static AbsoluteLocation absoluteLocation(InstanceIdentifier<?> mountPoint, String nodeName,
253             String nodeConnectorName) {
254         ExternalLocationCaseBuilder extLocBuilder =
255                 new ExternalLocationCaseBuilder().setExternalNodeMountPoint(mountPoint);
256         if (!Strings.isNullOrEmpty(nodeName)) {
257             extLocBuilder.setExternalNode(VppPathMapper.bridgeDomainToRestPath(nodeName));
258         }
259         if (!Strings.isNullOrEmpty(nodeConnectorName)) {
260             extLocBuilder.setExternalNodeConnector(VppPathMapper.interfaceToRestPath(nodeConnectorName));
261         }
262         return new AbsoluteLocationBuilder().setLocationType(extLocBuilder.build()).build();
263     }
264 }