diff --git a/doc/notification_samples/server-create-end.json b/doc/notification_samples/server-create-end.json index 6d268b89..6d9012dc 100644 --- a/doc/notification_samples/server-create-end.json +++ b/doc/notification_samples/server-create-end.json @@ -41,7 +41,6 @@ "description": null, "key_name": null, "partitions": {}, - "locked": false, "name": "test", "fault": null, "created_at": "2017-09-13T08:36:06Z", diff --git a/doc/notification_samples/server-create-error.json b/doc/notification_samples/server-create-error.json index ea09866d..0803e37e 100644 --- a/doc/notification_samples/server-create-error.json +++ b/doc/notification_samples/server-create-error.json @@ -7,7 +7,6 @@ "mogan_object.data": { "status": "error", "node": "node-0", - "locked": false, "uuid": "c6e12c34-8917-4b95-938e-e146faf1de97", "availability_zone": null, "fault": { diff --git a/doc/notification_samples/server-create-start.json b/doc/notification_samples/server-create-start.json index 76cf676b..7efc856e 100644 --- a/doc/notification_samples/server-create-start.json +++ b/doc/notification_samples/server-create-start.json @@ -22,7 +22,6 @@ "description": null, "key_name": null, "partitions": {}, - "locked": false, "name": "test", "fault": null, "created_at": "2017-09-13T08:36:06Z", diff --git a/doc/notification_samples/server-delete-end.json b/doc/notification_samples/server-delete-end.json index 1391a0ee..9e5efc58 100644 --- a/doc/notification_samples/server-delete-end.json +++ b/doc/notification_samples/server-delete-end.json @@ -41,7 +41,6 @@ "description": null, "key_name": null, "partitions": {}, - "locked": false, "name": "test", "fault": null, "created_at": "2017-09-13T08:15:21Z", diff --git a/doc/notification_samples/server-delete-start.json b/doc/notification_samples/server-delete-start.json index 3503db11..c5ccc42c 100644 --- a/doc/notification_samples/server-delete-start.json +++ b/doc/notification_samples/server-delete-start.json @@ -41,7 +41,6 @@ "description": null, "key_name": null, "partitions": {}, - "locked": false, "name": "test", "fault": null, "created_at": "2017-09-13T08:15:21Z", diff --git a/mogan/api/controllers/v1/servers.py b/mogan/api/controllers/v1/servers.py index 7e3959d4..0d015bd4 100644 --- a/mogan/api/controllers/v1/servers.py +++ b/mogan/api/controllers/v1/servers.py @@ -449,6 +449,9 @@ class Server(base.APIBase): if not pecan.request.context.is_admin: setattr(self, field, wtypes.Unset) continue + if field == 'locked_by': + setattr(self, 'locked', bool(kwargs.get('locked_by'))) + continue # Skip fields we do not expose. if not hasattr(self, field): continue diff --git a/mogan/db/sqlalchemy/alembic/versions/91941bf1ebc9_initial_migration.py b/mogan/db/sqlalchemy/alembic/versions/91941bf1ebc9_initial_migration.py index bb0d46df..f5d0b22d 100644 --- a/mogan/db/sqlalchemy/alembic/versions/91941bf1ebc9_initial_migration.py +++ b/mogan/db/sqlalchemy/alembic/versions/91941bf1ebc9_initial_migration.py @@ -82,7 +82,6 @@ def upgrade(): sa.Column('node_uuid', sa.String(length=36), nullable=True), sa.Column('extra', sa.Text(), nullable=True), sa.Column('partitions', sa.Text(), nullable=True), - sa.Column('locked', sa.Boolean(), nullable=True), sa.Column('affinity_zone', sa.String(length=255), nullable=True), sa.Column('locked_by', sa.Enum('admin', 'owner'), nullable=True), sa.Column('key_name', sa.String(length=255), nullable=True), diff --git a/mogan/db/sqlalchemy/models.py b/mogan/db/sqlalchemy/models.py index ac2f524d..f70ab729 100644 --- a/mogan/db/sqlalchemy/models.py +++ b/mogan/db/sqlalchemy/models.py @@ -90,7 +90,6 @@ class Server(Base): launched_at = Column(DateTime, nullable=True) extra = Column(db_types.JsonEncodedDict) partitions = Column(db_types.JsonEncodedDict) - locked = Column(Boolean) locked_by = Column(Enum('owner', 'admin')) affinity_zone = Column(String(255), nullable=True) key_name = Column(String(255), nullable=True) diff --git a/mogan/engine/api.py b/mogan/engine/api.py index 9503d05b..a86ea3a4 100644 --- a/mogan/engine/api.py +++ b/mogan/engine/api.py @@ -46,7 +46,7 @@ MAX_USERDATA_SIZE = 65535 def check_server_lock(function): @six.wraps(function) def inner(self, context, server, *args, **kwargs): - if server.locked and not context.is_admin: + if server.locked_by and not context.is_admin: raise exception.ServerIsLocked(server_uuid=server.uuid) return function(self, context, server, *args, **kwargs) return inner @@ -118,7 +118,6 @@ class API(object): 'flavor_uuid': flavor['uuid'], 'name': name, 'description': description, - 'locked': False, 'metadata': metadata or {}, 'partitions': partitions or {}, 'availability_zone': availability_zone, @@ -478,11 +477,10 @@ class API(object): """Lock the given server.""" is_owner = server.project_id == context.project_id - if server.locked and is_owner: + if server.locked_by and is_owner: return LOG.debug('Locking server: %s', server.uuid) - server.locked = True server.locked_by = 'owner' if is_owner else 'admin' server.save() @@ -490,7 +488,6 @@ class API(object): """Unlock the given server.""" LOG.debug('Unlocking server: %s', server.uuid) - server.locked = False server.locked_by = None server.save() @@ -702,7 +699,6 @@ class API(object): 'power_state': states.NOSTATE, 'name': name, 'description': description, - 'locked': False, 'metadata': metadata or {}, 'availability_zone': None} diff --git a/mogan/notifications/objects/server.py b/mogan/notifications/objects/server.py index 2eeabbf7..6b41dc86 100644 --- a/mogan/notifications/objects/server.py +++ b/mogan/notifications/objects/server.py @@ -31,7 +31,6 @@ class ServerPayload(base.NotificationPayloadBase): 'power_state': ('server', 'power_state'), 'flavor_uuid': ('server', 'flavor_uuid'), 'description': ('server', 'description'), - 'locked': ('server', 'locked'), 'locked_by': ('server', 'locked_by'), 'affinity_zone': ('server', 'affinity_zone'), 'metadata': ('server', 'metadata'), @@ -55,7 +54,6 @@ class ServerPayload(base.NotificationPayloadBase): 'launched_at': fields.DateTimeField(nullable=True), 'updated_at': fields.DateTimeField(nullable=True), 'status': fields.StringField(nullable=True), - 'locked': fields.BooleanField(nullable=True), 'locked_by': fields.StringField(nullable=True), 'affinity_zone': fields.StringField(nullable=True), 'metadata': fields.FlexibleDictField(nullable=True), diff --git a/mogan/objects/server.py b/mogan/objects/server.py index 9b8be90e..9a801c75 100644 --- a/mogan/objects/server.py +++ b/mogan/objects/server.py @@ -54,7 +54,6 @@ class Server(base.MoganObject, object_base.VersionedObjectDictCompat): 'launched_at': object_fields.DateTimeField(nullable=True), 'metadata': object_fields.FlexibleDictField(nullable=True), 'partitions': object_fields.FlexibleDictField(nullable=True), - 'locked': object_fields.BooleanField(default=False), 'locked_by': object_fields.StringField(nullable=True), 'affinity_zone': object_fields.StringField(nullable=True), 'key_name': object_fields.StringField(nullable=True), diff --git a/mogan/tests/unit/db/utils.py b/mogan/tests/unit/db/utils.py index b03af43c..a592ae69 100644 --- a/mogan/tests/unit/db/utils.py +++ b/mogan/tests/unit/db/utils.py @@ -64,7 +64,6 @@ def get_test_server(**kw): 'partitions': kw.get('partitions', {}), 'updated_at': kw.get('updated_at'), 'created_at': kw.get('created_at'), - 'locked': kw.get('locked', False), 'locked_by': kw.get('locked_by', None), 'affinity_zone': kw.get('affinity_zone', 'ZON1'), 'key_name': kw.get('key_name', 'test_key') diff --git a/mogan/tests/unit/engine/test_engine_api.py b/mogan/tests/unit/engine/test_engine_api.py index d27b5f62..1ff4e769 100644 --- a/mogan/tests/unit/engine/test_engine_api.py +++ b/mogan/tests/unit/engine/test_engine_api.py @@ -238,16 +238,14 @@ class ComputeAPIUnitTest(base.DbTestCase): user_id=self.user_id, project_id=self.project_id) fake_server_obj = self._create_fake_server_obj(fake_server) self.engine_api.lock(self.context, fake_server_obj) - self.assertTrue(fake_server_obj.locked) self.assertEqual('owner', fake_server_obj.locked_by) def test_unlock_by_owner(self): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) self.engine_api.unlock(self.context, fake_server_obj) - self.assertFalse(fake_server_obj.locked) self.assertIsNone(fake_server_obj.locked_by) def test_lock_by_admin(self): @@ -256,24 +254,22 @@ class ComputeAPIUnitTest(base.DbTestCase): fake_server_obj = self._create_fake_server_obj(fake_server) admin_context = context.get_admin_context() self.engine_api.lock(admin_context, fake_server_obj) - self.assertTrue(fake_server_obj.locked) self.assertEqual('admin', fake_server_obj.locked_by) def test_unlock_by_admin(self): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) admin_context = context.get_admin_context() self.engine_api.unlock(admin_context, fake_server_obj) - self.assertFalse(fake_server_obj.locked) self.assertIsNone(fake_server_obj.locked_by) @mock.patch('mogan.engine.api.API._delete_server') def test_delete_locked_server_with_non_admin(self, mock_deleted): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) self.assertRaises(exception.ServerIsLocked, self.engine_api.delete, @@ -284,7 +280,7 @@ class ComputeAPIUnitTest(base.DbTestCase): def test_power_locked_server_with_non_admin(self, mock_powered): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) self.assertRaises(exception.ServerIsLocked, self.engine_api.power, @@ -295,7 +291,7 @@ class ComputeAPIUnitTest(base.DbTestCase): def test_delete_locked_server_with_admin(self, mock_deleted): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) admin_context = context.get_admin_context() self.engine_api.delete(admin_context, fake_server_obj) @@ -305,7 +301,7 @@ class ComputeAPIUnitTest(base.DbTestCase): def test_power_locked_server_with_admin(self, mock_powered): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) admin_context = context.get_admin_context() self.engine_api.power(admin_context, fake_server_obj, 'reboot') @@ -315,7 +311,7 @@ class ComputeAPIUnitTest(base.DbTestCase): def test_rebuild_locked_server_with_non_admin(self, mock_rebuild): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) self.assertRaises(exception.ServerIsLocked, self.engine_api.rebuild, @@ -328,7 +324,7 @@ class ComputeAPIUnitTest(base.DbTestCase): mock_get_image): fake_server = db_utils.get_test_server( user_id=self.user_id, project_id=self.project_id, - locked=True, locked_by='owner') + locked_by='owner') fake_server_obj = self._create_fake_server_obj(fake_server) admin_context = context.get_admin_context() mock_get_image.side_effect = None diff --git a/mogan/tests/unit/notifications/test_notification.py b/mogan/tests/unit/notifications/test_notification.py index 34fe5361..5b422160 100644 --- a/mogan/tests/unit/notifications/test_notification.py +++ b/mogan/tests/unit/notifications/test_notification.py @@ -226,9 +226,9 @@ class TestNotificationBase(test_base.TestCase): notification_object_data = { - 'ServerPayload': '1.0-55ce3a2c615a32c80b152aaf2b905703', + 'ServerPayload': '1.0-30fefa8478f1b9b35c66868377fb6dfd', 'ServerAddressesPayload': '1.0-69caf4c36f36756bb1f6970d093ee1f6', - 'ServerActionPayload': '1.0-a22c2f18b8dd17a3990e5b4c64989d26', + 'ServerActionPayload': '1.0-8dc4429afa34d86ab92c9387e3ccd0c3', 'ServerActionNotification': '1.0-20087e599436bd9db62ae1fb5e2dfef2', 'ExceptionPayload': '1.0-7c31986d8d78bed910c324965c431e18', 'EventType': '1.0-93493dd78bdfed806fca70c91d85cbb4', diff --git a/mogan/tests/unit/objects/test_objects.py b/mogan/tests/unit/objects/test_objects.py index dabff02a..a1060393 100644 --- a/mogan/tests/unit/objects/test_objects.py +++ b/mogan/tests/unit/objects/test_objects.py @@ -382,7 +382,7 @@ class _TestObject(object): # version bump. It is md5 hash of object fields and remotable methods. # The fingerprint values should only be changed if there is a version bump. expected_object_fingerprints = { - 'Server': '1.0-6b13b984cd3656a977456a12d3d1c167', + 'Server': '1.0-1480ee88a244bf44492f61f20a022a6f', 'ServerFault': '1.0-74349ff701259e4834b4e9dc2dac1b12', 'ServerFaultList': '1.0-43e8aad0258652921f929934e9e048fd', 'Flavor': '1.0-9f7166aa387d89ec40cd699019d0c9a9',