blob: 9647bc9bfadd25b2052e0c109b03baed3e91cf20 [file] [log] [blame]
Thomas Vachuska96d55b12015-05-11 08:52:03 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Thomas Vachuska96d55b12015-05-11 08:52:03 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Thomas Vachuska4998caa2015-08-26 13:28:38 -070016package org.onosproject.net.config.basics;
Thomas Vachuska96d55b12015-05-11 08:52:03 -070017
Charles Chand6d581a2015-11-18 16:51:08 -080018import com.fasterxml.jackson.databind.node.ArrayNode;
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020019import com.google.common.collect.ImmutableSet;
Charles Chand6d581a2015-11-18 16:51:08 -080020import org.onlab.packet.IpAddress;
21import org.onosproject.net.ConnectPoint;
Thomas Vachuska96d55b12015-05-11 08:52:03 -070022import org.onosproject.net.HostId;
Charles Chan61fc0d82017-04-28 14:13:36 -070023import org.onosproject.net.HostLocation;
Thomas Vachuska36008462016-01-07 15:38:20 -080024
Charles Chand6d581a2015-11-18 16:51:08 -080025import java.util.HashSet;
26import java.util.Set;
Thomas Vachuska96d55b12015-05-11 08:52:03 -070027
28/**
29 * Basic configuration for network end-station hosts.
30 */
Thomas Vachuska36008462016-01-07 15:38:20 -080031public final class BasicHostConfig extends BasicElementConfig<HostId> {
32
Charles Chand6d581a2015-11-18 16:51:08 -080033 private static final String IPS = "ips";
Charles Chan61fc0d82017-04-28 14:13:36 -070034 private static final String LOCATIONS = "locations";
Simon Hunt10618f62017-06-15 19:30:52 -070035 private static final String DASH = "-";
Thomas Vachuska96d55b12015-05-11 08:52:03 -070036
Charles Chand6d581a2015-11-18 16:51:08 -080037 @Override
38 public boolean isValid() {
Charles Chan60c45282017-07-11 15:07:59 -070039 // locations is mandatory and must have at least one
40 // ipAddresses can be absent, but if present must be valid
Charles Chan61fc0d82017-04-28 14:13:36 -070041 this.locations();
Thomas Vachuska36008462016-01-07 15:38:20 -080042 this.ipAddresses();
Simon Huntbc30e682017-02-15 18:39:23 -080043 return hasOnlyFields(ALLOWED, NAME, LOC_TYPE, LATITUDE, LONGITUDE,
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020044 GRID_Y, GRID_Y, UI_TYPE, RACK_ADDRESS, OWNER, IPS, LOCATIONS);
Charles Chand6d581a2015-11-18 16:51:08 -080045 }
Thomas Vachuska96d55b12015-05-11 08:52:03 -070046
Simon Hunt10618f62017-06-15 19:30:52 -070047 @Override
48 public String name() {
49 // NOTE:
50 // We don't want to default to host ID if friendly name is not set;
51 // (it isn't particularly friendly, e.g. "00:00:00:00:00:01/None").
52 // We'd prefer to clear the annotation, but if we pass null, then the
53 // value won't get set (see BasicElementOperator). So, instead we will
54 // return a DASH to signify "use the default friendly name".
55 return get(NAME, DASH);
56 }
57
Charles Chand6d581a2015-11-18 16:51:08 -080058 /**
Simon Hunt1e20dae2016-10-28 11:26:26 -070059 * Returns the location of the host.
Charles Chand6d581a2015-11-18 16:51:08 -080060 *
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020061 * @return location of the host or null if none specified
62 * @throws IllegalArgumentException if locations are set but empty or not
63 * specified with correct format
Charles Chand6d581a2015-11-18 16:51:08 -080064 */
Charles Chan61fc0d82017-04-28 14:13:36 -070065 public Set<HostLocation> locations() {
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020066 if (!object.has(LOCATIONS)) {
67 return null; //no locations are specified
Charles Chan61fc0d82017-04-28 14:13:36 -070068 }
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020069
70 ImmutableSet.Builder<HostLocation> locationsSetBuilder = ImmutableSet.<HostLocation>builder();
71
72 ArrayNode locationNodes = (ArrayNode) object.path(LOCATIONS);
73 locationNodes.forEach(n -> {
74 ConnectPoint cp = ConnectPoint.deviceConnectPoint((n.asText()));
75 locationsSetBuilder.add(new HostLocation(cp, 0));
76 });
77
78
79 Set<HostLocation> locations = locationsSetBuilder.build();
Charles Chan60c45282017-07-11 15:07:59 -070080 if (locations.isEmpty()) {
81 throw new IllegalArgumentException("Host should have at least one location");
82 }
Szymon Giermakowskif3578de2017-08-29 22:02:48 +020083
Charles Chan60c45282017-07-11 15:07:59 -070084 return locations;
Charles Chand6d581a2015-11-18 16:51:08 -080085 }
86
87 /**
88 * Sets the location of the host.
89 *
Charles Chan61fc0d82017-04-28 14:13:36 -070090 * @param locations location of the host or null to unset
Thomas Vachuska36008462016-01-07 15:38:20 -080091 * @return the config of the host
Charles Chand6d581a2015-11-18 16:51:08 -080092 */
Charles Chan61fc0d82017-04-28 14:13:36 -070093 public BasicHostConfig setLocations(Set<HostLocation> locations) {
94 return (BasicHostConfig) setOrClear(LOCATIONS, locations);
Charles Chand6d581a2015-11-18 16:51:08 -080095 }
96
97 /**
Thomas Vachuska36008462016-01-07 15:38:20 -080098 * Returns IP addresses of the host.
Charles Chand6d581a2015-11-18 16:51:08 -080099 *
Thomas Vachuska36008462016-01-07 15:38:20 -0800100 * @return IP addresses of the host or null if not set
101 * @throws IllegalArgumentException if not specified with correct format
Charles Chand6d581a2015-11-18 16:51:08 -0800102 */
103 public Set<IpAddress> ipAddresses() {
104 HashSet<IpAddress> ipAddresses = new HashSet<>();
105 if (object.has(IPS)) {
106 ArrayNode ipNodes = (ArrayNode) object.path(IPS);
Thomas Vachuska36008462016-01-07 15:38:20 -0800107 ipNodes.forEach(n -> ipAddresses.add(IpAddress.valueOf(n.asText())));
108 return ipAddresses;
Charles Chand6d581a2015-11-18 16:51:08 -0800109 }
110 return null;
111 }
112
113 /**
114 * Sets the IP addresses of the host.
115 *
Thomas Vachuska36008462016-01-07 15:38:20 -0800116 * @param ipAddresses IP addresses of the host or null to unset
117 * @return the config of the host
Charles Chand6d581a2015-11-18 16:51:08 -0800118 */
119 public BasicHostConfig setIps(Set<IpAddress> ipAddresses) {
120 return (BasicHostConfig) setOrClear(IPS, ipAddresses);
121 }
Szymon Giermakowskif3578de2017-08-29 22:02:48 +0200122}