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 5.74 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.  
  12.  
  13.  
  14. class CreateImageHandler(object):
  15.     filter_rule = oslo_messaging.notify.filter.NotificationFilter(
  16.         publisher_id='^image.*', event_type='^image\.create')
  17.  
  18.     def info(self, ctxt, publisher_id, event_type, payload, metadata):
  19.         print "!!! IMAGE CREATE CATCHED WITH FILTER !!!"
  20.         print "payload: %s" % payload
  21.         bd_mapping = payload['properties'].get('block_device_mapping')
  22.         if bd_mapping:
  23.             bd_mapping_json = json.loads(bd_mapping)
  24.             cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  25.                                    OS_TENANT_NAME, OS_AUTH_URL)
  26.             new_bd_mapping = []
  27.             update_info = False
  28.             for elem in bd_mapping_json:
  29.                 snap_id = elem.get('snapshot_id')
  30.                 if snap_id:
  31.                     catch_image_id = payload.get('id')
  32.                     print "snapshot_id: %s" % snap_id
  33.                     snap_size = cinder.volume_snapshots.get(snap_id).size
  34.                     print "snapshot_size: %s" % snap_size
  35.                     time.sleep(60)
  36.                     volume = cinder.volumes.create(size=snap_size,
  37.                                                    snapshot_id=snap_id)
  38.                     print "VOLUME CREATED"
  39.                     while cinder.get(volume.id).status != 'available':
  40.                         print cinder.get(volume.id).status
  41.                         time.sleep(1)
  42.                     print "volume: %s" % volume.id
  43.                     image = cinder.volumes.upload_to_image(volume=volume.id,
  44.                                                            image_name="test_name",
  45.                                                            force=False,
  46.                                                            container_format="bare",
  47.                                                            disk_format="raw")
  48.                     print "IMAGE_CREATED"
  49.                     new_elem = elem
  50.                     print new_elem
  51.                     new_elem.update({'snapshot_id': None,
  52.                                      'image_id': image.id,
  53.                                      'source_type': 'image'})
  54.                     new_bd_mapping.append(new_elem)
  55.                     print new_elem
  56.                     update_info = True
  57.                     cinder.volumes.delete(volume.id)
  58.                     print "VOLUME DELETED"
  59.                     cinder.volume_snapshots.delete(snap_id)
  60.                     print "SNAPSHOT DELETED"
  61.             if update_info:
  62.                 new_info = json.JSONEncoder().encode(new_bd_mapping)
  63.                 keystone = k_client.Client(username=OS_USERNAME,
  64.                                            password=OS_PASSWORD,
  65.                                            tenant_name=OS_TENANT_NAME,
  66.                                            auth_url=OS_AUTH_URL)
  67.                 token = keystone.auth_token
  68.                 glance = Client('1', endpoint='',
  69.                                 token=token)
  70.                 glance.images.update(catch_image_id,
  71.                                      properties=dict(block_device_mapping=new_info))
  72.  
  73.  
  74. class DeleteImageHandler(object):
  75.     filter_rule = oslo_messaging.notify.filter.NotificationFilter(
  76.         publisher_id='^image.*', event_type='^image\.delete')
  77.  
  78.     def info(self, ctxt, publisher_id, event_type, payload, metadata):
  79.         print "!!! IMAGE DELETE CATCHED WITH FILTER !!!"
  80.         print "publisher_id: %s" % publisher_id
  81.         print "payload: %s" % payload
  82.         bd_mapping = payload['properties'].get('block_device_mapping')
  83.         if bd_mapping:
  84.             bd_mapping_json = json.loads(bd_mapping)
  85.             for elem in bd_mapping_json:
  86.                 snapshot_id = elem.get('snapshot_id')
  87.                 print snapshot_id
  88.                 if snapshot_id:
  89.                     cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  90.                                            OS_TENANT_NAME, OS_AUTH_URL)
  91.                     cinder.volume_snapshots.delete(snapshot_id)
  92.                     print "SNAPSHOT DELETED"
  93.                 volume_id = elem.get('volume_id')
  94.                 if volume_id:
  95.                     cinder = client.Client('2', OS_USERNAME, OS_PASSWORD,
  96.                                            OS_TENANT_NAME, OS_AUTH_URL)
  97.                     cinder.volumes.delete(volume_id)
  98.                     print "VOLUME DELETED"
  99.                 image_id = elem.get('image_id')
  100.                 if image_id:
  101.                     keystone = k_client.Client(username=OS_USERNAME,
  102.                                                password=OS_PASSWORD,
  103.                                                tenant_name=OS_TENANT_NAME,
  104.                                                auth_url=OS_AUTH_URL)
  105.                     token = keystone.auth_token
  106.                     glance = Client('1', endpoint='',
  107.                                     token=token)
  108.                     glance.images.delete(image_id)
  109.                     print "IMAGE_DELETE"
  110.  
  111. conn = [cfg.StrOpt('connection')]
  112. db = cfg.OptGroup(name='database')
  113. CONF = cfg.CONF
  114. cfg.CONF(sys.argv[1:])
  115. CONF.register_group(db)
  116. CONF.register_opts(conn, db)
  117. print CONF['database'].connection
  118. print dict(CONF)
  119. transport = oslo_messaging.get_transport(cfg.CONF)
  120. targets = [
  121.     oslo_messaging.Target(topic='notifications'),
  122. ]
  123. endpoints = [
  124.     DeleteImageHandler(),
  125.     CreateImageHandler(),
  126. ]
  127. server = oslo_messaging.get_notification_listener(transport, targets,
  128.                                                   endpoints)
  129. server.start()
  130. server.wait()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement