Repository: stratos
Updated Branches:
  refs/heads/master 5e78dd461 -> 002ddac2a


changing openstack nova iaas to use new openstack networking api abstraction


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/002ddac2
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/002ddac2
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/002ddac2

Branch: refs/heads/master
Commit: 002ddac2a94b4dffdc2aa59203e2636b1a6643b3
Parents: 5e78dd4
Author: R-Rajkumar <[email protected]>
Authored: Fri Dec 5 01:27:47 2014 +0530
Committer: R-Rajkumar <[email protected]>
Committed: Fri Dec 5 01:27:47 2014 +0530

----------------------------------------------------------------------
 .../controller/iaases/OpenstackNovaIaas.java    | 249 +++----------------
 .../networking/NeutronNetworkingApi.java        |   2 +-
 .../util/CloudControllerConstants.java          |   2 +
 3 files changed, 41 insertions(+), 212 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/002ddac2/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
index 46edca8..2740397 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
@@ -18,35 +18,33 @@
  */
 package org.apache.stratos.cloud.controller.iaases;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.concurrent.TimeoutException;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.domain.IaasProvider;
+import org.apache.stratos.cloud.controller.domain.NetworkInterface;
 import org.apache.stratos.cloud.controller.exception.CloudControllerException;
 import org.apache.stratos.cloud.controller.exception.InvalidHostException;
 import org.apache.stratos.cloud.controller.exception.InvalidRegionException;
 import org.apache.stratos.cloud.controller.exception.InvalidZoneException;
-import org.apache.stratos.cloud.controller.util.ComputeServiceBuilderUtil;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.domain.NetworkInterface;
-import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
-import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import 
org.apache.stratos.cloud.controller.iaases.openstack.networking.NeutronNetworkingApi;
+import 
org.apache.stratos.cloud.controller.iaases.openstack.networking.NovaNetworkingApi;
+import 
org.apache.stratos.cloud.controller.iaases.openstack.networking.OpenstackNetworkingApi;
 import 
org.apache.stratos.cloud.controller.iaases.validators.OpenstackNovaPartitionValidator;
 import 
org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.ComputeServiceBuilderUtil;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.openstack.nova.v2_0.NovaApi;
 import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions;
-import org.jclouds.openstack.nova.v2_0.domain.FloatingIP;
 import org.jclouds.openstack.nova.v2_0.domain.HostAggregate;
 import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
 import org.jclouds.openstack.nova.v2_0.domain.Network;
@@ -54,29 +52,47 @@ import org.jclouds.openstack.nova.v2_0.domain.Volume;
 import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment;
 import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
 import org.jclouds.openstack.nova.v2_0.extensions.AvailabilityZoneApi;
-import org.jclouds.openstack.nova.v2_0.extensions.FloatingIPApi;
 import org.jclouds.openstack.nova.v2_0.extensions.HostAggregateApi;
 import org.jclouds.openstack.nova.v2_0.extensions.KeyPairApi;
 import org.jclouds.openstack.nova.v2_0.extensions.VolumeApi;
 import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApi;
 import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.concurrent.TimeoutException;
+import com.google.common.base.Optional;
 
 public class OpenstackNovaIaas extends Iaas {
 
        private static final Log log = 
LogFactory.getLog(OpenstackNovaIaas.class);
        private static final String SUCCESSFUL_LOG_LINE = "A key-pair is 
created successfully in ";
        private static final String FAILED_LOG_LINE = "Key-pair is unable to 
create in ";
+       
+       private OpenstackNetworkingApi openstackNetworkingApi;
 
        public OpenstackNovaIaas(IaasProvider iaasProvider) {
                super(iaasProvider);
+               setOpenstackNetworkingApi(iaasProvider);
        }
        
+    private void setOpenstackNetworkingApi(IaasProvider iaasProvider) {
+        String openstackNetworkingProvider = 
iaasProvider.getProperty(CloudControllerConstants.OPENSTACK_NETWORKING_PROVIDER);
+        if (openstackNetworkingProvider != null && 
+                        
openstackNetworkingProvider.equals(CloudControllerConstants.OPENSTACK_NEUTRON_NETWORKING))
 {
+                if (log.isDebugEnabled()) {
+                        String msg = String.format("Openstack networking 
provider is %s. Trying to instanstiate %s", 
+                                        openstackNetworkingProvider, 
NeutronNetworkingApi.class.getName());
+                        log.debug(msg);
+                }
+                openstackNetworkingApi = new 
NeutronNetworkingApi(iaasProvider);
+        } else {
+                if (log.isDebugEnabled()) {
+                        String msg = String.format("Openstack networking 
provider is %s. Hence trying to instanstiate %s", 
+                                        openstackNetworkingProvider, 
NovaNetworkingApi.class.getName());
+                        log.debug(msg);
+                }
+                openstackNetworkingApi = new NovaNetworkingApi(iaasProvider);
+        }
+    }
+       
        @Override
        public void buildComputeServiceAndTemplate() {
 
@@ -216,207 +232,18 @@ public class OpenstackNovaIaas extends Iaas {
 
        @Override
        public synchronized String associateAddress(NodeMetadata node) {
-               
-               IaasProvider iaasInfo = getIaasProvider();
-
-               ComputeServiceContext context = iaasInfo.getComputeService()
-                               .getContext();
-
-               String region = 
ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-
-        NovaApi novaApi = context.unwrapApi(NovaApi.class);
-               FloatingIPApi floatingIp = 
novaApi.getFloatingIPExtensionForZone(
-                               region).get();
-
-               String ip = null;
-               // first try to find an unassigned IP.
-               ArrayList<FloatingIP> unassignedIps = 
Lists.newArrayList(Iterables
-                               .filter(floatingIp.list(),
-                                               new Predicate<FloatingIP>() {
-
-                                                       @Override
-                                                       public boolean 
apply(FloatingIP arg0) {
-                                                               return 
arg0.getInstanceId() == null;
-                                                       }
-
-                                               }));
-
-               if (!unassignedIps.isEmpty()) {
-                       // try to prevent multiple parallel launches from 
choosing the same
-                       // ip.
-                       Collections.shuffle(unassignedIps);
-                       ip = Iterables.getLast(unassignedIps).getIp();
-               }
-
-               // if no unassigned IP is available, we'll try to allocate an 
IP.
-               if (ip == null || ip.isEmpty()) {
-                       String defaultFloatingIpPool = 
iaasInfo.getProperty(CloudControllerConstants.DEFAULT_FLOATING_IP_POOL);
-                       FloatingIP allocatedFloatingIP;
-                       if ((defaultFloatingIpPool == null) || 
"".equals(defaultFloatingIpPool)) {
-                               allocatedFloatingIP = floatingIp.create();
-                       } else {
-                               allocatedFloatingIP = 
floatingIp.allocateFromPool(defaultFloatingIpPool);
-                       }
-                       if (allocatedFloatingIP == null) {
-                               String msg = "Failed to allocate an IP 
address.";
-                               log.error(msg);
-                               throw new CloudControllerException(msg);
-                       }
-                       ip = allocatedFloatingIP.getIp();
-               }
-
-               // wait till the fixed IP address gets assigned - this is 
needed before
-               // we associate a public IP
-               while (node.getPrivateAddresses() == null) {
-                       CloudControllerUtil.sleep(1000);
-               }
-               
-               if (node.getPublicAddresses() != null
-                               && 
node.getPublicAddresses().iterator().hasNext()) {
-                       log.info("A public IP ("
-                                       + 
node.getPublicAddresses().iterator().next()
-                                       + ") is already allocated to the 
instance [id] : "
-                                       + node.getId());
-                       return null;
-               }
-
-               int retries = 0;
-               //TODO make 5 configurable
-               while (retries < 5
-                               && !associateIp(floatingIp, ip, 
node.getProviderId())) {
-
-                       // wait for 5s
-                       CloudControllerUtil.sleep(5000);
-                       retries++;
-               }
-
-               log.info("Successfully associated an IP address " + ip
-                               + " for node with id: " + node.getId());
-
-               return ip;
+               //TODO return the list of IP addresses once the topology 
changes is done
+               return 
openstackNetworkingApi.associateAddresses(node).iterator().next();
        }
        
        @Override
        public synchronized String associatePredefinedAddress (NodeMetadata 
node, String ip) {
-               if(log.isDebugEnabled()) {
-                       
log.debug("OpenstackNovaIaas:associatePredefinedAddress:ip:" + ip);
-               }
-               
-               IaasProvider iaasInfo = getIaasProvider();
-               
-               ComputeServiceContext context = iaasInfo.getComputeService()
-                               .getContext();
-
-               String region = 
ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-
-               FloatingIPApi floatingIp = 
context.unwrapApi(NovaApi.class).getFloatingIPExtensionForZone(
-                region).get();
-
-               if(log.isDebugEnabled()) {
-                       
log.debug("OpenstackNovaIaas:associatePredefinedAddress:floatingip:" + 
floatingIp);
-               }
-               
-               // get the list of all unassigned IP.
-               ArrayList<FloatingIP> unassignedIps = 
Lists.newArrayList(Iterables
-                               .filter(floatingIp.list(),
-                                               new Predicate<FloatingIP>() {
-
-                                                       @Override
-                                                       public boolean 
apply(FloatingIP arg0) {
-                                                               // FIXME is 
this the correct filter?
-                                                               return 
arg0.getFixedIp() == null;
-                                                       }
-
-                                               }));
-               
-               boolean isAvailable = false;
-               for (FloatingIP fip : unassignedIps) {
-                       if(log.isDebugEnabled()) {
-                               
log.debug("OpenstackNovaIaas:associatePredefinedAddress:iterating over 
available floatingip:" + fip);
-                       }
-                       if (ip.equals(fip.getIp())) {
-                               if(log.isDebugEnabled()) {
-                                       
log.debug(String.format("OpenstackNovaIaas:associatePredefinedAddress:floating 
ip in use:%s /ip:%s", fip, ip));
-                               }
-                               isAvailable = true;
-                               break;
-                       }
-               }
-               
-               if (isAvailable) {
-                       // assign ip
-                       if(log.isDebugEnabled()) {
-                               
log.debug("OpenstackNovaIaas:associatePredefinedAddress:assign floating ip:" + 
ip);
-                       }
-                       // exercise same code as in associateAddress()
-                       // wait till the fixed IP address gets assigned - this 
is needed before
-                       // we associate a public IP
-
-                       while (node.getPrivateAddresses() == null) {
-                               CloudControllerUtil.sleep(1000);
-                       }
-
-                       int retries = 0;
-                       while (retries < 5
-                                       && !associateIp(floatingIp, ip, 
node.getProviderId())) {
-
-                               // wait for 5s
-                               CloudControllerUtil.sleep(5000);
-                               retries++;
-                       }
-
-                       NodeMetadataBuilder.fromNodeMetadata(node)
-                                       
.publicAddresses(ImmutableSet.of(ip)).build();
-
-                       
log.info("OpenstackNovaIaas:associatePredefinedAddress:Successfully associated 
an IP address " + ip
-                                       + " for node with id: " + node.getId());
-               } else {
-                       // unable to allocate predefined ip,
-                       
log.info("OpenstackNovaIaas:associatePredefinedAddress:Unable to allocate 
predefined ip:" 
-                                       + " for node with id: " + node.getId());
-                       return "";
-               }
-
-               
-               NodeMetadataBuilder.fromNodeMetadata(node)
-                               .publicAddresses(ImmutableSet.of(ip)).build();
-
-               
log.info("OpenstackNovaIaas:associatePredefinedAddress::Successfully associated 
an IP address " + ip
-                               + " for node with id: " + node.getId());
-
-               return ip;
-               
+               return openstackNetworkingApi.associatePredefinedAddress(node, 
ip);
        }       
 
        @Override
        public synchronized void releaseAddress(String ip) {
-
-               IaasProvider iaasInfo = getIaasProvider();
-               
-               ComputeServiceContext context = iaasInfo.getComputeService()
-                               .getContext();
-
-               String region = 
ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-
-        NovaApi novaApi = context.unwrapApi(NovaApi.class);
-               FloatingIPApi floatingIPApi = 
novaApi.getFloatingIPExtensionForZone(region).get();
-
-               for (FloatingIP floatingIP : floatingIPApi.list()) {
-                       if (floatingIP.getIp().equals(ip)) {
-                               floatingIPApi.delete(floatingIP.getId());
-                               break;
-                       }
-               }
-
-       }
-
-       private boolean associateIp(FloatingIPApi api, String ip, String id) {
-               try {
-                       api.addToServer(ip, id);
-                       return true;
-               } catch (RuntimeException ex) {
-                       return false;
-               }
+               openstackNetworkingApi.releaseAddress(ip);
        }
 
     @Override

http://git-wip-us.apache.org/repos/asf/stratos/blob/002ddac2/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/networking/NeutronNetworkingApi.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/networking/NeutronNetworkingApi.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/networking/NeutronNetworkingApi.java
index 6dcbda9..864d23d 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/networking/NeutronNetworkingApi.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/networking/NeutronNetworkingApi.java
@@ -234,7 +234,7 @@ public class NeutronNetworkingApi implements 
OpenstackNetworkingApi {
                        while (unassginedFloatingIPsIterator.hasNext()) {
                                FloatingIP floatingIP = 
unassginedFloatingIPsIterator.next();
                                List<String> allPredefinedFloatingIPs = 
getAllPredefinedFloatingIPs(iaasProvider.getNetworkInterfaces());
-                               if (allPredefinedFloatingIPs != null) {
+                               if (allPredefinedFloatingIPs != null && 
!allPredefinedFloatingIPs.isEmpty()) {
                                if (log.isDebugEnabled()) {
                                        String msg = String.format("Predefined  
floating IPs - %s found in cartridge", 
                                                        
allPredefinedFloatingIPs.toString());

http://git-wip-us.apache.org/repos/asf/stratos/blob/002ddac2/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
index 9c606b9..21664e2 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
@@ -142,6 +142,8 @@ public final class CloudControllerConstants {
        // pre define a floating ip
        public static final String FLOATING_IP_PROPERTY = "floatingIp";
        public static final String DEFAULT_FLOATING_IP_POOL = 
"defaultFloatingIpPool";
+       public static final String OPENSTACK_NETWORKING_PROVIDER = 
"openstack.networking.provider";
+       public static final String OPENSTACK_NEUTRON_NETWORKING = "neutron";
 
        /**
         * XPath expressions

Reply via email to