azure_client.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import logging
  2. from azure.common.credentials import ServicePrincipalCredentials
  3. from azure.mgmt.compute import ComputeManagementClient
  4. from azure.mgmt.network import NetworkManagementClient
  5. from azure.mgmt.resource import ResourceManagementClient
  6. from azure.mgmt.resource.subscriptions import SubscriptionClient
  7. from azure.mgmt.storage import StorageManagementClient
  8. from azure.storage.blob import BlockBlobService, PublicAccess
  9. log = logging.getLogger(__name__)
  10. class AzureClient(object):
  11. def __init__(self, config):
  12. self._config = config
  13. self.subscription_id = config.get('azure_subscription_id')
  14. credentials = ServicePrincipalCredentials(
  15. client_id=config.get('azure_client_Id'),
  16. secret=config.get('azure_secret'),
  17. tenant=config.get('azure_tenant')
  18. )
  19. self._resource_client = ResourceManagementClient(credentials, self.subscription_id)
  20. self._storage_client = StorageManagementClient(credentials, self.subscription_id)
  21. self._network_management_client = NetworkManagementClient(credentials, self.subscription_id)
  22. self._subscription_client = SubscriptionClient(credentials)
  23. self._compute_client = ComputeManagementClient(credentials, self.subscription_id)
  24. access_key_result = self.storage_client.storage_accounts.list_keys(self.resource_group_name,
  25. self.storage_account_name)
  26. self._block_blob_service = BlockBlobService(self.storage_account_name, access_key_result.keys[0].value)
  27. log.debug("azure subscription : %s", self.subscription_id)
  28. @property
  29. def resource_group_name(self):
  30. return self._config.get('azure_resource_group')
  31. @property
  32. def storage_account_name(self):
  33. return self._config.get('azure_storage_account_name')
  34. @property
  35. def region_name(self):
  36. return self._config.get('azure_region_name')
  37. @property
  38. def storage_client(self):
  39. return self._storage_client
  40. @property
  41. def subscription_client(self):
  42. return self._subscription_client
  43. @property
  44. def resource_client(self):
  45. return self._resource_client
  46. @property
  47. def compute_client(self):
  48. return self._compute_client
  49. @property
  50. def network_management_client(self):
  51. return self._network_management_client
  52. @property
  53. def blob_service(self):
  54. return self._block_blob_service
  55. def get_resource_group(self, name):
  56. return self.resource_client.resource_groups.get(name)
  57. def create_resource_group(self, name, parameters):
  58. return self.resource_client.resource_groups.create_or_update(name, parameters)
  59. def list_locations(self):
  60. return self.subscription_client.subscriptions.list_locations(self.subscription_id)
  61. def list_security_group(self, filters=None):
  62. security_groups = FilterList(
  63. self.network_management_client.network_security_groups.list(self.resource_group_name))
  64. security_groups.filter(filters)
  65. return security_groups
  66. def create_security_group(self, name, parameters):
  67. sg_create = self.network_management_client.network_security_groups.create_or_update(self.resource_group_name,
  68. name, parameters)
  69. return sg_create.result()
  70. def create_security_group_rule(self, security_group, rule_name, parameters):
  71. security_rules_operations = self.network_management_client.security_rules
  72. sro = security_rules_operations.create_or_update(self.resource_group_name, security_group, rule_name,
  73. parameters)
  74. result = sro.result()
  75. return result
  76. def delete_security_group_rule(self, name, security_group):
  77. security_rules_operations = self.network_management_client.security_rules
  78. sro = security_rules_operations.delete(self.resource_group_name, security_group, name)
  79. return sro.result()
  80. def get_security_group(self, name):
  81. return self.network_management_client.network_security_groups.get(self.resource_group_name, name)
  82. def delete_security_group(self, name):
  83. return self.network_management_client.network_security_groups.delete(self.resource_group_name, name)
  84. def list_containers(self, filters=None):
  85. containers = FilterList(self.blob_service.list_containers())
  86. containers.filter(filters)
  87. return containers
  88. def create_container(self, container_name):
  89. self.blob_service.create_container(container_name, public_access=PublicAccess.Container)
  90. return self.blob_service.get_container_properties(container_name)
  91. def get_container(self, container_name):
  92. return self.blob_service.get_container_properties(container_name)
  93. def delete_container(self, container_name):
  94. self.blob_service.delete_container(container_name)
  95. return None
  96. def list_blobs(self, container_name):
  97. return self.blob_service.list_blobs(container_name)
  98. def get_blob(self, container_name, blob_name):
  99. return self.blob_service.get_blob_properties(container_name, blob_name)
  100. def create_blob_from_text(self, container_name, blob_name, text):
  101. self.blob_service.create_blob_from_text(container_name, blob_name, text)
  102. return None
  103. def create_blob_from_file(self, container_name, blob_name, file_path):
  104. self.blob_service.create_blob_from_path(container_name, blob_name, file_path)
  105. return None
  106. def delete_blob(self, container_name, blob_name):
  107. self.blob_service.delete_blob(container_name, blob_name)
  108. def get_blob_url(self, container_name, blob_name):
  109. return self.blob_service.make_blob_url(container_name, blob_name)
  110. def get_blob_content(self, container_name, blob_name):
  111. return self.blob_service.get_blob_to_text(container_name, blob_name)
  112. def create_empty_disk(self, disk_name, size, region=None, snapshot_id=None):
  113. if snapshot_id:
  114. return self.create_snapshot_disk(disk_name, snapshot_id, region)
  115. async_creation = self.compute_client.disks.create_or_update(
  116. self.resource_group_name,
  117. disk_name,
  118. {
  119. 'location': region or self.region_name,
  120. 'disk_size_gb': size,
  121. 'creation_data': {
  122. 'create_option': 'empty'
  123. }
  124. }
  125. )
  126. disk_resource = async_creation.result()
  127. return disk_resource
  128. def create_snapshot_disk(self, disk_name, snapshot_id, region=None):
  129. async_creation = self.compute_client.disks.create_or_update(
  130. self.resource_group_name,
  131. disk_name,
  132. {
  133. 'location': region or self.region_name,
  134. 'creation_data': {
  135. 'create_option': 'copy',
  136. 'source_uri': snapshot_id
  137. }
  138. }
  139. )
  140. disk_resource = async_creation.result()
  141. return disk_resource
  142. def get_disk(self, disk_name):
  143. return self.compute_client.disks.get(self.resource_group_name, disk_name)
  144. # TODO: find out a better way.
  145. class FilterList(list):
  146. def filter(self, filters):
  147. filtered_list = []
  148. if filters:
  149. for obj in self:
  150. for key in filters:
  151. print('original value ' + str(getattr(obj, key)) + ' key value ' + filters[key])
  152. if filters[key] not in str(getattr(obj, key)):
  153. print("removing " + str(getattr(obj, key)))
  154. filtered_list.append(obj)
  155. # self.remove(obj)
  156. for s in filtered_list:
  157. self.remove(s)