JCLOUDS – multi-cloud toolkit

Ciao a tutti,
visto che ci eravamo prefissati di aggiungere qualche post, e dato che mi farà comodo in futuro aver scritto qualcosa per poi ritornare a rileggerlo quando ne avrò bisogno, spero di fare cosa gradita postando questo semplice esempio che mostra come fare il deployment di una macchina virtuale su Openstack utilizzando jclouds.

Il vantaggio di utilizzare questa libreria java è il fatto di poter utilizzare lo stesso approccio per interfacciarsi con diverse tecnologie cloud ( Amazon AWS, CloudSigma, Openstack, HPCloud, SoftLayer, etc).

Per seguire questo tutorial i requisiti sono:

  • Avere una minima conoscenza del concetto di Cloud e di IaaS
  • Saper programmare utilizzando il linguaggio java
  • Avere una versione funzionante di openstack con una immagine registrata in glance pronta a essere deployata (in futuro prevedo di postare qualche tutorial per parlare piu’ in generale di cloud e in specifico di openstack, almeno la sua installazione e configurazione AllInOneNode)

 

jclouds è una libreria e in quanto tale deve essere importata nel vostro progetto. In questo tutorial ho utilizzato la versione 1.6 e in caso vi piaccia l’approccio maven (e dovreste) eccovi qui le librerie da usare:

 <dependency>  
    <groupid>org.jclouds.driver</groupid>  
    <artifactid>jclouds-log4j</artifactid>  
    <version>1.6.0</version>  
   </dependency>  
   <dependency>  
    <groupid>org.apache.jclouds</groupid>  
    <artifactid>jclouds-core</artifactid>  
    <version>1.6.1-incubating</version>  
   </dependency>  
   <dependency>  
    <groupid>org.jclouds.driver</groupid>  
    <artifactid>jclouds-slf4j</artifactid>  
    <version>1.6.0</version>  
   </dependency>  
   <dependency>  
    <groupid>org.jclouds.api</groupid>  
    <artifactid>openstack-nova</artifactid>  
    <version>1.6.0</version>  
   </dependency>  

L’utlizzo di jclouds per la creazione di una VM prevede 3 step principali (gli stessi che troveremo in qualsiasi altra situzione con approccio a un servizio cloud IaaS):

  1. la connessione al cloud provider (attraverso le credenziali)
  2. la creazione di un template
  3. il deployment

Il progetto java scaricabile qui è composto da 2 classi:

  • Deployer
  • Configuration

 

Configuration contiene tutte le informazioni necessarie alla connessione al cloud provider, mentre Deployer contiene la parte di core.

E’ quindi necessario inserire i propri dati nella parte di configurazione

 public class Configuration {
public static final String KEYSTONE_AUTH_URL = "http://192.xx.xx.xxx:35357/v2.0";
public static final String KEYSTONE_USERNAME = "xxxx";
public static final String KEYSTONE_PASSWORD = "xxxx";
public static final String KEYSTONE_ENDPOINT = "http://xxx.xx.xx.xxx:35357/v2.0";
public static final String TENANT_NAME = "xxxx";
public static final String NOVA_ENDPOINT = "http://xxx.xx.xx.xxx:5000/v2";
public static final String CEILOMETER_ENDPOINT = "";
}

Questi informazioni vengono poi utilizzate nello step1 per connettersi al cloud provider:

 ComputeServiceContext context = ContextBuilder.newBuilder("openstack-nova")
.endpoint(Configuration.NOVA_ENDPOINT)
.credentials(identity, credential)
.modules(modules)
.overrides(overrides)
.buildView(ComputeServiceContext.class);

Otteniamo così il compute service:

 ComputeService computeService = context.getComputeService(); 

Possiamo passare allo Step2 del processo. La creazione del template. jclouds mette a disposizione un TemplateBuilder in modo da mantenere l’astrazione fra il suo uso e le specifiche della cloud di destinazione. Nell’esempio il template creato richiede a openstack di fare il deployment utilizzanto un flavour che abbia almeno 512Mb di Ram e di instanziare una VM dall’immagine “RegionOne/f72885a5-e681-4219-b931-bb062d74c591” (precedentemente caricata in glance). jclouds per quanto riguarda le immagini salvate in opestack richiede la formattazione “<RegionIdentifier>/<ImageID>”.

Il codice di creazione del template:

 TemplateBuilder tb = computeService.templateBuilder(); 
tb.minRam(Integer.parseInt("512")); 
tb.imageId("RegionOne/f72885a5-e681-4219-b931-bb062d74c591");  

Creato il template non resta che passare allo step3 inviando il comando di deployment a Openstack.

 TemplateBuilder tb = computeService.templateBuilder();  
        NodeMetadata node1=null;  
           try {  
                node1 = getOnlyElement(computeService.createNodesInGroup(groupName, 1, tb.build()));  
           } catch (RunNodesException e) {  
                e.printStackTrace();  
           }  
        System.out.printf("<< node %s: %s%n", node1.getId(),  
         concat(node1.getPrivateAddresses(), node1.getPublicAddresses()));  

Come è facile intuire il concetto di VM, che si mappa come server in Openstack per jclouds è interpretato dalla classe Node.

Buon Divertimento!