def __init__(self, storage_id, queue_name, policy_uri, log_group=None, metrics=None, output_dir=None): logging.basicConfig(level=logging.INFO, format='%(message)s') log.info("Running Azure Cloud Custodian Self-Host") resources.load_available() self.session = local_session(Session) self.storage_session = self.session storage_subscription_id = ResourceIdParser.get_subscription_id(storage_id) if storage_subscription_id != self.session.subscription_id: self.storage_session = Session(subscription_id=storage_subscription_id) # Load configuration self.options = Host.build_options(output_dir, log_group, metrics) self.policy_storage_uri = policy_uri self.event_queue_id = storage_id self.event_queue_name = queue_name # Default event queue name is the subscription ID if not self.event_queue_name: self.event_queue_name = self.session.subscription_id # Prepare storage bits self.policy_blob_client = None self.blob_cache = {} self.queue_storage_account = self.prepare_queue_storage( self.event_queue_id, self.event_queue_name) self.queue_service = None # Register event subscription self.update_event_subscription() # Policy cache and dictionary self.policy_cache = tempfile.mkdtemp() self.policies = {} # Configure scheduler self.scheduler = BlockingScheduler(Host.get_scheduler_config()) logging.getLogger('apscheduler.executors.default').setLevel(logging.ERROR) logging.getLogger('apscheduler').setLevel(logging.ERROR) # Schedule recurring policy updates self.scheduler.add_job(self.update_policies, 'interval', seconds=policy_update_seconds, id="update_policies", next_run_time=datetime.now(), executor='threadpool') # Schedule recurring queue polling self.scheduler.add_job(self.poll_queue, 'interval', seconds=queue_poll_seconds, id="poll_queue", executor='threadpool') self.scheduler.start()
def main(input): logging.info("Running Azure Cloud Custodian Policy") context = { 'config_file': join(function_directory, 'config.json'), 'auth_file': join(function_directory, 'auth.json') } event = None subscription_id = None if isinstance(input, QueueMessage): if input.dequeue_count > max_dequeue_count: return event = input.get_json() subscription_id = ResourceIdParser.get_subscription_id(event['subject']) handler.run(event, context, subscription_id)
def main(input): logging.info("Running Azure Cloud Custodian Policy") context = { 'config_file': join(dirname(__file__), 'config.json'), 'auth_file': join(dirname(__file__), 'auth.json') } event = None subscription_id = None if type(input) is QueueMessage: if input.dequeue_count > max_dequeue_count: return event = input.get_json() subscription_id = ResourceIdParser.get_subscription_id(event['subject']) handler.run(event, context, subscription_id)
def prepare_queue_storage(self, queue_resource_id, queue_name): """ Create a storage client using unusual ID/group reference as this is what we require for event subscriptions """ # Use a different session object if the queue is in a different subscription queue_subscription_id = ResourceIdParser.get_subscription_id( queue_resource_id) if queue_subscription_id != self.session.subscription_id: session = Session(queue_subscription_id) else: session = self.session storage_client = session.client( 'azure.mgmt.storage.StorageManagementClient') account = storage_client.storage_accounts.get_properties( ResourceIdParser.get_resource_group(queue_resource_id), ResourceIdParser.get_resource_name(queue_resource_id)) Storage.create_queue_from_storage_account(account, queue_name, self.session) return account
def test_get_subscription_id(self): self.assertEqual(ResourceIdParser.get_subscription_id(RESOURCE_ID), DEFAULT_SUBSCRIPTION_ID)
def test_get_subscription_id(self): self.assertEqual(ResourceIdParser.get_subscription_id(RESOURCE_ID), DEFAULT_SUBSCRIPTION_ID)