Advertisement
Guest User

Untitled

a guest
Jul 26th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.52 KB | None | 0 0
  1. from oslo_config import cfg
  2. import oslo_messaging
  3. import sys
  4. import json
  5. import time
  6.  
  7. from keystoneclient.v2_0 import client as k_client
  8. from glanceclient import Client
  9. from cinderclient import client
  10.  
  11. OS_TENANT_NAME = "admin_tenant"
  12. OS_USERNAME = "admin"
  13. OS_PASSWORD = "6dDFjG#_"
  14. OS_NO_CACHE = True
  15. OS_AUTH_URL = "http://localhost:35357/v2.0/"
  16. OS_REGION_NAME = "RegionOne"
  17. OS_DOMAIN_NAME = 'default'
  18. OS_PROJECT_NAME = OS_TENANT_NAME
  19.  
  20.  
  21. class CreateImageHandler(object):
  22.     filter_rule = oslo_messaging.notify.filter.NotificationFilter(
  23.         publisher_id='^image.*', event_type='^image\.create')
  24.  
  25.     def info(self, ctxt, publisher_id, event_type, payload, metadata):
  26.         print "!!! IMAGE CREATE CATCHED WITH FILTER !!!"
  27.         print "payload: %s" % payload
  28.         bd_mapping = payload['properties'].get('block_device_mapping')
  29.         if bd_mapping:
  30.             bd_mapping_json = json.loads(bd_mapping)
  31.             cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  32.                                    OS_TENANT_NAME, OS_AUTH_URL)
  33.             new_bd_mapping = []
  34.             update_info = False
  35.             for elem in bd_mapping_json:
  36.                 snap_id = elem.get('snapshot_id')
  37.                 if snap_id:
  38.                     catch_image_id = payload.get('id')
  39.                     print "snapshot_id: %s" % snap_id
  40.                     snap_size = cinder.volume_snapshots.get(snap_id).size
  41.                     print "snapshot_size: %s" % snap_size
  42.                     while cinder.volume_snapshots.get(snap_id).status != 'available':
  43.                         if cinder.volume_snapshots.get(snap_id).status == 'error':
  44.                             print "errrorrrrr"
  45.                             break
  46.                         print cinder.volume_snapshots.get(snap_id).status
  47.                         time.sleep(1)
  48.                     volume = cinder.volumes.create(size=snap_size,
  49.                                                    snapshot_id=snap_id)
  50.                     print "VOLUME CREATED"
  51.                     while cinder.volumes.get(volume.id).status != 'available':
  52.                         if cinder.volumes.get(snap_id).status == 'error':
  53.                             print "errrorrrrr"
  54.                             break
  55.                         print cinder.volumes.get(volume.id).status
  56.                         time.sleep(1)
  57.                     print "volume: %s" % volume.id
  58.                     image = cinder.volumes.upload_to_image(volume=volume.id,
  59.                                                            image_name="test_name",
  60.                                                            force=False,
  61.                                                            container_format="bare",
  62.                                                            disk_format="raw")
  63.                     print "IMAGE_CREATED"
  64.                     new_elem = elem
  65.                     print new_elem
  66.                     new_elem.update({'snapshot_id': None,
  67.                                      'image_id': image.id,
  68.                                      'source_type': 'image'})
  69.                     new_bd_mapping.append(new_elem)
  70.                     print new_elem
  71.                     update_info = True
  72.                     cinder.volumes.delete(volume.id)
  73.                     print "VOLUME DELETED"
  74.                     cinder.volume_snapshots.delete(snap_id)
  75.                     print "SNAPSHOT DELETED"
  76.             if update_info:
  77.                 new_info = json.JSONEncoder().encode(new_bd_mapping)
  78.                 keystone = k_client.Client(username=OS_USERNAME,
  79.                                            password=OS_PASSWORD,
  80.                                            tenant_name=OS_TENANT_NAME,
  81.                                            auth_url=OS_AUTH_URL)
  82.                 token = keystone.auth_token
  83.                 glance = Client('1', endpoint='http://10.11.3.11:9292/v1',
  84.                                 token=token)
  85.                 glance.images.update(catch_image_id,
  86.                                      properties=dict(block_device_mapping=new_info))
  87.  
  88.  
  89. class DeleteImageHandler(object):
  90.     filter_rule = oslo_messaging.notify.filter.NotificationFilter(
  91.         publisher_id='^image.*', event_type='^image\.delete')
  92.  
  93.     def info(self, ctxt, publisher_id, event_type, payload, metadata):
  94.         print "!!! IMAGE DELETE CATCHED WITH FILTER !!!"
  95.         print "publisher_id: %s" % publisher_id
  96.         print "payload: %s" % payload
  97.         bd_mapping = payload['properties'].get('block_device_mapping')
  98.         if bd_mapping:
  99.             bd_mapping_json = json.loads(bd_mapping)
  100.             for elem in bd_mapping_json:
  101.                 snapshot_id = elem.get('snapshot_id')
  102.                 print snapshot_id
  103.                 if snapshot_id:
  104.                     cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  105.                                            OS_TENANT_NAME, OS_AUTH_URL)
  106.                     cinder.volume_snapshots.delete(snapshot_id)
  107.                     print "SNAPSHOT DELETED"
  108.                 volume_id = elem.get('volume_id')
  109.                 if volume_id:
  110.                     cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  111.                                            OS_TENANT_NAME, OS_AUTH_URL)
  112.                     cinder.volumes.delete(volume_id)
  113.                     print "VOLUME DELETED"
  114.                 image_id = elem.get('image_id')
  115.                 if image_id:
  116.                     keystone = k_client.Client(username=OS_USERNAME,
  117.                                                password=OS_PASSWORD,
  118.                                                tenant_name=OS_TENANT_NAME,
  119.                                                auth_url=OS_AUTH_URL)
  120.                     token = keystone.auth_token
  121.                     glance = Client('1', endpoint='http://10.11.3.11:9292/v1',
  122.                                     token=token)
  123.                     glance.images.delete(image_id)
  124.                     print "IMAGE_DELETE"
  125.  
  126. conn = [cfg.StrOpt('connection')]
  127. db = cfg.OptGroup(name='database')
  128. CONF = cfg.CONF
  129. cfg.CONF(sys.argv[1:])
  130. CONF.register_group(db)
  131. CONF.register_opts(conn, db)
  132. print CONF['database'].connection
  133. print dict(CONF)
  134. transport = oslo_messaging.get_transport(cfg.CONF)
  135. targets = [
  136.     oslo_messaging.Target(topic='notifications'),
  137. ]
  138. endpoints = [
  139.     DeleteImageHandler(),
  140.     CreateImageHandler(),
  141. ]
  142. server = oslo_messaging.get_notification_listener(transport, targets,
  143.                                                   endpoints)
  144. server.start()
  145. server.wait()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement