blob: e4f6388fa704e1ef3f6654723ca886999b030345 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2016 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
"""Unit tests for instance_group_managers.py."""
import unittest
import test_env
test_env.setup_test_env()
from google.appengine.ext import ndb
from components import datastore_utils
from components import net
from test_support import test_case
import instance_group_managers
import models
class CountInstancesTest(test_case.TestCase):
"""Tests for instance_group_managers.count_instances."""
def test_no_instance_group_managers(self):
self.failIf(instance_group_managers.count_instances())
def test_one_instance_group_manager_no_instances(self):
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
expected = {'base-name': 0}
actual = instance_group_managers.count_instances()
self.assertEqual(actual, expected)
def test_one_instance_group_manager(self):
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
instances=[
ndb.Key(models.Instance, 'fake-key-1'),
ndb.Key(models.Instance, 'fake-key-2'),
],
).put()
expected = {'base-name': 2}
actual = instance_group_managers.count_instances()
self.assertEqual(actual, expected)
def test_several_instance_group_manager(self):
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name-1',
'revision',
'zone-a',
),
instances=[
ndb.Key(models.Instance, 'fake-key-1'),
ndb.Key(models.Instance, 'fake-key-2'),
],
).put()
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name-1',
'revision',
'zone-b',
),
instances=[
ndb.Key(models.Instance, 'fake-key-3'),
],
).put()
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name-2',
'revision',
'zone',
),
instances=[
ndb.Key(models.Instance, 'fake-key-4'),
],
).put()
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name-3',
'revision',
'zone',
),
).put()
expected = {'base-name-1': 3, 'base-name-2': 1, 'base-name-3': 0}
actual = instance_group_managers.count_instances()
self.assertEqual(actual, expected)
class CreateTest(test_case.TestCase):
"""Tests for instance_group_managers.create."""
def test_entity_doesnt_exist(self):
"""Ensures nothing happens when the entity doesn't exist."""
key = ndb.Key(models.InstanceGroupManager, 'fake-key')
instance_group_managers.create(key)
self.failIf(key.get())
def test_url_specified(self):
"""Ensures nothing happens when URL is already specified."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
expected_url = 'url'
instance_group_managers.create(key)
self.assertEqual(key.get().url, expected_url)
def test_parent_doesnt_exist(self):
"""Ensures nothing happens when the parent doesn't exist."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
instance_group_managers.create(key)
self.failIf(key.get().url)
def test_parent_project_unspecified(self):
"""Ensures nothing happens when parent doesn't specify project."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
models.InstanceTemplateRevision(key=key.parent(), url='url').put()
instance_group_managers.create(key)
self.failIf(key.get().url)
def test_parent_url_unspecified(self):
"""Ensures nothing happens when parent doesn't specify URL."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
models.InstanceTemplateRevision(key=key.parent(), project='project').put()
instance_group_managers.create(key)
self.failIf(key.get().url)
def test_creates(self):
"""Ensures an instance group manager is created."""
def create_instance_group_manager(*args, **kwargs):
return {'targetLink': 'url'}
self.mock(
instance_group_managers.gce.Project,
'create_instance_group_manager',
create_instance_group_manager,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=2,
maximum_size=2,
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='project',
url='instance-template-url',
).put()
expected_url = 'url'
instance_group_managers.create(key)
self.assertEqual(key.get().url, expected_url)
def test_updates_when_already_created(self):
"""Ensures an instance group manager is updated when already created."""
def create_instance_group_manager(*args, **kwargs):
raise net.Error('', 409, '')
def get_instance_group_manager(*args, **kwargs):
return {'selfLink': 'url'}
self.mock(
instance_group_managers.gce.Project,
'create_instance_group_manager',
create_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=2,
maximum_size=2,
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='project',
url='instance-template-url',
).put()
expected_url = 'url'
instance_group_managers.create(key)
self.assertEqual(key.get().url, expected_url)
def test_doesnt_update_when_creation_fails(self):
"""Ensures an instance group manager is not updated when creation fails."""
def create_instance_group_manager(*args, **kwargs):
raise net.Error('', 400, '')
self.mock(
instance_group_managers.gce.Project,
'create_instance_group_manager',
create_instance_group_manager,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=2,
maximum_size=2,
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='project',
url='instance-template-url',
).put()
self.assertRaises(net.Error, instance_group_managers.create, key)
self.failIf(key.get().url)
class DeleteTest(test_case.TestCase):
"""Tests for instance_group_managers.delete."""
def test_entity_doesnt_exist(self):
"""Ensures nothing happens when the entity doesn't exist."""
key = ndb.Key(models.InstanceGroupManager, 'fake-key')
instance_group_managers.delete(key)
self.failIf(key.get())
def test_deletes(self):
"""Ensures an instance group manager is deleted."""
def json_request(url, *args, **kwargs):
return {'targetLink': url}
self.mock(instance_group_managers.net, 'json_request', json_request)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
instance_group_managers.delete(key)
self.failIf(key.get().url)
def test_target_link_mismatch(self):
"""Ensures nothing happens when targetLink doesn't match."""
def json_request(*args, **kwargs):
return {'targetLink': 'mismatch'}
self.mock(instance_group_managers.net, 'json_request', json_request)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
instance_group_managers.delete(key)
self.assertEqual(key.get().url, 'url')
def test_url_unspecified(self):
"""Ensures nothing happens when URL is unspecified."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
instance_group_managers.delete(key)
self.failIf(key.get().url)
def test_url_not_found(self):
"""Ensures URL is updated when the instance group manager is not found."""
def json_request(url, *args, **kwargs):
raise net.Error('', 404, '')
self.mock(instance_group_managers.net, 'json_request', json_request)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
instance_group_managers.delete(key)
self.failIf(key.get().url)
def test_deletion_fails(self):
"""Ensures nothing happens when instance group manager deletion fails."""
def json_request(url, *args, **kwargs):
raise net.Error('', 400, '')
self.mock(instance_group_managers.net, 'json_request', json_request)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
expected_url = 'url'
self.assertRaises(net.Error, instance_group_managers.delete, key)
self.assertEqual(key.get().url, expected_url)
class GetDrainedInstanceGroupManagersTest(test_case.TestCase):
"""Tests for instance_group_managers.get_drained_instance_group_managers."""
def test_no_entities(self):
"""Ensures nothing is returned when there are no entities."""
self.failIf(instance_group_managers.get_drained_instance_group_managers())
def test_nothing_active_or_drained(self):
"""Ensures nothing is returned when there are no active/drained entities."""
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
self.failIf(instance_group_managers.get_drained_instance_group_managers())
def test_active_only(self):
"""Ensures nothing is returned when there are only active entities."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
).put()
self.failIf(instance_group_managers.get_drained_instance_group_managers())
def test_drained(self):
"""Ensures drained entities are returned."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
drained=[
key,
],
).put()
expected_keys = [key]
self.assertItemsEqual(
instance_group_managers.get_drained_instance_group_managers(),
expected_keys,
)
def test_implicitly_drained(self):
"""Ensures implicitly drained entities are returned."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
).put()
models.InstanceTemplate(
key=key.parent().parent(),
drained=[
key.parent(),
],
).put()
expected_keys = [
key,
]
self.assertItemsEqual(
instance_group_managers.get_drained_instance_group_managers(),
expected_keys,
)
class GetBaseNameTest(test_case.TestCase):
"""Tests for instance_group_managers.get_base_name."""
def test_get_base_name(self):
"""Ensures base instance name is generated correctly."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision-extra-long',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
self.assertEqual(
instance_group_managers.get_base_name(key.get()),
'base-name-revision-zone',
)
class GetInstanceGroupManagerToDeleteTest(test_case.TestCase):
"""Tests for instance_group_managers.get_instance_group_manager_to_delete."""
def test_entity_doesnt_exist(self):
"""Ensures no URL when the entity doesn't exist."""
key = ndb.Key(models.InstanceGroupManager, 'fake-key')
self.failIf(
instance_group_managers.get_instance_group_manager_to_delete(key))
def test_instances(self):
"""Ensures no URL when there are active instances."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
instances=[
ndb.Key(models.Instance, 'fake-key'),
],
url='url',
).put()
self.failIf(
instance_group_managers.get_instance_group_manager_to_delete(key))
def test_url_unspecified(self):
"""Ensures no URL when URL is unspecified."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
self.failIf(
instance_group_managers.get_instance_group_manager_to_delete(key))
def test_returns_url(self):
"""Ensures URL is returned."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
expected_url = 'url'
self.assertEqual(
instance_group_managers.get_instance_group_manager_to_delete(key),
expected_url,
)
class ResizeTest(test_case.TestCase):
"""Tests for instance_group_managers.resize."""
def test_entity_doesnt_exist(self):
def get_instance_group_manager(*args, **kwargs):
self.fail('get_instance_group_manager called')
def resize_managed_instance_group(*args, **kwargs):
self.fail('resize_managed_instance_group called')
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = ndb.Key(models.InstanceGroupManager, 'fake-key')
instance_group_managers.resize(key)
self.failIf(key.get())
def test_no_url(self):
def get_instance_group_manager(*args, **kwargs):
self.fail('get_instance_group_manager called')
def resize_managed_instance_group(*args, **kwargs):
self.fail('resize_managed_instance_group called')
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_parent_doesnt_exist(self):
def get_instance_group_manager(*args, **kwargs):
self.fail('get_instance_group_manager called')
def resize_managed_instance_group(*args, **kwargs):
self.fail('resize_managed_instance_group called')
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_no_project(self):
def get_instance_group_manager(*args, **kwargs):
self.fail('get_instance_group_manager called')
def resize_managed_instance_group(*args, **kwargs):
self.fail('resize_managed_instance_group called')
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_no_actions(self):
def get_instance_group_manager(*args, **kwargs):
return {
'name': 'name',
}
def resize_managed_instance_group(*args, **kwargs):
self.fail('resize_managed_instance_group called')
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_none_created(self):
def get_instance_group_manager(*args, **kwargs):
return {
'currentActions': {
'none': 0,
},
'name': 'name',
'targetSize': 0,
}
def resize_managed_instance_group(_, name, zone, size):
self.assertEqual(name, 'name')
self.assertEqual(zone, 'zone')
self.assertEqual(size, 10)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_some_created(self):
def get_instance_group_manager(*args, **kwargs):
return {
'currentActions': {
'none': 3,
},
'name': 'name',
'targetSize': 3,
}
def resize_managed_instance_group(_, name, zone, size):
self.assertEqual(name, 'name')
self.assertEqual(zone, 'zone')
self.assertEqual(size, 103)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=1000,
maximum_size=1000,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_all_created(self):
def get_instance_group_manager(*args, **kwargs):
return {
'currentActions': {
'none': 10,
},
'name': 'name',
'targetSize': 10,
}
def resize_managed_instance_group(_, name, zone, size):
self.failIf(True)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=10,
maximum_size=10,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_excess_created(self):
def get_instance_group_manager(*args, **kwargs):
return {
'currentActions': {
'none': 2,
},
'name': 'name',
'targetSize': 2,
}
def resize_managed_instance_group(_, name, zone, size):
self.failIf(True)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
minimum_size=1,
maximum_size=1,
url='https://example.com',
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
def test_resize_other_revisions_created(self):
def get_instance_group_manager(*args, **kwargs):
return {
'currentActions': {
'none': 0,
},
'name': 'name',
'targetSize': 0,
}
def resize_managed_instance_group(_, name, zone, size):
self.assertEqual(name, 'name')
self.assertEqual(zone, 'zone')
self.assertEqual(size, 4)
self.mock(
instance_group_managers.gce.Project,
'get_instance_group_manager',
get_instance_group_manager,
)
self.mock(
instance_group_managers.gce.Project,
'resize_managed_instance_group',
resize_managed_instance_group,
)
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision-1',
'zone',
),
minimum_size=7,
maximum_size=7,
url='https://example.com',
).put()
models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision-2',
'zone',
),
instances=[
ndb.Key(models.Instance, 'instance-name-1'),
ndb.Key(models.Instance, 'instance-name-2'),
ndb.Key(models.Instance, 'instance-name-3'),
],
).put()
models.InstanceTemplateRevision(
key=key.parent(),
project='fake-project',
).put()
models.InstanceTemplate(key=key.parent().parent()).put()
instance_group_managers.resize(key)
class ScheduleCreationTest(test_case.TestCase):
"""Tests for instance_group_managers.schedule_creation."""
def setUp(self, *args, **kwargs):
def enqueue_task(taskqueue, key):
entity = key.get()
entity.url = key.urlsafe()
entity.put()
return True
super(ScheduleCreationTest, self).setUp(*args, **kwargs)
self.mock(instance_group_managers.utilities, 'enqueue_task', enqueue_task)
def test_enqueues_task(self):
"""Ensures a task is enqueued."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
url='url',
).put()
models.InstanceGroupManager(key=key).put()
expected_url = key.urlsafe()
instance_group_managers.schedule_creation()
self.assertEqual(key.get().url, expected_url)
def test_instance_template_revision_inactive(self):
"""Ensures no task is enqueued for inactive instance template revisions."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
url='url',
).put()
models.InstanceGroupManager(key=key).put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_template_revision_missing(self):
"""Ensures no task is enqueued for missing instance template revisions."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceGroupManager(key=key).put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_template_revision_no_url(self):
"""Ensures no task is enqueued when instance template URL is missing."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
).put()
models.InstanceGroupManager(key=key).put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_group_manager_inactive(self):
"""Ensures no task is enqueued for inactive instance group managers."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
url='url',
).put()
models.InstanceGroupManager(key=key).put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_group_manager_drained(self):
"""Ensures no task is enqueued for drained instance group managers."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
drained=[
key,
],
url='url',
).put()
models.InstanceGroupManager(key=key).put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_group_manager_missing(self):
"""Ensures no task is enqueued for missing instance group managers."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
url='url',
).put()
key = models.InstanceGroupManager().put()
instance_group_managers.schedule_creation()
self.failIf(key.get().url)
def test_instance_group_manager_already_created(self):
"""Ensures no task is enqueued for existing instance group managers."""
key = instance_group_managers.get_instance_group_manager_key(
'base-name', 'revision', 'zone')
models.InstanceTemplate(
key=key.parent().parent(),
active=key.parent(),
).put()
models.InstanceTemplateRevision(
key=key.parent(),
active=[
key,
],
url='instance-template-url',
).put()
models.InstanceGroupManager(key=key, url='url').put()
expected_url = 'url'
instance_group_managers.schedule_creation()
self.assertEqual(key.get().url, expected_url)
class UpdateURLTest(test_case.TestCase):
"""Tests for instance_group_managers.update_url."""
def test_entity_doesnt_exist(self):
"""Ensures nothing happens when the entity doesn't exist."""
key = ndb.Key(models.InstanceGroupManager, 'fake-key')
instance_group_managers.update_url(key, 'url')
self.failIf(key.get())
def test_url_matches(self):
"""Ensures nothing happens when the URL already matches."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='url',
).put()
instance_group_managers.update_url(key, 'url')
self.assertEqual(key.get().url, 'url')
def test_url_mismatch(self):
"""Ensures the URL is updated when it doesn't match."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
url='old-url',
).put()
instance_group_managers.update_url(key, 'new-url')
self.assertEqual(key.get().url, 'new-url')
def test_url_updated(self):
"""Ensures the URL is updated."""
key = models.InstanceGroupManager(
key=instance_group_managers.get_instance_group_manager_key(
'base-name',
'revision',
'zone',
),
).put()
instance_group_managers.update_url(key, 'url')
self.assertEqual(key.get().url, 'url')
if __name__ == '__main__':
unittest.main()