Fixed compute create, added retrieve and delete
authorJohn Giannelos <johngiannelos@gmail.com>
Fri, 20 Apr 2012 13:18:21 +0000 (16:18 +0300)
committerJohn Giannelos <johngiannelos@gmail.com>
Fri, 20 Apr 2012 13:18:21 +0000 (16:18 +0300)
snf-occi-server.py [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 5949353..a17ad11
-#!/usr/bin/env python
-
-from kamaki.clients.compute import ComputeClient
-from kamaki.config  import Config
-
-<<<<<<< HEAD
-from occi.core_model import Mixin
-=======
-from occi.core_model import Mixin, Resource, Link, Entity
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-from occi.backend import ActionBackend, KindBackend, MixinBackend
-from occi.extensions.infrastructure import COMPUTE, START, STOP, SUSPEND, RESTART, RESOURCE_TEMPLATE, OS_TEMPLATE
-
-from occi.wsgi import Application
-
-from wsgiref.simple_server import make_server
-from wsgiref.validate import validator
-
-
-class MyBackend(KindBackend, ActionBackend):
-    '''
-    An very simple abstract backend which handles update and replace for
-    attributes. Support for links and mixins would need to added.
-    '''
-
-    def update(self, old, new, extras):
-        # here you can check what information from new_entity you wanna bring
-        # into old_entity
-
-        # trigger your hypervisor and push most recent information
-        print('Updating a resource with id: ' + old.identifier)
-        for item in new.attributes.keys():
-            old.attributes[item] = new.attributes[item]
-
-    def replace(self, old, new, extras):
-        print('Replacing a resource with id: ' + old.identifier)
-        old.attributes = {}
-        for item in new.attributes.keys():
-            old.attributes[item] = new.attributes[item]
-        old.attributes['occi.compute.state'] = 'inactive'
-
-
-class ComputeBackend(MyBackend):
-    '''
-<<<<<<< HEAD
-    A Backend for compute instances.
-=======
-    Backend for Cyclades/Openstack compute instances
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-    '''
-
-    def create(self, entity, extras):
-    
-        for mixin in entity.mixins:
-<<<<<<< HEAD
-            print mixin.term
-            print mixin.attributes
-            if mixin.related[0].term == 'os_tpl':
-                image = mixin.related[0]
-                image_id = mixin.attributes['occi.core.id']
-            if mixin.related[0].term == 'resource_tpl':
-                flavor = mixin.related[0]
-                flavor_id = mixin.attributes['occi.core.id']
-                
-        
-        entity.attributes['occi.compute.state'] = 'active'
-        entity.actions = [STOP, SUSPEND, RESTART]
-
-        #TODO VM identifier
-=======
-            if mixin.related[0].term == 'os_tpl':
-                image = mixin
-                image_id = mixin.attributes['occi.core.id']
-            if mixin.related[0].term == 'resource_tpl':
-                flavor = mixin
-                flavor_id = mixin.attributes['occi.core.id']
-                
-        entity.attributes['occi.compute.state'] = 'active'
-        entity.actions = [STOP, SUSPEND, RESTART]
-
-        #Registry identifier is the uuid key occi.handler assigns
-        #attribute 'occi.core.id' will be the snf-server id
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-
-        snf = ComputeClient(Config())
-        vm_name = entity.attributes['occi.compute.hostname']
-        info = snf.create_server(vm_name, flavor_id, image_id)
-        entity.attributes['occi.core.id'] = str(info['id'])
-<<<<<<< HEAD
-
-    def retrieve(self, entity, extras):
-        # triggering cyclades to retrieve up to date information
-
-=======
-        entity.attributes['occi.compute.cores'] = flavor.attributes['occi.compute.cores']
-        entity.attributes['occi.compute.memory'] = flavor.attributes['occi.compute.memory']
-
-    def retrieve(self, entity, extras):
-        
-        # triggering cyclades to retrieve up to date information
 
-        snf = ComputeClient(Config())
 
-        vm_id = int(entity.attributes['occi.core.id'])
-        vm_info = snf.get_server_details(vm_id)
-        vm_state = vm_info['status']
-        
-        status_dict = {'ACTIVE' : 'active',
-                       'STOPPED' : 'inactive',
-                       'ERROR' : 'inactive',
-                       'BUILD' : 'inactive',
-                       'DELETED' : 'inactive',
-                       }
-        
-        entity.attributes['occi.compute.state'] = status_dict[vm_state]
-
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-        if entity.attributes['occi.compute.state'] == 'inactive':
-            entity.actions = [START]
-        if entity.attributes['occi.compute.state'] == 'active': 
-            entity.actions = [STOP, SUSPEND, RESTART]
-        if entity.attributes['occi.compute.state'] == 'suspended':
-            entity.actions = [START]
-
-<<<<<<< HEAD
-    def delete(self, entity, extras):
-        # call the management framework to delete this compute instance...
-        print('Removing representation of virtual machine with id: '
-              + entity.identifier)
-=======
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>
+    Log in to your Bitbucket account
+</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta name="description" content="Log in to your Bitbucket account." />
+  <meta name="keywords" content="code hosting free bitbucket mercurial subversion git free" />
+  <!--[if lt IE 9]>
+  <script src="https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/js/lib/html5.js"></script>
+  <![endif]-->
+
+  <script>
+    (function (window) {
+      // prevent stray occurrences of `console.log` from causing errors in IE
+      var console = window.console || (window.console = {});
+      console.log || (console.log = function () {});
+
+      var BB = window.BB || (window.BB = {});
+      BB.debug = false;
+      BB.cname = false;
+      BB.CANON_URL = 'https://bitbucket.org';
+      BB.MEDIA_URL = 'https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/';
+      BB.images = {
+        noAvatar: 'https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/img/no_avatar.png'
+      };
+      BB.user = {"isKbdShortcutsEnabled": true, "isSshEnabled": false};
+      BB.user.has = (function () {
+        var betaFeatures = [];
+        betaFeatures.push('repo2');
+        return function (feature) {
+          return _.contains(betaFeatures, feature);
+        };
+      }());
+      BB.targetUser = BB.user;
+  
+      BB.repo || (BB.repo = {});
+  
+    }(this));
+  </script>
+
+  
+
+
+  <link rel="stylesheet" href="https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/bun/css/bundle.css"/>
+
+
+
+  <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Bitbucket" />
+  <link rel="icon" href="https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/img/logo_new.png" type="image/png" />
+  <link type="text/plain" rel="author" href="/humans.txt" />
+
+
+  
+    <script src="https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/bun/js/bundle.js"></script>
+  
+
+
+
+</head>
+
+<body id="" class="">
+  <script>
+    if (navigator.userAgent.indexOf(' AppleWebKit/') === -1) {
+      $('body').addClass('non-webkit')
+    }
+    $('body')
+      .addClass($.client.os.toLowerCase())
+      .addClass($.client.browser.toLowerCase())
+  </script>
+  <!--[if IE 8]>
+  <script>jQuery(document.body).addClass('ie8')</script>
+  <![endif]-->
+  <!--[if IE 9]>
+  <script>jQuery(document.body).addClass('ie9')</script>
+  <![endif]-->
+
+  <div id="wrapper">
+
+
+
+  <div id="header-wrap">
+    <div id="header">
+    <ul id="global-nav">
+      <li><a class="home" href="http://www.atlassian.com">Atlassian Home</a></li>
+      <li><a class="docs" href="http://confluence.atlassian.com/display/BITBUCKET">Documentation</a></li>
+      <li><a class="support" href="/support">Support</a></li>
+      <li><a class="blog" href="http://blog.bitbucket.org">Blog</a></li>
+      <li><a class="forums" href="http://groups.google.com/group/bitbucket-users">Forums</a></li>
+    </ul>
+    <a href="/" id="logo">Bitbucket by Atlassian</a>
+
+    <div id="main-nav">
+    
+      <ul class="clearfix">
+        <li><a href="/plans">Pricing &amp; signup</a></li>
+        <li><a id="explore-link" href="/explore">Explore Bitbucket</a></li>
+        <li class="active"><a href="/account/signin/?next=/account/signin/%3Fnext%3D/nemo32/snf-occi/src/592e811729d5/snf-occi-server.py">Log in</a></li>
         
 
+<li class="search-box">
+  
+    <form action="/repo/all">
+      <input type="search" results="5" autosave="bitbucket-explore-search"
+             name="name" id="searchbox"
+             placeholder="owner/repo" />
+  
+  </form>
+</li>
+
+      </ul>
+    
+    </div>
 
-    def delete(self, entity, extras):
-        # delete vm with vm_id = entity.attributes['occi.core.id']
-        snf = ComputeClient(Config())
-        vm_id = int(entity.attributes['occi.core.id'])
-        snf.delete_server(vm_id)
-
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-
-    def action(self, entity, action, extras):
-        if action not in entity.actions:
-            raise AttributeError("This action is currently no applicable.")
-        elif action == START:
-            entity.attributes['occi.compute.state'] = 'active'
-            entity.actions = [STOP, SUSPEND, RESTART]
-            # read attributes from action and do something with it :-)
-            print('Starting virtual machine with id' + entity.identifier)
-        elif action == STOP:
-            entity.attributes['occi.compute.state'] = 'inactive'
-            entity.actions = [START]
-            # read attributes from action and do something with it :-)
-            print('Stopping virtual machine with id' + entity.identifier)
-        elif action == RESTART:
-            entity.actions = [STOP, SUSPEND, RESTART]
-            entity.attributes['occi.compute.state'] = 'active'
-            # read attributes from action and do something with it :-)
-            print('Restarting virtual machine with id' + entity.identifier)
-        elif action == SUSPEND:
-            entity.attributes['occi.compute.state'] = 'suspended'
-            entity.actions = [START]
-            # read attributes from action and do something with it :-)
-            print('Suspending virtual machine with id' + entity.identifier)
-
-
-class MyAPP(Application):
-    '''
-    An OCCI WSGI application.
-    '''
-
-    def __call__(self, environ, response):
-        sec_obj = {'username': 'password'}
-
-<<<<<<< HEAD
-
-        #Refresh registry entries with current Cyclades state
-        snf = ComputeClient(Config())
-
-=======
-        
-        #Refresh registry entries with current Cyclades state
-        snf = ComputeClient(Config())
-
-        '''
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-        images = snf.list_images()
-        for image in images:
-            IMAGE_ATTRIBUTES = {'occi.core.id': str(image['id'])}
-            IMAGE = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(image['name']), [OS_TEMPLATE], attributes = IMAGE_ATTRIBUTES)
-            self.register_backend(IMAGE, MixinBackend())
-
-        flavors = snf.list_flavors()
-        for flavor in flavors:
-            FLAVOR_ATTRIBUTES = {'occi.core.id': flavor['id'],
-                                 'occi.compute.cores': snf.get_flavor_details(flavor['id'])['cpu'],
-                                 'occi.compute.memory': snf.get_flavor_details(flavor['id'])['ram'],
-                                 'occi.storage.size': snf.get_flavor_details(flavor['id'])['disk'],
-                                 }
-            FLAVOR = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(flavor['name']), [RESOURCE_TEMPLATE], attributes = FLAVOR_ATTRIBUTES)
-            self.register_backend(FLAVOR, MixinBackend())
-<<<<<<< HEAD
-        
-        #TODO show only current VM instances
-                
-=======
-            '''       
+  
 
-        #TODO show only current VM instances
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-        
-        return self._call_occi(environ, response, security=sec_obj, foo=None)
-
-if __name__ == '__main__':
-
-    APP = MyAPP()
-
-    COMPUTE_BACKEND = ComputeBackend()
-
-    APP.register_backend(COMPUTE, COMPUTE_BACKEND)
-    APP.register_backend(START, COMPUTE_BACKEND)
-    APP.register_backend(STOP, COMPUTE_BACKEND)
-    APP.register_backend(RESTART, COMPUTE_BACKEND)
-    APP.register_backend(SUSPEND, COMPUTE_BACKEND)
-    APP.register_backend(RESOURCE_TEMPLATE, MixinBackend())
-    APP.register_backend(OS_TEMPLATE, MixinBackend())
-    
-<<<<<<< HEAD
-=======
-    snf = ComputeClient(Config())
-    
-    images = snf.list_images()
-    for image in images:
-        IMAGE_ATTRIBUTES = {'occi.core.id': str(image['id'])}
-        IMAGE = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(image['name']), [OS_TEMPLATE], attributes = IMAGE_ATTRIBUTES)
-        APP.register_backend(IMAGE, MixinBackend())
-
-    flavors = snf.list_flavors()
-    for flavor in flavors:
-        FLAVOR_ATTRIBUTES = {'occi.core.id': flavor['id'],
-                             'occi.compute.cores': snf.get_flavor_details(flavor['id'])['cpu'],
-                             'occi.compute.memory': snf.get_flavor_details(flavor['id'])['ram'],
-                             'occi.storage.size': snf.get_flavor_details(flavor['id'])['disk'],
-                             }
-        FLAVOR = Mixin("http://schemas.ogf.org/occi/infrastructure#", str(flavor['name']), [RESOURCE_TEMPLATE], attributes = FLAVOR_ATTRIBUTES)
-        APP.register_backend(FLAVOR, MixinBackend())
-
->>>>>>> 592e811729d5f061377c854f645311e560ec4faa
-    VALIDATOR_APP = validator(APP)
-    HTTPD = make_server('', 8888, VALIDATOR_APP)
-    HTTPD.serve_forever()
+    </div>
+  </div>
+
+    <div id="header-messages">
+  
+  
+    
+    
+    
+    
+  
+
+    
+   </div>
+
+
+
+    <div id="content">
+      <div id="sign-in">
+      
+
+      
+  
+
+  <h1>Log in</h1>
+  <div class="standard newform">
+    
+    <form action="/account/signin/" method="post"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='ccbf688583139b178be00ff634ee0ddc' /></div>
+      <input type="hidden" name="next" value="/nemo32/snf-occi/src/592e811729d5/snf-occi-server.py" />
+    
+    
+      <div class="required">
+        <label for="id_username">Username or email</label>
+        <input type="text" id="id_username" name="username" autofocus="autofocus" />
+      </div>
+    
+    
+      <div class="required">
+        <label for="id_password">Password</label>
+        <input type="password" id="id_password" name="password" />
+        <p class="description"><a href="/account/password/reset/" tabindex="-1">Reset password</a></p>
+      </div>
+    
+      <div class="submit">
+        <input type="submit" value="Log in" name="submit" />
+      </div>
+    </form>
+  </div>
+
+  <div class="opensocial">
+    
+
+<form id="openid_form" action="/account/openid/redirect/" class="newform">
+<div><input name="next" type="hidden" value="/nemo32/snf-occi/src/592e811729d5/snf-occi-server.py" /></div>
+  <label>OpenID provider</label>
+  <ul class="badges">
+    <li><a href="/account/openid/redirect/?openid_provider=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid&next=/nemo32/snf-occi/src/592e811729d5/snf-occi-server.py"
+           title="Google">Google</a></li>
+    <li><a href="/account/openid/redirect/?openid_provider=http%3A%2F%2Fyahoo.com%2F&next=/nemo32/snf-occi/src/592e811729d5/snf-occi-server.py"
+           title="Yahoo!">Yahoo!</a></li>
+    <li><a href="#aol" title="AOL" data-url="http://openid.aol.com/{id}">AOL</a></li>
+    <li><a href="#openid" title="OpenID" data-url="{id}">OpenID</a></li>
+    <li><a href="#myopenid" title="MyOpenID" data-url="http://{id}.myopenid.com/">MyOpenID</a></li>
+    <li><a href="#livejournal" title="LiveJournal" data-url="http://{id}.livejournal.com/">LiveJournal</a></li>
+    <li><a href="#flickr" title="Flickr" data-url="http://flickr.com/{id}/">Flickr</a></li>
+    <li><a href="#wordpress" title="WordPress" data-url="http://{id}.wordpress.com/">WordPress</a></li>
+    <li><a href="#verisign" title="VeriSign" data-url="http://{id}.pip.verisignlabs.com/">VeriSign</a></li>
+    <li><a href="#claimid" title="ClaimID" data-url="http://claimid.com/{id}">ClaimID</a></li>
+  </ul>
+  <div class="input-group">
+    <div>
+      <ul class="inputs">
+        <li class="required" id="aol">
+          <label for="aol-username">Username</label>
+          <input type="text" id="aol-username" name="aol-username" />
+        </li>
+        <li class="required" id="openid">
+          <label for="openid-url">OpenID URL</label>
+          <input type="url" id="openid-url" name="openid-url" />
+        </li>
+        <li class="required" id="myopenid">
+          <label for="myopenid-username">Username</label>
+          <input type="text" id="myopenid-username" name="myopenid-username" />
+        </li>
+        <li class="required" id="livejournal">
+          <label for="livejournal-username">Username</label>
+          <input type="text" id="livejournal-username" name="livejournal-username" />
+        </li>
+        <li class="required" id="flickr">
+          <label for="flickr-username">Username</label>
+          <input type="text" id="flickr-username" name="flickr-username" />
+        </li>
+        <li class="required" id="wordpress">
+          <label for="wordpress-username">Username</label>
+          <input type="text" id="wordpress-username" name="wordpress-username" />
+        </li>
+        <li class="required" id="verisign">
+          <label for="verisign-username">Username</label>
+          <input type="text" id="verisign-username" name="verisign-username" />
+        </li>
+        <li class="required" id="claimid">
+          <label for="claimid-username">Username</label>
+          <input type="text" id="claimid-username" name="claimid-username" />
+        </li>
+      </ul>
+    </div>
+    <div class="submit">
+      <input type="hidden" id="openid_provider" name="openid_provider" />
+      <input type="hidden" id="openid_username" name="openid_username" />
+      <input type="submit" id="openid_submit" value="Log in" />
+    </div>
+  </div>
+</form>
+
+  </div>
+  <p>Need an account? <a href="/plans">Sign up now!</a></p>
+  <p class="show-open-id">Switch to <a href="#openid-signin">OpenID sign-in</a><noscript> (enable JavaScript to use this feature)</noscript></p>
+  <p class="show-standard-signin">Switch to <a href="#standard-signin">standard sign-in</a></p>
+
+      </div>
+    </div>
+
+  </div>
+
+  <div id="footer">
+    <ul id="footer-nav">
+      <li>Copyright © 2012 <a href="http://atlassian.com">Atlassian</a></li>
+      <li><a href="http://www.atlassian.com/hosted/terms.jsp">Terms of Service</a></li>
+      <li><a href="http://www.atlassian.com/about/privacy.jsp">Privacy</a></li>
+      <li><a href="//bitbucket.org/site/master/issues/new">Report a Bug to Bitbucket</a></li>
+      <li><a href="http://confluence.atlassian.com/x/IYBGDQ">API</a></li>
+      <li><a href="http://status.bitbucket.org/">Server Status</a></li>
+    </ul>
+    <ul id="social-nav">
+      <li class="blog"><a href="http://blog.bitbucket.org">Bitbucket Blog</a></li>
+      <li class="twitter"><a href="http://www.twitter.com/bitbucket">Twitter</a></li>
+    </ul>
+    <h5>We run</h5>
+    <ul id="technologies">
+      <li><a href="http://www.djangoproject.com/">Django 1.3.1</a></li>
+      <li><a href="//bitbucket.org/jespern/django-piston/">Piston 0.3dev</a></li>
+      <li><a href="http://git-scm.com/">Git 1.7.6</a></li>
+      <li><a href="http://www.selenic.com/mercurial/">Hg 1.9.1</a></li>
+      <li><a href="http://www.python.org">Python 2.7.2</a></li>
+      <li>cb37df9fcb23 | bitbucket02</li>
+    </ul>
+  </div>
+
+  <script src="https://dwz7u9t8u8usb.cloudfront.net/m/e14058e2cf3f/js/lib/global.js"></script>
+
+
+
+
+
+
+  <script>
+    BB.gaqPush(['_trackPageview']);
+  
+    BB.gaqPush(['atl._trackPageview']);
+
+    
+
+    
+
+    (function () {
+        var ga = document.createElement('script');
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        ga.setAttribute('async', 'true');
+        document.documentElement.firstChild.appendChild(ga);
+    }());
+  </script>
 
+</body>
+</html>