blob: 48a3e52a3fb63f92646092874e5a28ee88fcaed6 [file] [log] [blame]
samanwita palf28207b2015-09-04 10:41:56 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
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 */
16package org.onosproject.dhcp;
17
18import com.google.common.base.MoreObjects;
19import org.onlab.packet.Ip4Address;
20
21import java.util.Date;
22
23import static com.google.common.base.Preconditions.checkNotNull;
24
25/**
26 * Stores the MAC ID to IP Address mapping details.
27 */
28public final class IPAssignment {
29
30 private final Ip4Address ipAddress;
31
32 private final Date timestamp;
33
34 private final long leasePeriod;
35
36 private final AssignmentStatus assignmentStatus;
37
38 public enum AssignmentStatus {
39 /**
40 * IP has been requested by a host, but not assigned to it yet.
41 */
42 Option_Requested,
43
44 /**
45 * IP has been assigned to a host.
46 */
47 Option_Assigned,
48
49 /**
50 * IP mapping is no longer active.
51 */
52 Option_Expired;
53 }
54
55 /**
56 * Constructor for IPAssignment, where the ipAddress, the lease period, the timestamp
57 * and assignment status is supplied.
58 *
59 * @param ipAddress
60 * @param leasePeriod
61 * @param assignmentStatus
62 */
63 private IPAssignment(Ip4Address ipAddress,
64 long leasePeriod,
65 Date timestamp,
66 AssignmentStatus assignmentStatus) {
67 this.ipAddress = ipAddress;
68 this.leasePeriod = leasePeriod;
69 this.timestamp = timestamp;
70 this.assignmentStatus = assignmentStatus;
71 }
72
73 /**
74 * Returns the IP Address of the IP assignment.
75 *
76 * @return the IP address
77 */
78 public Ip4Address ipAddress() {
79 return this.ipAddress;
80 }
81
82 /**
83 * Returns the timestamp of the IP assignment.
84 *
85 * @return the timestamp
86 */
87 public Date timestamp() {
88 return this.timestamp;
89 }
90
91 /**
92 * Returns the assignment status of the IP assignment.
93 *
94 * @return the assignment status
95 */
96 public AssignmentStatus assignmentStatus() {
97 return this.assignmentStatus;
98 }
99
100 /**
101 * Returns the lease period of the IP assignment.
102 *
103 * @return the lease period
104 */
105 public int leasePeriod() {
106 return (int) this.leasePeriod / 1000;
107 }
108
109 @Override
110 public String toString() {
111 return MoreObjects.toStringHelper(getClass())
112 .add("ip", ipAddress)
113 .add("timestamp", timestamp)
114 .add("lease", leasePeriod)
115 .add("assignmentStatus", assignmentStatus)
116 .toString();
117 }
118
119 /**
120 * Creates and returns a new builder instance.
121 *
122 * @return new builder
123 */
124 public static Builder builder() {
125 return new Builder();
126 }
127
128 /**
129 * Creates and returns a new builder instance that clones an existing IPAssignment.
130 *
131 * @return new builder
132 */
133 public static Builder builder(IPAssignment assignment) {
134 return new Builder(assignment);
135 }
136
137 /**
138 * IPAssignment Builder.
139 */
140 public static final class Builder {
141
142 private Ip4Address ipAddress;
143
144 private Date timeStamp;
145
146 private long leasePeriod;
147
148 private AssignmentStatus assignmentStatus;
149
150 private Builder() {
151
152 }
153
154 private Builder(IPAssignment ipAssignment) {
155 ipAddress = ipAssignment.ipAddress();
156 timeStamp = ipAssignment.timestamp();
157 leasePeriod = ipAssignment.leasePeriod() * 1000;
158 assignmentStatus = ipAssignment.assignmentStatus();
159 }
160
161 public IPAssignment build() {
162 validateInputs();
163 return new IPAssignment(ipAddress,
164 leasePeriod,
165 timeStamp,
166 assignmentStatus);
167 }
168
169 public Builder ipAddress(Ip4Address addr) {
170 ipAddress = addr;
171 return this;
172 }
173
174 public Builder timestamp(Date timestamp) {
175 timeStamp = timestamp;
176 return this;
177 }
178
179 public Builder leasePeriod(int leasePeriodinSeconds) {
180 leasePeriod = leasePeriodinSeconds * 1000;
181 return this;
182 }
183
184 public Builder assignmentStatus(AssignmentStatus status) {
185 assignmentStatus = status;
186 return this;
187 }
188
189 private void validateInputs() {
190 checkNotNull(ipAddress, "IP Address must be specified");
191 checkNotNull(assignmentStatus, "Assignment Status must be specified");
192 checkNotNull(leasePeriod, "Lease Period must be specified");
193 checkNotNull(timeStamp, "Timestamp must be specified");
194
195 switch (assignmentStatus) {
196 case Option_Requested:
197 case Option_Assigned:
198 case Option_Expired:
199 break;
200 default:
201 throw new IllegalStateException("Unknown assignment status");
202 }
203 }
204 }
205}