def testGetAndValidateParametersMissingRequiredNotSpecified(self): self._MakeEventType(include_props=True) args = self.parser.parse_args([]) with self.assertRaises( exceptions.MissingRequiredEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('prop0', str(ctx.exception))
def testGetAndValidateParametersFromFileAndSecretParameters(self): self._MakeEventType(include_props=True, include_secret_props=True) filename = self._MakeTempFile(""" prop0: value prop1: value prop2: value """) args = self.parser.parse_args([ '--parameters-from-file', filename, '--secrets=prop3Secret=name:value,prop4Secret=name:value' ]) expected = { 'prop0': 'value', 'prop1': 'value', 'prop2': 'value', 'prop3Secret': { 'name': 'name', 'key': 'value' }, 'prop4Secret': { 'name': 'name', 'key': 'value' } } self.assertDictEqual( expected, flags.GetAndValidateParameters(args, self.event_type))
def testGetAndValidateParameters(self): self._MakeEventType(include_props=True) args = self.parser.parse_args( ['--parameters=prop0=value,prop1=value,prop2=value']) expected = {'prop0': 'value', 'prop1': 'value', 'prop2': 'value'} self.assertDictEqual( expected, flags.GetAndValidateParameters(args, self.event_type))
def testGetAndValidateParametersUnknown(self): self._MakeEventType(include_props=True) args = self.parser.parse_args( ['--parameters=prop0=value,unknown=value']) with self.assertRaises(exceptions.UnknownEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('unknown', str(ctx.exception))
def testGetAndValidateSecretParametersMissingRequired(self): self._MakeEventType(include_secret_props=True) args = self.parser.parse_args(['--secrets=prop1Secret=name:value']) with self.assertRaises( exceptions.MissingRequiredEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('prop0Secret', str(ctx.exception))
def testGetAndValidateParametersFromFileUnknown(self): self._MakeEventType(include_props=True) filename = self._MakeTempFile(""" prop0: value unknown: value """) args = self.parser.parse_args(['--parameters-from-file', filename]) with self.assertRaises(exceptions.UnknownEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('unknown', str(ctx.exception))
def testGetAndValidateSecretParametersUnknownMultiple(self): self._MakeEventType(include_secret_props=True) args = self.parser.parse_args([ '--secrets=prop0Secret=name:value,unknownSecret=name:value,' 'anotherUnknownSecret=name:value' ]) with self.assertRaises(exceptions.UnknownEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('unknownSecret', str(ctx.exception)) self.assertIn('anotherUnknownSecret', str(ctx.exception))
def testGetAndValidateParametersFromFileMissingRequired(self): self._MakeEventType(include_props=True) filename = self._MakeTempFile(""" prop1: value prop2: value """) args = self.parser.parse_args(['--parameters-from-file', filename]) with self.assertRaises( exceptions.MissingRequiredEventTypeParameters) as ctx: flags.GetAndValidateParameters(args, self.event_type) self.assertIn('prop0', str(ctx.exception))
def testGetAndValidateParametersFromFile(self): self._MakeEventType(include_props=True) filename = self._MakeTempFile(""" prop0: value prop1: value prop2: value """) args = self.parser.parse_args(['--parameters-from-file', filename]) expected = {'prop0': 'value', 'prop1': 'value', 'prop2': 'value'} self.assertDictEqual( expected, flags.GetAndValidateParameters(args, self.event_type))
def Run(self, args): conn_context = connection_context.GetConnectionContext( args, product=connection_context.Product.EVENTS) if conn_context.supports_one_platform: raise exceptions.UnsupportedArgumentError( 'Events are only available with Cloud Run for Anthos.') trigger_ref = args.CONCEPTS.trigger.Parse() namespace_ref = trigger_ref.Parent() with eventflow_operations.Connect(conn_context) as client: source_crds = client.ListSourceCustomResourceDefinitions() event_type = util.EventTypeFromTypeString(source_crds, args.type) source_obj = source.Source.New(client.client, namespace_ref.Name(), event_type.crd.source_kind, event_type.crd.source_api_category) source_obj.name = _SOURCE_NAME_PATTERN.format( trigger=trigger_ref.Name()) trigger_obj = client.GetTrigger(trigger_ref) if trigger_obj is not None: # If trigger already exists, validate it has the attributes we're trying # to set right now. try: util.ValidateTrigger(trigger_obj, source_obj, event_type) except AssertionError: raise exceptions.TriggerCreationError( 'Trigger [{}] already exists with attributes not ' 'matching this event type.'.format(trigger_obj.name)) # If the trigger has the right attributes, check if there's already # a source that matches the attributes as well. source_ref = util.GetSourceRef( source_obj.name, source_obj.namespace, event_type.crd) if client.GetSource(source_ref, event_type.crd) is not None: raise exceptions.TriggerCreationError( 'Trigger [{}] already exists.'.format(trigger_obj.name)) parameters = events_flags.GetAndValidateParameters(args, event_type) # Create the trigger and source with progress_tracker.StagedProgressTracker( 'Initializing trigger...', stages.TriggerSourceStages(), failure_message='Trigger creation failed') as tracker: client.CreateTriggerAndSource( trigger_obj, trigger_ref, namespace_ref, source_obj, event_type, parameters, args.broker, args.target_service, tracker )
def testGetAndValidateSecretParameters(self): self._MakeEventType(include_secret_props=True) args = self.parser.parse_args( ['--secrets=prop0Secret=name:value,prop1Secret=name:value']) expected = { 'prop0Secret': { 'name': 'name', 'key': 'value' }, 'prop1Secret': { 'name': 'name', 'key': 'value' } } self.assertDictEqual( expected, flags.GetAndValidateParameters(args, self.event_type))
def Run(self, args): conn_context = connection_context.GetConnectionContext( args, serverless_flags.Product.EVENTS, self.ReleaseTrack()) trigger_ref = args.CONCEPTS.trigger.Parse() namespace_ref = trigger_ref.Parent() with eventflow_operations.Connect(conn_context) as client: if client.IsCluster(): trigger_ref = resources.REGISTRY.Parse( trigger_ref.RelativeName(), collection=util.ANTHOS_TRIGGER_COLLECTION_NAME, api_version=client.api_version) namespace_ref = trigger_ref.Parent() if args.custom_type: event_type = args.type source_obj = None tracker_stages = stages.TriggerStages() else: source_crds = client.ListSourceCustomResourceDefinitions() event_type = util.EventTypeFromTypeString( source_crds, args.type, args.source) source_obj = source.Source.New( client.client, namespace_ref.Name(), event_type.crd.source_kind, event_type.crd.source_api_category) source_obj.name = _SOURCE_NAME_PATTERN.format( trigger=trigger_ref.Name()) parameters = flags.GetAndValidateParameters(args, event_type) tracker_stages = stages.TriggerAndSourceStages() trigger_obj = client.GetTrigger(trigger_ref) if trigger_obj is not None: if args.custom_type: # If custom type, no need to check idempotency since there's only # a trigger to worry about. raise exceptions.TriggerCreationError( 'Trigger [{}] already exists.'.format( trigger_obj.name)) else: # If trigger already exists, validate it has the attributes we're # trying to set right now to see if this is a case of idempotency. try: util.ValidateTrigger(trigger_obj, source_obj, event_type) except AssertionError: raise exceptions.TriggerCreationError( 'Trigger [{}] already exists with attributes not ' 'matching this event type.'.format( trigger_obj.name)) # If the trigger has the right attributes, check if there's already # a source that matches the attributes as well. source_ref = util.GetSourceRef(source_obj.name, source_obj.namespace, event_type.crd, client.IsCluster()) if client.GetSource(source_ref, event_type.crd) is not None: raise exceptions.TriggerCreationError( 'Trigger [{}] already exists.'.format( trigger_obj.name)) # Create the trigger and source with progress_tracker.StagedProgressTracker( 'Initializing trigger...', tracker_stages, failure_message='Trigger creation failed') as tracker: if trigger_obj is None: trigger_obj = client.CreateTrigger( trigger_ref, source_obj, event_type if args.custom_type else event_type.type, args.trigger_filters, args.target_service, args.broker) if not args.custom_type: client.CreateSource(source_obj, event_type.crd, trigger_obj, namespace_ref, args.broker, parameters) client.PollSource(source_obj, event_type, tracker) client.PollTrigger(trigger_ref, tracker)