Committed by
Gerrit Code Review
Fix to update floating IP association/disassociation in OpenstackInterfaceServce
Change-Id: I04b96109296125849bc91d5bc92e476338749935
Showing
3 changed files
with
88 additions
and
4 deletions
... | @@ -15,9 +15,11 @@ | ... | @@ -15,9 +15,11 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.openstackinterface; | 16 | package org.onosproject.openstackinterface; |
17 | 17 | ||
18 | +import org.onlab.packet.Ip4Address; | ||
18 | import org.onosproject.net.Port; | 19 | import org.onosproject.net.Port; |
19 | 20 | ||
20 | import java.util.Collection; | 21 | import java.util.Collection; |
22 | +import java.util.Optional; | ||
21 | 23 | ||
22 | /** | 24 | /** |
23 | * Handles port management REST API from Openstack for VMs. | 25 | * Handles port management REST API from Openstack for VMs. |
... | @@ -49,7 +51,7 @@ public interface OpenstackInterfaceService { | ... | @@ -49,7 +51,7 @@ public interface OpenstackInterfaceService { |
49 | /** | 51 | /** |
50 | * Returns port information for the port ID given. | 52 | * Returns port information for the port ID given. |
51 | * | 53 | * |
52 | - * @param portId Port ID | 54 | + * @param portId port id |
53 | * @return port information | 55 | * @return port information |
54 | */ | 56 | */ |
55 | OpenstackPort port(String portId); | 57 | OpenstackPort port(String portId); |
... | @@ -57,7 +59,7 @@ public interface OpenstackInterfaceService { | ... | @@ -57,7 +59,7 @@ public interface OpenstackInterfaceService { |
57 | /** | 59 | /** |
58 | * Returns network information list for the network ID given. | 60 | * Returns network information list for the network ID given. |
59 | * | 61 | * |
60 | - * @param networkId Network ID | 62 | + * @param networkId network id |
61 | * @return network information, or null if not present | 63 | * @return network information, or null if not present |
62 | */ | 64 | */ |
63 | OpenstackNetwork network(String networkId); | 65 | OpenstackNetwork network(String networkId); |
... | @@ -72,7 +74,7 @@ public interface OpenstackInterfaceService { | ... | @@ -72,7 +74,7 @@ public interface OpenstackInterfaceService { |
72 | /** | 74 | /** |
73 | * Returns subnet information for the subnet ID give. | 75 | * Returns subnet information for the subnet ID give. |
74 | * | 76 | * |
75 | - * @param subnetId Subnet ID | 77 | + * @param subnetId subnet id |
76 | * @return subnet information, or null if not present | 78 | * @return subnet information, or null if not present |
77 | */ | 79 | */ |
78 | OpenstackSubnet subnet(String subnetId); | 80 | OpenstackSubnet subnet(String subnetId); |
... | @@ -94,7 +96,7 @@ public interface OpenstackInterfaceService { | ... | @@ -94,7 +96,7 @@ public interface OpenstackInterfaceService { |
94 | /** | 96 | /** |
95 | * Returns the router information for the router ID given. | 97 | * Returns the router information for the router ID given. |
96 | * | 98 | * |
97 | - * @param routerId router ID | 99 | + * @param routerId router id |
98 | * @return router information | 100 | * @return router information |
99 | */ | 101 | */ |
100 | OpenstackRouter router(String routerId); | 102 | OpenstackRouter router(String routerId); |
... | @@ -114,6 +116,16 @@ public interface OpenstackInterfaceService { | ... | @@ -114,6 +116,16 @@ public interface OpenstackInterfaceService { |
114 | */ | 116 | */ |
115 | Collection<OpenstackFloatingIP> floatingIps(); | 117 | Collection<OpenstackFloatingIP> floatingIps(); |
116 | 118 | ||
119 | + /** | ||
120 | + * Updates a floating IP and its association with an internal port. | ||
121 | + * | ||
122 | + * @param id floating ip id | ||
123 | + * @param portId port id | ||
124 | + * @param fixedIpAddress fixed ip address of the port | ||
125 | + * @return true if the update succeed | ||
126 | + */ | ||
127 | + boolean updateFloatingIp(String id, String portId, Optional<Ip4Address> fixedIpAddress); | ||
128 | + | ||
117 | 129 | ||
118 | 130 | ||
119 | } | 131 | } | ... | ... |
... | @@ -83,5 +83,10 @@ | ... | @@ -83,5 +83,10 @@ |
83 | <groupId>org.onosproject</groupId> | 83 | <groupId>org.onosproject</groupId> |
84 | <artifactId>onlab-misc</artifactId> | 84 | <artifactId>onlab-misc</artifactId> |
85 | </dependency> | 85 | </dependency> |
86 | + <dependency> | ||
87 | + <groupId>commons-io</groupId> | ||
88 | + <artifactId>commons-io</artifactId> | ||
89 | + <version>2.4</version> | ||
90 | + </dependency> | ||
86 | </dependencies> | 91 | </dependencies> |
87 | </project> | 92 | </project> | ... | ... |
... | @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; | ... | @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; |
21 | import com.google.common.base.Strings; | 21 | import com.google.common.base.Strings; |
22 | import com.google.common.collect.ImmutableSet; | 22 | import com.google.common.collect.ImmutableSet; |
23 | import com.google.common.collect.Lists; | 23 | import com.google.common.collect.Lists; |
24 | +import org.apache.commons.io.IOUtils; | ||
24 | import org.apache.felix.scr.annotations.Activate; | 25 | import org.apache.felix.scr.annotations.Activate; |
25 | import org.apache.felix.scr.annotations.Component; | 26 | import org.apache.felix.scr.annotations.Component; |
26 | import org.apache.felix.scr.annotations.Deactivate; | 27 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -28,6 +29,7 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -28,6 +29,7 @@ import org.apache.felix.scr.annotations.Reference; |
28 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
29 | import org.apache.felix.scr.annotations.Service; | 30 | import org.apache.felix.scr.annotations.Service; |
30 | import org.glassfish.jersey.client.ClientProperties; | 31 | import org.glassfish.jersey.client.ClientProperties; |
32 | +import org.onlab.packet.Ip4Address; | ||
31 | import org.onosproject.core.ApplicationId; | 33 | import org.onosproject.core.ApplicationId; |
32 | import org.onosproject.core.CoreService; | 34 | import org.onosproject.core.CoreService; |
33 | import org.onosproject.net.Port; | 35 | import org.onosproject.net.Port; |
... | @@ -57,7 +59,11 @@ import javax.ws.rs.client.Entity; | ... | @@ -57,7 +59,11 @@ import javax.ws.rs.client.Entity; |
57 | import javax.ws.rs.client.Invocation; | 59 | import javax.ws.rs.client.Invocation; |
58 | import javax.ws.rs.client.WebTarget; | 60 | import javax.ws.rs.client.WebTarget; |
59 | import javax.ws.rs.core.MediaType; | 61 | import javax.ws.rs.core.MediaType; |
62 | +import javax.ws.rs.core.Response; | ||
63 | +import java.io.ByteArrayInputStream; | ||
60 | import java.io.IOException; | 64 | import java.io.IOException; |
65 | +import java.io.InputStream; | ||
66 | +import java.nio.charset.StandardCharsets; | ||
61 | import java.text.ParseException; | 67 | import java.text.ParseException; |
62 | import java.text.SimpleDateFormat; | 68 | import java.text.SimpleDateFormat; |
63 | import java.util.Calendar; | 69 | import java.util.Calendar; |
... | @@ -65,6 +71,7 @@ import java.util.Collection; | ... | @@ -65,6 +71,7 @@ import java.util.Collection; |
65 | import java.util.Collections; | 71 | import java.util.Collections; |
66 | import java.util.Date; | 72 | import java.util.Date; |
67 | import java.util.List; | 73 | import java.util.List; |
74 | +import java.util.Optional; | ||
68 | import java.util.Set; | 75 | import java.util.Set; |
69 | import java.util.concurrent.ExecutorService; | 76 | import java.util.concurrent.ExecutorService; |
70 | import java.util.concurrent.Executors; | 77 | import java.util.concurrent.Executors; |
... | @@ -91,6 +98,9 @@ public class OpenstackInterfaceManager implements OpenstackInterfaceService { | ... | @@ -91,6 +98,9 @@ public class OpenstackInterfaceManager implements OpenstackInterfaceService { |
91 | private static final String URI_SECURITY_GROUPS = "security-groups"; | 98 | private static final String URI_SECURITY_GROUPS = "security-groups"; |
92 | private static final String URI_FLOATINGIPS = "floatingips"; | 99 | private static final String URI_FLOATINGIPS = "floatingips"; |
93 | private static final String URI_TOKENS = "tokens"; | 100 | private static final String URI_TOKENS = "tokens"; |
101 | + private static final String FLOATINGIP = "floatingip"; | ||
102 | + private static final String PORT_ID = "port_id"; | ||
103 | + private static final String FIXED_IP_ADDRESS = "fixed_ip_address"; | ||
94 | 104 | ||
95 | private static final String PATH_ROUTERS = "routers"; | 105 | private static final String PATH_ROUTERS = "routers"; |
96 | private static final String PATH_NETWORKS = "networks"; | 106 | private static final String PATH_NETWORKS = "networks"; |
... | @@ -485,6 +495,63 @@ public class OpenstackInterfaceManager implements OpenstackInterfaceService { | ... | @@ -485,6 +495,63 @@ public class OpenstackInterfaceManager implements OpenstackInterfaceService { |
485 | return openstackFloatingIPs; | 495 | return openstackFloatingIPs; |
486 | } | 496 | } |
487 | 497 | ||
498 | + @Override | ||
499 | + public boolean updateFloatingIp(String id, String portId, Optional<Ip4Address> fixedIpAddress) { | ||
500 | + Invocation.Builder builder = getClientBuilder(neutronUrl, URI_FLOATINGIPS + "/" + id); | ||
501 | + | ||
502 | + if (builder == null || (portId != null && !fixedIpAddress.isPresent())) { | ||
503 | + log.warn("Failed to update floating IP"); | ||
504 | + return false; | ||
505 | + } | ||
506 | + | ||
507 | + ObjectNode objectNode = createFloatingIpObject(portId, fixedIpAddress); | ||
508 | + | ||
509 | + InputStream inputStream = new ByteArrayInputStream(objectNode.toString().getBytes()); | ||
510 | + | ||
511 | + try { | ||
512 | + Response response = builder.header(HEADER_AUTH_TOKEN, getToken()) | ||
513 | + .put(Entity.entity(IOUtils.toString(inputStream, StandardCharsets.UTF_8), | ||
514 | + MediaType.APPLICATION_JSON)); | ||
515 | + log.debug("updateFloatingIp called: {}, status: {}", response.readEntity(String.class), | ||
516 | + String.valueOf(response.getStatus())); | ||
517 | + | ||
518 | + return checkReply(response); | ||
519 | + } catch (IOException e) { | ||
520 | + log.error("Cannot do PUT {} request"); | ||
521 | + return false; | ||
522 | + } | ||
523 | + } | ||
524 | + | ||
525 | + private ObjectNode createFloatingIpObject(String portId, Optional<Ip4Address> fixedIpAddress) { | ||
526 | + ObjectMapper mapper = new ObjectMapper(); | ||
527 | + ObjectNode objectNode = mapper.createObjectNode(); | ||
528 | + | ||
529 | + objectNode.putObject(FLOATINGIP) | ||
530 | + .put(PORT_ID, portId); | ||
531 | + | ||
532 | + if (portId != null) { | ||
533 | + objectNode.put(FIXED_IP_ADDRESS, fixedIpAddress.get().toString()); | ||
534 | + } | ||
535 | + | ||
536 | + return objectNode; | ||
537 | + } | ||
538 | + | ||
539 | + private boolean checkReply(Response response) { | ||
540 | + if (response != null) { | ||
541 | + return checkStatusCode(response.getStatus()); | ||
542 | + } | ||
543 | + | ||
544 | + log.warn("Null floating IP response from openstack"); | ||
545 | + return false; | ||
546 | + } | ||
547 | + | ||
548 | + private boolean checkStatusCode(int statusCode) { | ||
549 | + if (statusCode == Response.Status.OK.getStatusCode()) { | ||
550 | + return true; | ||
551 | + } | ||
552 | + | ||
553 | + return false; | ||
554 | + } | ||
488 | private void configureNetwork() { | 555 | private void configureNetwork() { |
489 | OpenstackInterfaceConfig cfg = | 556 | OpenstackInterfaceConfig cfg = |
490 | cfgService.getConfig(appId, OpenstackInterfaceConfig.class); | 557 | cfgService.getConfig(appId, OpenstackInterfaceConfig.class); | ... | ... |
-
Please register or login to post a comment