You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2016/12/17 11:53:43 UTC
[04/17] camel git commit: CAMEL-9748: camel-openstack neutron
CAMEL-9748: camel-openstack neutron
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/2847e099
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2847e099
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2847e099
Branch: refs/heads/master
Commit: 2847e0998bd9e84a796c193405f2acc329ea9921
Parents: 8780c09
Author: Jan Bouska <jb...@redhat.com>
Authored: Fri Nov 18 19:22:50 2016 +0100
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Sat Dec 17 12:25:13 2016 +0100
----------------------------------------------------------------------
.../openstack/neutron/NeutronComponent.java | 33 +++
.../openstack/neutron/NeutronConstants.java | 56 +++++
.../openstack/neutron/NeutronEndpoint.java | 161 ++++++++++++++
.../neutron/producer/NetworkProducer.java | 124 +++++++++++
.../neutron/producer/PortProducer.java | 125 +++++++++++
.../neutron/producer/RouterProducer.java | 147 ++++++++++++
.../neutron/producer/SubnetProducer.java | 113 ++++++++++
.../apache/camel/component/openstack-neutron | 1 +
.../openstack/neutron/NetworkProducerTest.java | 148 +++++++++++++
.../neutron/NeutronProducerTestSupport.java | 60 +++++
.../openstack/neutron/PortProducerTest.java | 174 +++++++++++++++
.../openstack/neutron/RouterProducerTest.java | 221 +++++++++++++++++++
.../openstack/neutron/SubnetProducerTest.java | 143 ++++++++++++
13 files changed, 1506 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronComponent.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronComponent.java
new file mode 100644
index 0000000..e96865f
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronComponent.java
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+import java.util.Map;
+
+public class NeutronComponent extends DefaultComponent {
+
+ @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+ NeutronEndpoint endpoint = new NeutronEndpoint(uri, this);
+ setProperties(endpoint, parameters);
+ endpoint.setHost(remaining);
+ return endpoint;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronConstants.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronConstants.java
new file mode 100644
index 0000000..93360ce
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronConstants.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import org.apache.camel.component.openstack.common.OpenstackConstants;
+
+public final class NeutronConstants extends OpenstackConstants{
+
+ public static final String NEUTRON_NETWORK_SUBSYSTEM = "networks";
+ public static final String NEUTRON_SUBNETS_SYSTEM = "subnets";
+ public static final String NEUTRON_PORT_SYSTEM = "ports";
+ public static final String NEUTRON_ROUTER_SYSTEM = "routers";
+ public static final String TENANT_ID = "tenantId";
+ public static final String NETWORK_ID = "networkId";
+
+ //network
+ public static final String ADMIN_STATE_UP = "adminStateUp";
+ public static final String NETWORK_TYPE = "networkType";
+ public static final String PHYSICAL_NETWORK = "physicalNetwork";
+ public static final String SEGMENT_ID = "segmentId";
+ public static final String IS_SHARED = "isShared";
+ public static final String IS_ROUTER_EXTERNAL = "isRouterExternal";
+
+ //subnet
+ public static final String ENABLE_DHCP = "enableDHCP";
+ public static final String GATEWAY = "gateway";
+
+ //port
+ public static final String DEVICE_ID = "deviceId";
+ public static final String MAC_ADDRESS = "macAddress";
+
+ //router
+ public static final String ROUTER_ID = "routerId";
+ public static final String SUBNET_ID = "subnetId";
+ public static final String PORT_ID = "portId";
+ public static final String ITERFACE_TYPE = "interfaceType";
+
+ public static final String ATTACH_INTERFACE = "attachInterface";
+ public static final String DETACH_INTERFACE = "detachInterface";
+
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
new file mode 100644
index 0000000..44d5b84
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/NeutronEndpoint.java
@@ -0,0 +1,161 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import org.apache.camel.Producer;
+import org.apache.camel.component.openstack.common.AbstractOpenstackEndpoint;
+import org.apache.camel.component.openstack.neutron.producer.NetworkProducer;
+import org.apache.camel.component.openstack.neutron.producer.PortProducer;
+import org.apache.camel.component.openstack.neutron.producer.RouterProducer;
+import org.apache.camel.component.openstack.neutron.producer.SubnetProducer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+
+@UriEndpoint(scheme = "openstack-neutron", title = "OpenStack-Neutron", syntax = "openstack-neutron:host", label = "cloud")
+public class NeutronEndpoint extends AbstractOpenstackEndpoint {
+
+ @UriPath
+ @Metadata(required = "true")
+ private String host;
+
+ @UriParam(enums = "networks, subnets, ports, routers")
+ @Metadata(required = "true")
+ String subsystem;
+
+ @UriParam(defaultValue = "default")
+ private String domain = "default";
+
+ @UriParam
+ @Metadata(required = "true")
+ private String project;
+
+ @UriParam
+ private String operation;
+
+ @UriParam
+ @Metadata(required = "true")
+ private String username;
+
+ @UriParam
+ @Metadata(required = "true")
+ private String password;
+
+ public NeutronEndpoint(String uri, NeutronComponent component) {
+ super(uri, component);
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ switch (getSubsystem()) {
+ case NeutronConstants.NEUTRON_NETWORK_SUBSYSTEM:
+ return new NetworkProducer(this, createClient());
+ case NeutronConstants.NEUTRON_SUBNETS_SYSTEM:
+ return new SubnetProducer(this, createClient());
+ case NeutronConstants.NEUTRON_PORT_SYSTEM:
+ return new PortProducer(this, createClient());
+ case NeutronConstants.NEUTRON_ROUTER_SYSTEM:
+ return new RouterProducer(this, createClient());
+ default:
+ throw new IllegalArgumentException("Can't create producer with subsystem " + subsystem);
+ }
+ }
+
+ public String getSubsystem() {
+ return subsystem;
+ }
+
+ /**
+ * OpenStack Nova subsystem
+ */
+ public void setSubsystem(String subsystem) {
+ this.subsystem = subsystem;
+ }
+
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Authentication domain
+ */
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ @Override
+ public String getProject() {
+ return project;
+ }
+
+ /**
+ * The project ID
+ */
+ public void setProject(String project) {
+ this.project = project;
+ }
+
+ @Override
+ public String getOperation() {
+ return operation;
+ }
+
+ /**
+ * The operation to do
+ */
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
+
+ @Override
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * OpenStack username
+ */
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ @Override
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * OpenStack password
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ @Override
+ public String getHost() {
+ return host;
+ }
+
+ /**
+ * OpenStack host url
+ */
+ public void setHost(String host) {
+ this.host = host;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/NetworkProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/NetworkProducer.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/NetworkProducer.java
new file mode 100644
index 0000000..6e58c7f
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/NetworkProducer.java
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron.producer;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.openstack.common.AbstractOpenstackProducer;
+import org.apache.camel.component.openstack.neutron.NeutronConstants;
+import org.apache.camel.component.openstack.neutron.NeutronEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import org.openstack4j.api.Builders;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.Network;
+import org.openstack4j.model.network.NetworkType;
+import org.openstack4j.model.network.builder.NetworkBuilder;
+
+import java.util.List;
+import java.util.Map;
+
+public class NetworkProducer extends AbstractOpenstackProducer {
+
+ public NetworkProducer(NeutronEndpoint endpoint, OSClient client) {
+ super(endpoint, client);
+ }
+
+ @Override public void process(Exchange exchange) throws Exception {
+ final String operation = getOperation(exchange);
+ switch (operation) {
+ case NeutronConstants.CREATE:
+ doCreate(exchange);
+ break;
+ case NeutronConstants.GET:
+ doGet(exchange);
+ break;
+ case NeutronConstants.GET_ALL:
+ doGetAll(exchange);
+ break;
+ case NeutronConstants.DELETE:
+ doDelete(exchange);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported operation " + operation);
+ }
+ }
+
+ private void doCreate(Exchange exchange) {
+ final Network in = messageToNetwork(exchange.getIn());
+ final Network out = os.networking().network().create(in);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGet(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.NETWORK_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Network ID");
+ final Network out = os.networking().network().get(id);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGetAll(Exchange exchange) {
+ final List<? extends Network> out = os.networking().network().list();
+ exchange.getIn().setBody(out);
+ }
+
+ private void doDelete(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.NETWORK_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Network ID");
+ final ActionResponse response = os.networking().network().delete(id);
+ checkFailure(response, msg, "Delete network" + id);
+ }
+
+ private Network messageToNetwork(Message message) {
+ Network network = message.getBody(Network.class);
+ if(network == null) {
+ Map headers = message.getHeaders();
+ NetworkBuilder builder = Builders.network();
+
+ ObjectHelper.notEmpty(message.getHeader(NeutronConstants.NAME, String.class), "Name");
+ builder.name(message.getHeader(NeutronConstants.NAME, String.class));
+
+ if(headers.containsKey(NeutronConstants.ADMIN_STATE_UP))
+ builder.adminStateUp(message.getHeader(NeutronConstants.ADMIN_STATE_UP, Boolean.class));
+
+ if(headers.containsKey(NeutronConstants.NETWORK_TYPE))
+ builder.networkType(message.getHeader(NeutronConstants.NETWORK_TYPE, NetworkType.class));
+
+ if(headers.containsKey(NeutronConstants.IS_SHARED))
+ builder.isShared(message.getHeader(NeutronConstants.IS_SHARED, Boolean.class));
+
+ if(headers.containsKey(NeutronConstants.IS_ROUTER_EXTERNAL))
+ builder.isRouterExternal(message.getHeader(NeutronConstants.IS_ROUTER_EXTERNAL, Boolean.class));
+
+ if(headers.containsKey(NeutronConstants.TENANT_ID))
+ builder.tenantId(message.getHeader(NeutronConstants.TENANT_ID, String.class));
+
+ if(headers.containsKey(NeutronConstants.PHYSICAL_NETWORK))
+ builder.physicalNetwork(message.getHeader(NeutronConstants.PHYSICAL_NETWORK, String.class));
+
+ if(headers.containsKey(NeutronConstants.SEGMENT_ID))
+ builder.segmentId(message.getHeader(NeutronConstants.SEGMENT_ID, String.class));
+
+ network = builder.build();
+ }
+
+ return network;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/PortProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/PortProducer.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/PortProducer.java
new file mode 100644
index 0000000..f7ed65d
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/PortProducer.java
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron.producer;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.openstack.common.AbstractOpenstackProducer;
+import org.apache.camel.component.openstack.neutron.NeutronConstants;
+import org.apache.camel.component.openstack.neutron.NeutronEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import org.openstack4j.api.Builders;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.builder.PortBuilder;
+
+import java.util.List;
+import java.util.Map;
+
+public class PortProducer extends AbstractOpenstackProducer {
+
+ public PortProducer(NeutronEndpoint endpoint, OSClient client) {
+ super(endpoint, client);
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ final String operation = getOperation(exchange);
+ switch (operation) {
+ case NeutronConstants.CREATE:
+ doCreate(exchange);
+ break;
+ case NeutronConstants.GET:
+ doGet(exchange);
+ break;
+ case NeutronConstants.GET_ALL:
+ doGetAll(exchange);
+ break;
+ case NeutronConstants.UPDATE:
+ doUpdate(exchange);
+ break;
+ case NeutronConstants.DELETE:
+ doDelete(exchange);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported operation " + operation);
+ }
+ }
+
+ private void doCreate(Exchange exchange) {
+ final Port in = messageToPort(exchange.getIn());
+ final Port out = os.networking().port().create(in);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGet(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.PORT_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Port ID");
+ final Port result = os.networking().port().get(id);
+ msg.setBody(result);
+ }
+
+ private void doGetAll(Exchange exchange) {
+ final List<? extends Port> out = os.networking().port().list();
+ exchange.getIn().setBody(out);
+ }
+
+ private void doUpdate(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final Port port = messageToPort(msg);
+ final Port updatedPort = os.networking().port().update(port);
+ msg.setBody(updatedPort);
+ }
+
+ private void doDelete(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.PORT_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Port ID");
+ final ActionResponse response = os.networking().port().delete(id);
+ checkFailure(response, msg, "Delete port with ID " + id);
+ }
+
+ private Port messageToPort(Message message) {
+ Port port = message.getBody(Port.class);
+
+ if (port == null) {
+ Map headers = message.getHeaders();
+ PortBuilder builder = Builders.port();
+
+ ObjectHelper.notEmpty(message.getHeader(NeutronConstants.NAME, String.class), "Name");
+ builder.name(message.getHeader(NeutronConstants.NAME, String.class));
+
+ if (headers.containsKey(NeutronConstants.TENANT_ID))
+ builder.tenantId(message.getHeader(NeutronConstants.TENANT_ID, String.class));
+
+ if (headers.containsKey(NeutronConstants.NETWORK_ID))
+ builder.networkId(message.getHeader(NeutronConstants.NETWORK_ID, String.class));
+
+ if (headers.containsKey(NeutronConstants.DEVICE_ID))
+ builder.deviceId(message.getHeader(NeutronConstants.DEVICE_ID, String.class));
+
+ if (headers.containsKey(NeutronConstants.MAC_ADDRESS))
+ builder.macAddress(message.getHeader(NeutronConstants.MAC_ADDRESS, String.class));
+
+ port = builder.build();
+ }
+ return port;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/RouterProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/RouterProducer.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/RouterProducer.java
new file mode 100644
index 0000000..28cf121
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/RouterProducer.java
@@ -0,0 +1,147 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron.producer;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.openstack.common.AbstractOpenstackProducer;
+import org.apache.camel.component.openstack.neutron.NeutronConstants;
+import org.apache.camel.component.openstack.neutron.NeutronEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import org.openstack4j.api.Builders;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.AttachInterfaceType;
+import org.openstack4j.model.network.Router;
+import org.openstack4j.model.network.RouterInterface;
+import org.openstack4j.model.network.builder.RouterBuilder;
+
+import java.util.List;
+import java.util.Map;
+
+public class RouterProducer extends AbstractOpenstackProducer {
+
+ public RouterProducer(NeutronEndpoint endpoint, OSClient client) {
+ super(endpoint, client);
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ final String operation = getOperation(exchange);
+ switch (operation) {
+ case NeutronConstants.CREATE:
+ doCreate(exchange);
+ break;
+ case NeutronConstants.GET:
+ doGet(exchange);
+ break;
+ case NeutronConstants.GET_ALL:
+ doGetAll(exchange);
+ break;
+ case NeutronConstants.UPDATE:
+ doUpdate(exchange);
+ break;
+ case NeutronConstants.DELETE:
+ doDelete(exchange);
+ break;
+ case NeutronConstants.ATTACH_INTERFACE:
+ doAttach(exchange);
+ break;
+ case NeutronConstants.DETACH_INTERFACE:
+ doDetach(exchange);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsuproutered operation " + operation);
+ }
+ }
+
+ private void doCreate(Exchange exchange) {
+ final Router in = messageToRouter(exchange.getIn());
+ final Router out = os.networking().router().create(in);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGet(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.ROUTER_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Router ID");
+ final Router result = os.networking().router().get(id);
+ msg.setBody(result);
+ }
+
+ private void doGetAll(Exchange exchange) {
+ final List<? extends Router> out = os.networking().router().list();
+ exchange.getIn().setBody(out);
+ }
+
+ private void doUpdate(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final Router router = messageToRouter(msg);
+ final Router updatedRouter = os.networking().router().update(router);
+ msg.setBody(updatedRouter);
+ }
+
+ private void doDelete(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.ROUTER_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Router ID");
+ final ActionResponse response = os.networking().router().delete(id);
+ checkFailure(response, msg, "Delete router with ID " + id);
+ }
+
+ private void doDetach(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String routerId = msg.getHeader(NeutronConstants.ROUTER_ID, String.class);
+ final String subnetId = msg.getHeader(NeutronConstants.SUBNET_ID, String.class);
+ final String portId = msg.getHeader(NeutronConstants.PORT_ID, String.class);
+ ObjectHelper.notEmpty(routerId, "Router ID");
+ RouterInterface iface = os.networking().router().detachInterface(routerId, subnetId, portId);
+ msg.setBody(iface);
+ }
+
+ private void doAttach(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String routerId = msg.getHeader(NeutronConstants.ROUTER_ID, String.class);
+ final String subnetPortId = msg.getHeader(NeutronConstants.SUBNET_ID, msg.getHeader(NeutronConstants.PORT_ID), String.class);
+ final AttachInterfaceType type = msg.getHeader(NeutronConstants.ITERFACE_TYPE, AttachInterfaceType.class);
+ ObjectHelper.notEmpty(routerId, "Router ID");
+ ObjectHelper.notEmpty(subnetPortId, "Subnet/Port ID");
+ ObjectHelper.notNull(type, "AttachInterfaceType ");
+ RouterInterface routerInterface = os.networking().router().attachInterface(routerId, type, subnetPortId);
+ msg.setBody(routerInterface);
+ }
+
+ //TODO: more headers?
+ private Router messageToRouter(Message message) {
+ Router router = message.getBody(Router.class);
+
+ if (router == null) {
+ Map headers = message.getHeaders();
+ RouterBuilder builder = Builders.router();
+
+ ObjectHelper.notEmpty(message.getHeader(NeutronConstants.NAME, String.class), "Name");
+ builder.name(message.getHeader(NeutronConstants.NAME, String.class));
+
+ if (headers.containsKey(NeutronConstants.TENANT_ID))
+ builder.tenantId(message.getHeader(NeutronConstants.TENANT_ID, String.class));
+
+ router = builder.build();
+ }
+ return router;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/SubnetProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/SubnetProducer.java b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/SubnetProducer.java
new file mode 100644
index 0000000..77bdc5c
--- /dev/null
+++ b/components/camel-openstack/src/main/java/org/apache/camel/component/openstack/neutron/producer/SubnetProducer.java
@@ -0,0 +1,113 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron.producer;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.openstack.common.AbstractOpenstackProducer;
+import org.apache.camel.component.openstack.neutron.NeutronConstants;
+import org.apache.camel.component.openstack.neutron.NeutronEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import org.openstack4j.api.Builders;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.Subnet;
+import org.openstack4j.model.network.builder.SubnetBuilder;
+
+import java.util.List;
+import java.util.Map;
+
+public class SubnetProducer extends AbstractOpenstackProducer {
+
+ public SubnetProducer(NeutronEndpoint endpoint, OSClient client) {
+ super(endpoint, client);
+ }
+
+ @Override public void process(Exchange exchange) throws Exception {
+ final String operation = getOperation(exchange);
+ switch (operation) {
+ case NeutronConstants.CREATE:
+ doCreate(exchange);
+ break;
+ case NeutronConstants.GET:
+ doGet(exchange);
+ break;
+ case NeutronConstants.GET_ALL:
+ doGetAll(exchange);
+ break;
+ case NeutronConstants.DELETE:
+ doDelete(exchange);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported operation " + operation);
+ }
+ }
+
+ private void doCreate(Exchange exchange) {
+ final Subnet in = messageToSubnet(exchange.getIn());
+ final Subnet out = os.networking().subnet().create(in);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGet(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.SUBNET_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Subnet ID");
+ final Subnet out = os.networking().subnet().get(id);
+ exchange.getIn().setBody(out);
+ }
+
+ private void doGetAll(Exchange exchange) {
+ final List<? extends Subnet> out = os.networking().subnet().list();
+ exchange.getIn().setBody(out);
+ }
+
+ private void doDelete(Exchange exchange) {
+ final Message msg = exchange.getIn();
+ final String id = msg.getHeader(NeutronConstants.ID, msg.getHeader(NeutronConstants.SUBNET_ID, String.class), String.class);
+ ObjectHelper.notEmpty(id, "Subnet ID");
+ final ActionResponse response = os.networking().subnet().delete(id);
+ checkFailure(response, msg, "Delete network " + id);
+ }
+
+
+ //TODO: more headers
+ private Subnet messageToSubnet(Message message) {
+ Subnet subnet = message.getBody(Subnet.class);
+ if(subnet == null) {
+ Map headers = message.getHeaders();
+ SubnetBuilder builder = Builders.subnet();
+
+ ObjectHelper.notEmpty(message.getHeader(NeutronConstants.NAME, String.class), "Name");
+ builder.name(message.getHeader(NeutronConstants.NAME, String.class));
+
+ if(headers.containsKey(NeutronConstants.NETWORK_ID))
+ builder.networkId(message.getHeader(NeutronConstants.NETWORK_ID, String.class));
+
+ if(headers.containsKey(NeutronConstants.ENABLE_DHCP))
+ builder.enableDHCP(message.getHeader(NeutronConstants.ENABLE_DHCP, Boolean.class));
+
+ if(headers.containsKey(NeutronConstants.GATEWAY))
+ builder.gateway(message.getHeader(NeutronConstants.GATEWAY, String.class));
+
+ subnet = builder.build();
+ }
+
+ return subnet;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/main/resources/META-INF/services/org/apache/camel/component/openstack-neutron
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/main/resources/META-INF/services/org/apache/camel/component/openstack-neutron b/components/camel-openstack/src/main/resources/META-INF/services/org/apache/camel/component/openstack-neutron
new file mode 100644
index 0000000..b232275
--- /dev/null
+++ b/components/camel-openstack/src/main/resources/META-INF/services/org/apache/camel/component/openstack-neutron
@@ -0,0 +1 @@
+class=org.apache.camel.component.openstack.neutron.NeutronComponent
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NetworkProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NetworkProducerTest.java b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NetworkProducerTest.java
new file mode 100644
index 0000000..888326a
--- /dev/null
+++ b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NetworkProducerTest.java
@@ -0,0 +1,148 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.component.openstack.neutron.producer.NetworkProducer;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.openstack4j.api.Builders;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.compute.Flavor;
+import org.openstack4j.model.network.Network;
+import org.openstack4j.model.network.NetworkType;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class NetworkProducerTest extends NeutronProducerTestSupport {
+
+ private Network dummyNetwork;
+
+ @Mock
+ private Network testOSnetwork;
+
+ @Before
+ public void setUp() {
+ producer = new NetworkProducer(endpoint, client);
+ when(networkService.create(any(Network.class))).thenReturn(testOSnetwork);
+ when(networkService.get(anyString())).thenReturn(testOSnetwork);
+
+ List<Network> getAllList = new ArrayList<>();
+ getAllList.add(testOSnetwork);
+ getAllList.add(testOSnetwork);
+ doReturn(getAllList).when(networkService).list();
+
+ dummyNetwork = createNetwork();
+ when(testOSnetwork.getName()).thenReturn(dummyNetwork.getName());
+ when(testOSnetwork.getTenantId()).thenReturn(dummyNetwork.getTenantId());
+ when(testOSnetwork.getNetworkType()).thenReturn(dummyNetwork.getNetworkType());
+ when(testOSnetwork.getId()).thenReturn(UUID.randomUUID().toString());
+ }
+
+ @Test
+ public void createTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.CREATE);
+ msg.setHeader(NeutronConstants.NAME, dummyNetwork.getName());
+ msg.setHeader(NeutronConstants.NETWORK_TYPE, dummyNetwork.getNetworkType());
+ msg.setHeader(NeutronConstants.TENANT_ID, dummyNetwork.getTenantId());
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Network> captor = ArgumentCaptor.forClass(Network.class);
+ verify(networkService).create(captor.capture());
+
+ assertEqualsNetwork(dummyNetwork, captor.getValue());
+ assertNotNull(msg.getBody(Network.class).getId());
+ }
+
+ @Test
+ public void getTest() throws Exception {
+ final String networkID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET);
+ msg.setHeader(NeutronConstants.NETWORK_ID, networkID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(networkService).get(captor.capture());
+
+ assertEquals(networkID, captor.getValue());
+ assertEqualsNetwork(testOSnetwork, msg.getBody(Network.class));
+ }
+
+ @Test
+ public void getAllTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET_ALL);
+
+ producer.process(exchange);
+
+ final List<Network> result = msg.getBody(List.class);
+ assertTrue(result.size() == 2);
+ assertEquals(testOSnetwork, result.get(0));
+ }
+
+ @Test
+ public void deleteTest() throws Exception {
+ when(networkService.delete(anyString())).thenReturn(ActionResponse.actionSuccess());
+ final String networkID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.DELETE);
+ msg.setHeader(NeutronConstants.ID, networkID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(networkService).delete(captor.capture());
+ assertEquals(networkID, captor.getValue());
+ assertFalse(msg.isFault());
+
+ //in case of failure
+ final String failureMessage = "fail";
+ when(networkService.delete(anyString())).thenReturn(ActionResponse.actionFailed(failureMessage, 404));
+ producer.process(exchange);
+ assertTrue(msg.isFault());
+ assertTrue(msg.getBody(String.class).contains(failureMessage));
+ }
+
+ private Network createNetwork() {
+ return Builders.network()
+ .name("name")
+ .tenantId("tenantID")
+ .networkType(NetworkType.LOCAL).build();
+ }
+
+ private void assertEqualsNetwork(Network old, Network newNetwork) {
+ assertEquals(old.getName(), newNetwork.getName());
+ assertEquals(old.getTenantId(), newNetwork.getTenantId());
+ assertEquals(old.getNetworkType(), newNetwork.getNetworkType());
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NeutronProducerTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NeutronProducerTestSupport.java b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NeutronProducerTestSupport.java
new file mode 100644
index 0000000..e5f5e63
--- /dev/null
+++ b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/NeutronProducerTestSupport.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.component.openstack.AbstractProducerTestSupport;
+
+import org.junit.Before;
+
+import org.mockito.Mock;
+import org.openstack4j.api.networking.NetworkService;
+import org.openstack4j.api.networking.NetworkingService;
+import org.openstack4j.api.networking.PortService;
+import org.openstack4j.api.networking.RouterService;
+import org.openstack4j.api.networking.SubnetService;
+
+public class NeutronProducerTestSupport extends AbstractProducerTestSupport {
+
+ @Mock
+ protected NeutronEndpoint endpoint;
+
+ @Mock
+ protected NetworkingService networkingService;
+
+ @Mock
+ PortService portService;
+
+ @Mock
+ RouterService routerService;
+
+ @Mock
+ SubnetService subnetService;
+
+ @Mock
+ NetworkService networkService;
+
+ @Before
+ public void setUpComputeService(){
+ when(client.networking()).thenReturn(networkingService);
+ when(networkingService.port()).thenReturn(portService);
+ when(networkingService.router()).thenReturn(routerService);
+ when(networkingService.subnet()).thenReturn(subnetService);
+ when(networkingService.network()).thenReturn(networkService);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/PortProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/PortProducerTest.java b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/PortProducerTest.java
new file mode 100644
index 0000000..6e46a5b
--- /dev/null
+++ b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/PortProducerTest.java
@@ -0,0 +1,174 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.component.openstack.neutron.producer.PortProducer;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.openstack4j.api.Builders;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.Router;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class PortProducerTest extends NeutronProducerTestSupport {
+
+ private Port dummyPort;
+
+ @Mock
+ private Port testOSport;
+
+ @Before
+ public void setUp() {
+ producer = new PortProducer(endpoint, client);
+ when(portService.create(any(Port.class))).thenReturn(testOSport);
+ when(portService.get(anyString())).thenReturn(testOSport);
+
+ List<Port> getAllList = new ArrayList<>();
+ getAllList.add(testOSport);
+ getAllList.add(testOSport);
+ doReturn(getAllList).when(portService).list();
+
+ dummyPort = createPort();
+ when(testOSport.getName()).thenReturn(dummyPort.getName());
+ when(testOSport.getNetworkId()).thenReturn(dummyPort.getNetworkId());
+ when(testOSport.getMacAddress()).thenReturn(dummyPort.getMacAddress());
+ when(testOSport.getDeviceId()).thenReturn(dummyPort.getDeviceId());
+ when(testOSport.getId()).thenReturn(UUID.randomUUID().toString());
+ }
+
+ @Test
+ public void createTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.CREATE);
+ msg.setHeader(NeutronConstants.NAME, dummyPort.getName());
+ msg.setHeader(NeutronConstants.TENANT_ID, dummyPort.getTenantId());
+ msg.setHeader(NeutronConstants.NETWORK_ID, dummyPort.getNetworkId());
+ msg.setHeader(NeutronConstants.MAC_ADDRESS, dummyPort.getMacAddress());
+ msg.setHeader(NeutronConstants.DEVICE_ID, dummyPort.getDeviceId());
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Port> captor = ArgumentCaptor.forClass(Port.class);
+ verify(portService).create(captor.capture());
+
+ assertEqualsPort(dummyPort, captor.getValue());
+ assertNotNull(msg.getBody(Port.class).getId());
+ }
+
+ @Test
+ public void getTest() throws Exception {
+ final String portID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET);
+ msg.setHeader(NeutronConstants.ID, portID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(portService).get(captor.capture());
+
+ assertEquals(portID, captor.getValue());
+ assertEqualsPort(testOSport, msg.getBody(Port.class));
+ }
+
+ @Test
+ public void getAllTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET_ALL);
+
+ producer.process(exchange);
+
+ final List<Port> result = msg.getBody(List.class);
+ assertTrue(result.size() == 2);
+ assertEquals(testOSport, result.get(0));
+ }
+
+ @Test
+ public void updateTest() throws Exception {
+ final String portID = "myID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.UPDATE);
+ final String newDevId = "dev";
+ when(testOSport.getDeviceId()).thenReturn(newDevId);
+ when(testOSport.getId()).thenReturn(portID);
+ when(portService.update(any(Port.class))).thenReturn(testOSport);
+
+ msg.setBody(testOSport);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Port> captor = ArgumentCaptor.forClass(Port.class);
+ verify(portService).update(captor.capture());
+
+ assertEqualsPort(testOSport, captor.getValue());
+ assertNotNull(captor.getValue().getId());
+ }
+
+ @Test
+ public void deleteTest() throws Exception {
+ when(portService.delete(anyString())).thenReturn(ActionResponse.actionSuccess());
+ final String portID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.DELETE);
+ msg.setHeader(NeutronConstants.ID, portID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(portService).delete(captor.capture());
+ assertEquals(portID, captor.getValue());
+ assertFalse(msg.isFault());
+
+ //in case of failure
+ final String failureMessage = "fail";
+ when(portService.delete(anyString())).thenReturn(ActionResponse.actionFailed(failureMessage, 404));
+ producer.process(exchange);
+ assertTrue(msg.isFault());
+ assertTrue(msg.getBody(String.class).contains(failureMessage));
+ }
+
+ private Port createPort() {
+ return Builders.port()
+ .name("name")
+ .tenantId("tenantID")
+ .networkId("netId")
+ .deviceId("devID")
+ .macAddress("mac").build();
+ }
+
+ private void assertEqualsPort(Port old, Port newPort) {
+ assertEquals(old.getName(), newPort.getName());
+ assertEquals(old.getTenantId(), newPort.getTenantId());
+ assertEquals(old.getNetworkId(), newPort.getNetworkId());
+ assertEquals(old.getDeviceId(), newPort.getDeviceId());
+ assertEquals(old.getMacAddress(), newPort.getMacAddress());
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/RouterProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/RouterProducerTest.java b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/RouterProducerTest.java
new file mode 100644
index 0000000..18d0ecc
--- /dev/null
+++ b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/RouterProducerTest.java
@@ -0,0 +1,221 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.component.openstack.neutron.producer.RouterProducer;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.openstack4j.api.Builders;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.AttachInterfaceType;
+import org.openstack4j.model.network.NetworkType;
+import org.openstack4j.model.network.Router;
+import org.openstack4j.model.network.RouterInterface;
+import org.openstack4j.openstack.networking.domain.NeutronRouterInterface;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class RouterProducerTest extends NeutronProducerTestSupport {
+
+ private Router dummyRouter;
+
+ @Mock
+ private Router testOSrouter;
+
+ @Before
+ public void setUp() {
+ producer = new RouterProducer(endpoint, client);
+ when(routerService.create(any(Router.class))).thenReturn(testOSrouter);
+ when(routerService.get(anyString())).thenReturn(testOSrouter);
+
+ List<Router> getAllList = new ArrayList<>();
+ getAllList.add(testOSrouter);
+ getAllList.add(testOSrouter);
+ doReturn(getAllList).when(routerService).list();
+
+ dummyRouter = createRouter();
+ when(testOSrouter.getName()).thenReturn(dummyRouter.getName());
+ when(testOSrouter.getTenantId()).thenReturn(dummyRouter.getTenantId());
+ when(testOSrouter.getId()).thenReturn(UUID.randomUUID().toString());
+ }
+
+ @Test
+ public void createTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.CREATE);
+ msg.setHeader(NeutronConstants.NAME, dummyRouter.getName());
+ msg.setHeader(NeutronConstants.TENANT_ID, dummyRouter.getTenantId());
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Router> captor = ArgumentCaptor.forClass(Router.class);
+ verify(routerService).create(captor.capture());
+
+ assertEqualsRouter(dummyRouter, captor.getValue());
+ assertNotNull(msg.getBody(Router.class).getId());
+ }
+
+ @Test
+ public void getTest() throws Exception {
+ final String routerID = "myRouterID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET);
+ msg.setHeader(NeutronConstants.ROUTER_ID, routerID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(routerService).get(captor.capture());
+
+ assertEquals(routerID, captor.getValue());
+ assertEqualsRouter(testOSrouter, msg.getBody(Router.class));
+ }
+
+ @Test
+ public void getAllTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET_ALL);
+
+ producer.process(exchange);
+
+ final List<Router> result = msg.getBody(List.class);
+ assertTrue(result.size() == 2);
+ assertEquals(testOSrouter, result.get(0));
+ }
+
+ @Test
+ public void updateTest() throws Exception {
+ final String routerID = "myRouterID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.UPDATE);
+ final Router tmp = createRouter();
+ final String newName = "newName";
+ tmp.setName(newName);
+ when(routerService.update(any(Router.class))).thenReturn(tmp);
+ dummyRouter.setId(routerID);
+ msg.setBody(dummyRouter);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Router> captor = ArgumentCaptor.forClass(Router.class);
+ verify(routerService).update(captor.capture());
+
+ assertEqualsRouter(dummyRouter, captor.getValue());
+ assertNotNull(captor.getValue().getId());
+ assertEquals(newName, msg.getBody(Router.class).getName());
+ }
+
+ @Test
+ public void deleteTest() throws Exception {
+ when(routerService.delete(anyString())).thenReturn(ActionResponse.actionSuccess());
+ final String routerID = "myRouterID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.DELETE);
+ msg.setHeader(NeutronConstants.ID, routerID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(routerService).delete(captor.capture());
+ assertEquals(routerID, captor.getValue());
+ assertFalse(msg.isFault());
+
+ //in case of failure
+ final String failureMessage = "fail";
+ when(routerService.delete(anyString())).thenReturn(ActionResponse.actionFailed(failureMessage, 404));
+ producer.process(exchange);
+ assertTrue(msg.isFault());
+ assertTrue(msg.getBody(String.class).contains(failureMessage));
+ }
+
+ @Test
+ public void detachTest() throws Exception {
+ final String routerID = "myRouterID";
+ final String portId = "port";
+ final String subnetId = "subnet";
+ final RouterInterface ifce = new NeutronRouterInterface(subnetId, portId);
+ when(routerService.detachInterface(anyString(), anyString(), anyString())).thenReturn(ifce);
+
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.DETACH_INTERFACE);
+ msg.setHeader(NeutronConstants.ROUTER_ID, routerID);
+ msg.setHeader(NeutronConstants.SUBNET_ID, subnetId);
+ msg.setHeader(NeutronConstants.PORT_ID, portId);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> routerC = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<String> portC = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<String> subnetC = ArgumentCaptor.forClass(String.class);
+ verify(routerService).detachInterface(routerC.capture(), subnetC.capture(), portC.capture());
+
+ assertEquals(routerID, routerC.getValue());
+ assertEquals(subnetId, subnetC.getValue());
+ assertEquals(portId, portC.getValue());
+
+ assertEquals(ifce, msg.getBody(RouterInterface.class));
+ }
+
+ @Test
+ public void attachTest() throws Exception {
+ final String routerID = "myRouterID";
+ final String subnetId = "subnet";
+ final RouterInterface ifce = new NeutronRouterInterface(subnetId, null);
+ when(routerService.attachInterface(anyString(), any(AttachInterfaceType.class), anyString())).thenReturn(ifce);
+
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.ATTACH_INTERFACE);
+ msg.setHeader(NeutronConstants.ROUTER_ID, routerID);
+ msg.setHeader(NeutronConstants.SUBNET_ID, subnetId);
+ msg.setHeader(NeutronConstants.ITERFACE_TYPE, AttachInterfaceType.SUBNET);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> routerC = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<AttachInterfaceType> itfType = ArgumentCaptor.forClass(AttachInterfaceType.class);
+ ArgumentCaptor<String> subnetC = ArgumentCaptor.forClass(String.class);
+ verify(routerService).attachInterface(routerC.capture(), itfType.capture(), subnetC.capture());
+
+ assertEquals(routerID, routerC.getValue());
+ assertEquals(AttachInterfaceType.SUBNET, itfType.getValue());
+ assertEquals(subnetId, subnetC.getValue());
+
+ assertEquals(ifce, msg.getBody(RouterInterface.class));
+ }
+
+ private Router createRouter() {
+ return Builders.router()
+ .name("name")
+ .tenantId("tenantID")
+ .build();
+ }
+
+ private void assertEqualsRouter(Router old, Router newRouter) {
+ assertEquals(old.getName(), newRouter.getName());
+ assertEquals(old.getTenantId(), newRouter.getTenantId());
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2847e099/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/SubnetProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/SubnetProducerTest.java b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/SubnetProducerTest.java
new file mode 100644
index 0000000..9aa45d4
--- /dev/null
+++ b/components/camel-openstack/src/test/java/org/apache/camel/component/openstack/neutron/SubnetProducerTest.java
@@ -0,0 +1,143 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.openstack.neutron;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.component.openstack.neutron.producer.SubnetProducer;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.openstack4j.api.Builders;
+import org.openstack4j.model.common.ActionResponse;
+import org.openstack4j.model.network.Subnet;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class SubnetProducerTest extends NeutronProducerTestSupport {
+
+ private Subnet dummySubnet;
+
+ @Mock
+ private Subnet testOSsubnet;
+
+ @Before
+ public void setUp() {
+ producer = new SubnetProducer(endpoint, client);
+ when(subnetService.create(any(Subnet.class))).thenReturn(testOSsubnet);
+ when(subnetService.get(anyString())).thenReturn(testOSsubnet);
+
+ List<Subnet> getAllList = new ArrayList<>();
+ getAllList.add(testOSsubnet);
+ getAllList.add(testOSsubnet);
+ doReturn(getAllList).when(subnetService).list();
+
+ dummySubnet = createSubnet();
+ when(testOSsubnet.getName()).thenReturn(dummySubnet.getName());
+ when(testOSsubnet.getNetworkId()).thenReturn(dummySubnet.getNetworkId());
+ when(testOSsubnet.getId()).thenReturn(UUID.randomUUID().toString());
+ }
+
+ @Test
+ public void createTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.CREATE);
+ msg.setHeader(NeutronConstants.NAME, dummySubnet.getName());
+ msg.setHeader(NeutronConstants.NETWORK_ID , dummySubnet.getNetworkId());
+
+ producer.process(exchange);
+
+ ArgumentCaptor<Subnet> captor = ArgumentCaptor.forClass(Subnet.class);
+ verify(subnetService).create(captor.capture());
+
+ assertEqualsSubnet(dummySubnet, captor.getValue());
+ assertNotNull(msg.getBody(Subnet.class).getId());
+ }
+
+ @Test
+ public void getTest() throws Exception {
+ final String subnetID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET);
+ msg.setHeader(NeutronConstants.SUBNET_ID, subnetID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(subnetService).get(captor.capture());
+
+ assertEquals(subnetID, captor.getValue());
+ assertEqualsSubnet(testOSsubnet, msg.getBody(Subnet.class));
+ }
+
+ @Test
+ public void getAllTest() throws Exception {
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.GET_ALL);
+
+ producer.process(exchange);
+
+ final List<Subnet> result = msg.getBody(List.class);
+ assertTrue(result.size() == 2);
+ assertEquals(testOSsubnet, result.get(0));
+ }
+
+ @Test
+ public void deleteTest() throws Exception {
+ when(subnetService.delete(anyString())).thenReturn(ActionResponse.actionSuccess());
+ final String subnetID = "myNetID";
+ msg.setHeader(NeutronConstants.OPERATION, NeutronConstants.DELETE);
+ msg.setHeader(NeutronConstants.ID, subnetID);
+
+ producer.process(exchange);
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(subnetService).delete(captor.capture());
+ assertEquals(subnetID, captor.getValue());
+ assertFalse(msg.isFault());
+
+ //in case of failure
+ final String failureMessage = "fail";
+ when(subnetService.delete(anyString())).thenReturn(ActionResponse.actionFailed(failureMessage, 404));
+ producer.process(exchange);
+ assertTrue(msg.isFault());
+ assertTrue(msg.getBody(String.class).contains(failureMessage));
+ }
+
+ private Subnet createSubnet() {
+ return Builders.subnet()
+ .name("name")
+ .networkId("netId")
+ .build();
+ }
+
+ private void assertEqualsSubnet(Subnet old, Subnet newSubnet) {
+ assertEquals(old.getName(), newSubnet.getName());
+ assertEquals(old.getNetworkId(), newSubnet.getNetworkId());
+ }
+}