Ejemplo n.º 1
0
    def test_cataloging_error_hostname_reuse(self):
        """Ensures an instance is marked cataloged on HOSTNAME_REUSE."""
        def add_machine(*args, **kwargs):
            return {'error': 'HOSTNAME_REUSE'}

        def send_machine_event(*args, **kwargs):
            pass

        self.mock(catalog.machine_provider, 'add_machine', add_machine)
        self.mock(catalog.metrics, 'send_machine_event', send_machine_event)

        key = instances.get_instance_key(
            'base-name',
            'revision',
            'zone',
            'instance-name',
        )
        key = models.Instance(
            key=key,
            instance_group_manager=instances.get_instance_group_manager_key(
                key),
        ).put()
        models.InstanceGroupManager(
            key=instances.get_instance_group_manager_key(key), ).put()
        models.InstanceTemplateRevision(
            key=instances.get_instance_group_manager_key(key).parent(),
            service_accounts=[
                models.ServiceAccount(name='service-account'),
            ],
        ).put()

        catalog.catalog(key)
        self.failUnless(key.get().cataloged)
Ejemplo n.º 2
0
    def test_creates(self):
        """Ensures an instance template is created."""
        def create_instance_template(*args, **kwargs):
            return {'targetLink': 'url'}

        self.mock(
            instance_templates.gce.Project,
            'create_instance_template',
            create_instance_template,
        )

        key = models.InstanceTemplateRevision(
            key=instance_templates.get_instance_template_revision_key(
                'base-name',
                'revision',
            ),
            image_name='image',
            metadata={
                'key': 'value',
            },
            project='project',
            service_accounts=[
                models.ServiceAccount(
                    name='service-account',
                    scopes=[
                        'scope',
                    ],
                ),
            ],
        ).put()
        expected_url = 'url'

        instance_templates.create(key)
        self.assertEqual(key.get().url, expected_url)
Ejemplo n.º 3
0
def _load_service_accounts(service_accounts):
  """Loads from the given service accounts.

  Args:
    service_accounts:
      proto.config_pb2.InstanceTemplateConfig.InstanceTemplate.ServiceAccount.

  Returns:
    models.ServiceAccount instance.
  """
  return [models.ServiceAccount(name=sa.name, scopes=list(sa.scopes))
          for sa in service_accounts]
Ejemplo n.º 4
0
  def test_subscribed(self):
    """Ensures subscribed instance has pending metadata update."""
    key = models.Instance(
        key=instances.get_instance_key(
            'base-name',
            'revision',
            'zone',
            'instance-name',
        ),
    ).put()
    models.InstanceGroupManager(
        key=key.parent(),
    ).put()
    models.InstanceTemplateRevision(
        key=key.parent().parent(),
        service_accounts=[
            models.ServiceAccount(
                name='name',
                scopes=[
                    'scope',
                ],
            ),
        ],
    ).put()
    message = {
        'ackId': 'id',
        'message': {
            'attributes': {
                'key': key.urlsafe(),
                'subscription': 'subscription',
                'subscription_project': 'subscription-project',
            },
            'data': base64.b64encode('SUBSCRIBED'),
        },
    }
    expected_pending_metadata_updates = [
        models.MetadataUpdate(
            metadata={
                'pubsub_service_account': 'name',
                'pubsub_subscription': 'subscription',
                'pubsub_subscription_project': 'subscription-project',
            },
        )
    ]

    pubsub.process(message).wait()
    self.assertEqual(
        key.get().pending_metadata_updates, expected_pending_metadata_updates)
Ejemplo n.º 5
0
  def test_unexpected_key(self):
    """Ensures nothing happens when key has unexpected kind."""
    key = models.Instance(
        key=instances.get_instance_key(
            'base-name',
            'revision',
            'zone',
            'instance-name',
        ),
    ).put()
    models.InstanceGroupManager(
        key=key.parent(),
    ).put()
    models.InstanceTemplateRevision(
        key=key.parent().parent(),
        service_accounts=[
            models.ServiceAccount(
                name='name',
                scopes=[
                    'scope',
                ],
            ),
        ],
    ).put()
    message = {
        'ackId': 'id',
        'message': {
            'attributes': {
                'key': key.parent().urlsafe(),
                'subscription': 'subscription',
                'subscription_project': 'subscription-project',
            },
            'data': base64.b64encode('SUBSCRIBED'),
        },
    }

    pubsub.process(message).wait()
    self.failIf(key.get().pending_metadata_updates)
Ejemplo n.º 6
0
    def test_creates_new_entity(self):
        """Ensures that a new entity is created when one doesn't exist."""
        template_cfg = config_pb2.InstanceTemplateConfig.InstanceTemplate(
            base_name='base-name',
            dimensions=[
                'os_family:LINUX',
            ],
            disk_size_gb=100,
            machine_type='n1-standard-8',
            metadata=[
                'key:value',
            ],
            service_accounts=[
                config_pb2.InstanceTemplateConfig.InstanceTemplate.
                ServiceAccount(
                    name='service-account',
                    scopes=[
                        'scope',
                    ],
                ),
            ],
            tags=[
                'tag',
            ])
        manager_cfgs = [
            config_pb2.InstanceGroupManagerConfig.InstanceGroupManager(
                maximum_size=2,
                minimum_size=1,
                template_base_name='base-name',
                zone='us-central-1a',
            ),
            config_pb2.InstanceGroupManagerConfig.InstanceGroupManager(
                maximum_size=3,
                minimum_size=2,
                template_base_name='base-name',
                zone='us-central-1b',
            ),
            config_pb2.InstanceGroupManagerConfig.InstanceGroupManager(
                maximum_size=4,
                minimum_size=3,
                template_base_name='base-name',
                zone='us-central-1c',
            ),
        ]
        expected_instance_template_key = parse.get_instance_template_key(
            template_cfg)
        expected_instance_template_revision_key = (
            parse.get_instance_template_revision_key(template_cfg))
        expected_dimensions = parse._load_machine_provider_dimensions(
            template_cfg.dimensions)
        expected_metadata = parse._load_dict(template_cfg.metadata)
        expected_service_accounts = [
            models.ServiceAccount(
                name=template_cfg.service_accounts[0].name,
                scopes=list(template_cfg.service_accounts[0].scopes),
            ),
        ]
        expected_active_keys = [
            parse.get_instance_group_manager_key(template_cfg, manager_cfg)
            for manager_cfg in manager_cfgs
        ]

        future = parse.ensure_entities_exist(template_cfg, manager_cfgs)
        future.wait()
        instance_template_key = future.get_result()
        instance_template = instance_template_key.get()
        instance_template_revision = instance_template.active.get()
        instance_group_managers = sorted(
            [
                instance_group_manager.get()
                for instance_group_manager in instance_template_revision.active
            ],
            key=lambda instance_group_manager: instance_group_manager.key.id(),
        )

        self.assertEqual(instance_template_key, expected_instance_template_key)
        self.assertEqual(instance_template.active,
                         expected_instance_template_revision_key)
        self.assertEqual(instance_template_revision.dimensions,
                         expected_dimensions)
        self.assertEqual(instance_template_revision.disk_size_gb,
                         template_cfg.disk_size_gb)
        self.assertEqual(instance_template_revision.machine_type,
                         template_cfg.machine_type)
        self.assertEqual(instance_template_revision.metadata,
                         expected_metadata)
        self.assertItemsEqual(instance_template_revision.service_accounts,
                              expected_service_accounts)
        self.assertItemsEqual(instance_template_revision.tags,
                              template_cfg.tags)
        self.assertItemsEqual(instance_template_revision.active,
                              expected_active_keys)
        self.assertEqual(instance_group_managers[0].maximum_size,
                         manager_cfgs[0].maximum_size)
        self.assertEqual(instance_group_managers[0].minimum_size,
                         manager_cfgs[0].minimum_size)
        self.assertEqual(instance_group_managers[1].maximum_size,
                         manager_cfgs[1].maximum_size)
        self.assertEqual(instance_group_managers[1].minimum_size,
                         manager_cfgs[1].minimum_size)
        self.assertEqual(instance_group_managers[2].maximum_size,
                         manager_cfgs[2].maximum_size)
        self.assertEqual(instance_group_managers[2].minimum_size,
                         manager_cfgs[2].minimum_size)