diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java index c7fc41773f..9f928cd010 100644 --- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java +++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java @@ -392,6 +392,29 @@ public class OpenstackMetadataProxyHandler { return ethReply; } + /** + * Obtains the metadata path. + * + * @param uri metadata request URI + * @return full metadata path + */ + private String getMetadataPath(String uri) { + OpenstackNode controller = osNodeService.completeNodes(CONTROLLER). + stream().findFirst().orElse(null); + if (controller == null) { + return null; + } + + String novaMetadataIpTmp = controller.neutronConfig().novaMetadataIp(); + String novaMetadataIp = novaMetadataIpTmp != null + ? novaMetadataIpTmp : controller.managementIp().toString(); + Integer novaMetadataPortTmp = controller.neutronConfig().novaMetadataPort(); + int novaMetadataPort = novaMetadataPortTmp != null + ? novaMetadataPortTmp : METADATA_SERVER_PORT; + + return HTTP_PREFIX + novaMetadataIp + COLON + novaMetadataPort + uri; + } + /** * Proxyies HTTP request. * @@ -403,15 +426,7 @@ public class OpenstackMetadataProxyHandler { InstancePort instPort) { CloseableHttpClient client = HttpClientBuilder.create().build(); - OpenstackNode controller = osNodeService.completeNodes(CONTROLLER). - stream().findFirst().orElse(null); - if (controller == null) { - return null; - } - - String path = oldRequest.getRequestLine().getUri(); - String url = HTTP_PREFIX + controller.managementIp().toString() + - COLON + METADATA_SERVER_PORT + path; + String url = getMetadataPath(oldRequest.getRequestLine().getUri()); if (StringUtils.isEmpty(url)) { log.warn("The metadata endpoint is not configured!"); diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java index acb5a3dc68..0dc1eeab8e 100644 --- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java +++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java @@ -29,12 +29,19 @@ public final class DefaultNeutronConfig implements NeutronConfig { private final boolean useMetadataProxy; private final String metadataProxySecret; + private final String novaMetadataIp; + private final Integer novaMetadataPort; private static final String NOT_NULL_MSG = "% cannot be null"; - private DefaultNeutronConfig(boolean useMetadataProxy, String metadataProxySecret) { + private DefaultNeutronConfig(boolean useMetadataProxy, + String metadataProxySecret, + String novaMetadataIp, + Integer novaMetadataPort) { this.useMetadataProxy = useMetadataProxy; this.metadataProxySecret = metadataProxySecret; + this.novaMetadataIp = novaMetadataIp; + this.novaMetadataPort = novaMetadataPort; } @Override @@ -47,6 +54,16 @@ public final class DefaultNeutronConfig implements NeutronConfig { return metadataProxySecret; } + @Override + public String novaMetadataIp() { + return novaMetadataIp; + } + + @Override + public Integer novaMetadataPort() { + return novaMetadataPort; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -56,7 +73,9 @@ public final class DefaultNeutronConfig implements NeutronConfig { if (o instanceof DefaultNeutronConfig) { DefaultNeutronConfig that = (DefaultNeutronConfig) o; return Objects.equals(useMetadataProxy, that.useMetadataProxy) && - Objects.equals(metadataProxySecret, that.metadataProxySecret); + Objects.equals(metadataProxySecret, that.metadataProxySecret) && + Objects.equals(novaMetadataIp, that.novaMetadataIp) && + Objects.equals(novaMetadataPort, that.novaMetadataPort); } return false; } @@ -64,7 +83,8 @@ public final class DefaultNeutronConfig implements NeutronConfig { @Override public int hashCode() { - return Objects.hash(useMetadataProxy, metadataProxySecret); + return Objects.hash(useMetadataProxy, metadataProxySecret, + novaMetadataIp, novaMetadataPort); } @Override @@ -72,6 +92,8 @@ public final class DefaultNeutronConfig implements NeutronConfig { return MoreObjects.toStringHelper(this) .add("useMetadataProxy", useMetadataProxy) .add("metadataProxySecret", metadataProxySecret) + .add("novaMetadataIp", novaMetadataIp) + .add("novaMetadataPort", novaMetadataPort) .toString(); } @@ -91,6 +113,9 @@ public final class DefaultNeutronConfig implements NeutronConfig { private boolean useMetadataProxy; private String metadataProxySecret; + private String novaMetadataIp; + private Integer novaMetadataPort; + // private constructor not intended to use from external private Builder() { @@ -101,7 +126,8 @@ public final class DefaultNeutronConfig implements NeutronConfig { checkArgument(metadataProxySecret != null, NOT_NULL_MSG, "metadataProxySecret"); - return new DefaultNeutronConfig(useMetadataProxy, metadataProxySecret); + return new DefaultNeutronConfig(useMetadataProxy, metadataProxySecret, + novaMetadataIp, novaMetadataPort); } @Override @@ -115,5 +141,17 @@ public final class DefaultNeutronConfig implements NeutronConfig { this.metadataProxySecret = metadataProxySecret; return this; } + + @Override + public NeutronConfig.Builder novaMetadataIp(String novaMetadataIp) { + this.novaMetadataIp = novaMetadataIp; + return this; + } + + @Override + public NeutronConfig.Builder novaMetadataPort(Integer novaMetadataPort) { + this.novaMetadataPort = novaMetadataPort; + return this; + } } } diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java index 86ea2a9f7c..e5e9cd4d6b 100644 --- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java +++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java @@ -36,6 +36,20 @@ public interface NeutronConfig { */ String metadataProxySecret(); + /** + * Returns NOVA metadata IP address. + * + * @return NOVA metadata IP address + */ + String novaMetadataIp(); + + /** + * Returns NOVA metadata port number. + * + * @return NOVA metadata port number + */ + Integer novaMetadataPort(); + /** * Builder of neutron config. */ @@ -63,5 +77,21 @@ public interface NeutronConfig { * @return neutron config builder */ Builder metadataProxySecret(String metadataProxySecret); + + /** + * Returns neutron config with supplied NOVA metadata IP address. + * + * @param novaMetadataIp NOVA metadata IP address + * @return neutron config builder + */ + Builder novaMetadataIp(String novaMetadataIp); + + /** + * Returns neutron config with supplied NOVA metadata port number. + * + * @param novaMetadataPort NOVA metadata port number + * @return neutron config builder + */ + Builder novaMetadataPort(Integer novaMetadataPort); } } diff --git a/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/DefaultNeutronConfigTest.java b/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/DefaultNeutronConfigTest.java index 63c3833c67..49369b758a 100644 --- a/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/DefaultNeutronConfigTest.java +++ b/apps/openstacknode/api/src/test/java/org/onosproject/openstacknode/api/DefaultNeutronConfigTest.java @@ -33,6 +33,12 @@ public class DefaultNeutronConfigTest { private static final String METADATA_PROXY_SECRET_1 = "onos"; private static final String METADATA_PROXY_SECRET_2 = "cord"; + private static final String NOVA_METADATA_IP_1 = "10.10.10.1"; + private static final String NOVA_METADATA_IP_2 = "20.20.20.2"; + + private static final Integer NOVA_METADATA_PORT_1 = 8775; + private static final Integer NOVA_METADATA_PORT_2 = 8776; + private NeutronConfig config1; private NeutronConfig sameAsConfig1; private NeutronConfig config2; @@ -53,16 +59,22 @@ public class DefaultNeutronConfigTest { config1 = DefaultNeutronConfig.builder() .useMetadataProxy(USE_METADATA_PROXY_1) .metadataProxySecret(METADATA_PROXY_SECRET_1) + .novaMetadataIp(NOVA_METADATA_IP_1) + .novaMetadataPort(NOVA_METADATA_PORT_1) .build(); sameAsConfig1 = DefaultNeutronConfig.builder() .useMetadataProxy(USE_METADATA_PROXY_1) .metadataProxySecret(METADATA_PROXY_SECRET_1) + .novaMetadataIp(NOVA_METADATA_IP_1) + .novaMetadataPort(NOVA_METADATA_PORT_1) .build(); config2 = DefaultNeutronConfig.builder() .useMetadataProxy(USE_METADATA_PROXY_2) .metadataProxySecret(METADATA_PROXY_SECRET_2) + .novaMetadataIp(NOVA_METADATA_IP_2) + .novaMetadataPort(NOVA_METADATA_PORT_2) .build(); } @@ -85,5 +97,7 @@ public class DefaultNeutronConfigTest { assertEquals(config.useMetadataProxy(), USE_METADATA_PROXY_1); assertEquals(config.metadataProxySecret(), METADATA_PROXY_SECRET_1); + assertEquals(config.novaMetadataIp(), NOVA_METADATA_IP_1); + assertEquals(config.novaMetadataPort(), NOVA_METADATA_PORT_1); } } diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/NeutronConfigCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/NeutronConfigCodec.java index 5acf1800ad..48ca3ac92e 100644 --- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/NeutronConfigCodec.java +++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/NeutronConfigCodec.java @@ -16,11 +16,12 @@ package org.onosproject.openstacknode.codec; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.onosproject.codec.CodecContext; import org.onosproject.codec.JsonCodec; -import org.onosproject.openstacknode.api.NeutronConfig; import org.onosproject.openstacknode.api.DefaultNeutronConfig; +import org.onosproject.openstacknode.api.NeutronConfig; import static org.onlab.util.Tools.nullIsIllegal; @@ -31,14 +32,26 @@ public final class NeutronConfigCodec extends JsonCodec { private static final String USE_METADATA_PROXY = "useMetadataProxy"; private static final String METADATA_PROXY_SECRET = "metadataProxySecret"; + private static final String NOVA_METADATA_IP = "novaMetadataIp"; + private static final String NOVA_METADATA_PORT = "novaMetadataPort"; - private static final String MISSING_MESSAGE = " is required in OpenstackNode"; + private static final String MISSING_MESSAGE = " is required in NeutronConfig"; @Override public ObjectNode encode(NeutronConfig entity, CodecContext context) { - return context.mapper().createObjectNode() - .put(USE_METADATA_PROXY, entity.useMetadataProxy()) + ObjectNode node = context.mapper().createObjectNode(); + node.put(USE_METADATA_PROXY, entity.useMetadataProxy()) .put(METADATA_PROXY_SECRET, entity.metadataProxySecret()); + + if (entity.novaMetadataIp() != null) { + node.put(NOVA_METADATA_IP, entity.novaMetadataIp()); + } + + if (entity.novaMetadataPort() != null) { + node.put(NOVA_METADATA_PORT, entity.novaMetadataPort()); + } + + return node; } @Override @@ -53,9 +66,22 @@ public final class NeutronConfigCodec extends JsonCodec { String metadataProxySecret = nullIsIllegal(json.get(METADATA_PROXY_SECRET).asText(), METADATA_PROXY_SECRET + MISSING_MESSAGE); - return DefaultNeutronConfig.builder() + NeutronConfig.Builder builder = DefaultNeutronConfig.builder() .useMetadataProxy(useMetadataProxy) - .metadataProxySecret(metadataProxySecret) - .build(); + .metadataProxySecret(metadataProxySecret); + + JsonNode novaMetadataIp = json.get(NOVA_METADATA_IP); + + if (novaMetadataIp != null) { + builder.novaMetadataIp(novaMetadataIp.asText()); + } + + JsonNode novaMetadataPort = json.get(NOVA_METADATA_PORT); + + if (novaMetadataPort != null) { + builder.novaMetadataPort(novaMetadataPort.asInt()); + } + + return builder.build(); } } diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/NeutronConfigJsonMatcher.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/NeutronConfigJsonMatcher.java index 185c7b61da..de06f6b919 100644 --- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/NeutronConfigJsonMatcher.java +++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/NeutronConfigJsonMatcher.java @@ -29,6 +29,8 @@ public final class NeutronConfigJsonMatcher extends TypeSafeDiagnosingMatcher