From ef5b272db6a9a27b33d2d18bf62fb058cc241c87 Mon Sep 17 00:00:00 2001 From: Duda Date: Tue, 25 Apr 2023 11:45:04 -0300 Subject: [PATCH 1/4] Adicionada tag --- dbaas/logical/templates/logical/database/details/base.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dbaas/logical/templates/logical/database/details/base.html b/dbaas/logical/templates/logical/database/details/base.html index 6b53b1773..9bd7a82f4 100644 --- a/dbaas/logical/templates/logical/database/details/base.html +++ b/dbaas/logical/templates/logical/database/details/base.html @@ -46,6 +46,9 @@

{% if database.attention %} Attention! {% endif %} + + Manually Stopped +

From 92125bd38afe88428e5ea085639fc489f7f65ef4 Mon Sep 17 00:00:00 2001 From: Duda Date: Tue, 25 Apr 2023 16:37:47 -0300 Subject: [PATCH 2/4] =?UTF-8?q?Modifica=C3=A7=C3=B5es=20em=20front,=20migr?= =?UTF-8?q?ation=20e=20m=C3=A9todo=20para=20atualiza=C3=A7=C3=A3o=20de=20r?= =?UTF-8?q?egistro.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbaas/logical/admin/database.py | 10 +- ...add_field_database_was_manually_stopped.py | 391 ++++++++++++++++++ dbaas/logical/models.py | 3 + .../logical/database/details/base.html | 6 +- .../logical/database/details/details_tab.html | 15 + dbaas/logical/urls.py | 6 +- dbaas/logical/views.py | 13 + 7 files changed, 439 insertions(+), 5 deletions(-) create mode 100644 dbaas/logical/migrations/0042_auto__add_field_database_was_manually_stopped.py diff --git a/dbaas/logical/admin/database.py b/dbaas/logical/admin/database.py index 975024988..0920ddd5e 100644 --- a/dbaas/logical/admin/database.py +++ b/dbaas/logical/admin/database.py @@ -228,7 +228,7 @@ def name_html(self, database): return show_info_popup( database.name, "Show Endpoint", ed_point, "icon-info-sign", "show-endpoint" - ) + self.quarantine_html(database) + self.attention_html(database) + ) + self.quarantine_html(database) + self.attention_html(database) + self.manually_stopped_html(database) name_html.short_description = _("name") name_html.admin_order_field = "name" @@ -241,6 +241,14 @@ def quarantine_html(self, database): return format_html(quarantine) + def manually_stopped_html(self, database): + html_default = '{}' + manually_stopped = "" + if database.was_manually_stopped: + manually_stopped = html_default.format("warning", "Manually Stopped") + + return format_html(manually_stopped) + def attention_html(self, database): html_default = '{}' diff --git a/dbaas/logical/migrations/0042_auto__add_field_database_was_manually_stopped.py b/dbaas/logical/migrations/0042_auto__add_field_database_was_manually_stopped.py new file mode 100644 index 000000000..1c83aaa71 --- /dev/null +++ b/dbaas/logical/migrations/0042_auto__add_field_database_was_manually_stopped.py @@ -0,0 +1,391 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Database.was_manually_stopped' + db.add_column(u'logical_database', 'was_manually_stopped', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Database.was_manually_stopped' + db.delete_column(u'logical_database', 'was_manually_stopped') + + + models = { + u'account.organization': { + 'Meta': {'object_name': 'Organization'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'external': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'grafana_datasource': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'grafana_endpoint': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'grafana_hostgroup': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'grafana_orgid': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'account.team': { + 'Meta': {'ordering': "[u'name']", 'object_name': 'Team'}, + 'contacts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'database_alocation_limit': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'team_organization'", 'on_delete': 'models.PROTECT', 'to': u"orm['account.Organization']"}), + 'role': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']"}), + 'team_area': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}), + 'token': ('django.db.models.fields.CharField', [], {'max_length': '406', 'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) + }, + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'logical.credential': { + 'Meta': {'ordering': "(u'database', u'user')", 'unique_together': "((u'user', u'database'),)", 'object_name': 'Credential'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'database': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'credentials'", 'to': u"orm['logical.Database']"}), + 'force_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '406'}), + 'privileges': ('django.db.models.fields.CharField', [], {'default': "u'Owner'", 'max_length': '10'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'logical.database': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'name', u'environment'),)", 'object_name': 'Database'}, + 'apps_bind_name': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'attention': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'attention_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'null': 'True', 'blank': 'True'}), + 'backup_path': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'databaseinfra': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databases'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DatabaseInfra']"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'disk_auto_resize': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'environment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databases'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_in_quarantine': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_monitoring': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_protected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'databases'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['logical.Project']"}), + 'quarantine_dt': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'quarantine_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'databases_quarantine'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'send_all_chg': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}), + 'subscribe_to_email_events': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'databases'", 'null': 'True', 'to': u"orm['account.Team']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'used_size_in_bytes': ('django.db.models.fields.FloatField', [], {'default': '0.0'}), + 'was_manually_stopped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'logical.databasehistory': { + 'Meta': {'object_name': 'DatabaseHistory'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'database_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'databaseinfra_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'disk_size_kb': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'engine': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'environment': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'has_persistence': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'plan': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'project': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'team': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'logical.databaselock': { + 'Meta': {'object_name': 'DatabaseLock'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'database': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'lock'", 'unique': 'True', 'to': u"orm['logical.Database']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'lock'", 'to': u"orm['notification.TaskHistory']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'logical.project': { + 'Meta': {'ordering': "[u'name']", 'object_name': 'Project'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'notification.taskhistory': { + 'Meta': {'object_name': 'TaskHistory'}, + 'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'context': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'database_name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'details': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'ended_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_class': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'relevance': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '1'}), + 'task_id': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'task_status': ('django.db.models.fields.CharField', [], {'default': "u'WAITING'", 'max_length': '100', 'db_index': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}) + }, + u'physical.cloud': { + 'Meta': {'object_name': 'Cloud'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.databaseinfra': { + 'Meta': {'object_name': 'DatabaseInfra'}, + 'backup_hour': ('django.db.models.fields.IntegerField', [], {}), + 'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'database_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'disk_offering': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DiskOffering']"}), + 'disk_offering_type': ('django.db.models.fields.related.ForeignKey', [], {'default': '4', 'related_name': "u'databaseinfras'", 'on_delete': 'models.DO_NOTHING', 'to': u"orm['physical.DiskOfferingType']"}), + 'endpoint': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'endpoint_dns': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'engine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Engine']"}), + 'engine_patch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['physical.EnginePatch']"}), + 'environment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_vm_created': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'maintenance_day': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'maintenance_window': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'migration_stage': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'name_stamp': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '406', 'blank': 'True'}), + 'per_database_size_mbytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'plan': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Plan']"}), + 'pool': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'infra'", 'null': 'True', 'to': u"orm['physical.Pool']"}), + 'service_account': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ssl_configured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'ssl_mode': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + u'physical.diskoffering': { + 'Meta': {'object_name': 'DiskOffering'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'environments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'diskofferings'", 'symmetrical': 'False', 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'size_kb': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.diskofferingtype': { + 'Meta': {'object_name': 'DiskOfferingType'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'environments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'diskofferingstypes'", 'symmetrical': 'False', 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'identifier': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'is_default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'type': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.engine': { + 'Meta': {'ordering': "(u'engine_type__name', u'version')", 'unique_together': "((u'version', u'engine_type'),)", 'object_name': 'Engine'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'engine_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'engines'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.EngineType']"}), + 'engine_upgrade_option': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'backwards_engine'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['physical.Engine']"}), + 'has_users': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'major_version': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'minor_version': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'read_node_description': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'template_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user_data_script': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'write_node_description': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '100', 'null': 'True', 'blank': 'True'}) + }, + u'physical.enginepatch': { + 'Meta': {'object_name': 'EnginePatch'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'engine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'patchs'", 'to': u"orm['physical.Engine']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_initial_patch': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'patch_path': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'patch_path_ol7': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'patch_version': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'required_disk_size_gb': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.enginetype': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'EngineType'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_in_memory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.environment': { + 'Meta': {'object_name': 'Environment'}, + 'cloud': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'environment_cloud'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Cloud']"}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'hide_migration': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location_description': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'migrate_environment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'migrate_to'", 'null': 'True', 'to': u"orm['physical.Environment']"}), + 'min_of_zones': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'provisioner': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'stage': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'tsuru_deploy': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.offering': { + 'Meta': {'object_name': 'Offering'}, + 'cpus': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'environments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'offerings'", 'symmetrical': 'False', 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'memory_size_mb': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.parameter': { + 'Meta': {'ordering': "(u'engine_type__name', u'name')", 'unique_together': "((u'name', u'engine_type'),)", 'object_name': 'Parameter'}, + 'allowed_values': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'custom_method': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'dynamic': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'engine_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'enginetype'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.EngineType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'parameter_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '100'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.plan': { + 'Meta': {'object_name': 'Plan'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'disk_offering': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'plans'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DiskOffering']"}), + 'disk_offering_type': ('django.db.models.fields.related.ForeignKey', [], {'default': '4', 'related_name': "u'plans'", 'on_delete': 'models.DO_NOTHING', 'to': u"orm['physical.DiskOfferingType']"}), + 'engine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'plans'", 'to': u"orm['physical.Engine']"}), + 'engine_equivalent_plan': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'backwards_plan'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['physical.Plan']"}), + 'environments': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'plans'", 'symmetrical': 'False', 'to': u"orm['physical.Environment']"}), + 'has_persistence': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_ha': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'max_db_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'migrate_engine_equivalent_plan': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'backwards_engine_plan'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['physical.Plan']"}), + 'migrate_plan': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'migrate_to'", 'null': 'True', 'to': u"orm['physical.Plan']"}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'persistense_equivalent_plan': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'backwards_persisted_plan'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['physical.Plan']"}), + 'provider': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'replication_topology': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'replication_topology'", 'null': 'True', 'to': u"orm['physical.ReplicationTopology']"}), + 'stronger_offering': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'main_offerings'", 'null': 'True', 'to': u"orm['physical.Offering']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'weaker_offering': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'weaker_offerings'", 'null': 'True', 'to': u"orm['physical.Offering']"}) + }, + u'physical.pool': { + 'Meta': {'object_name': 'Pool'}, + 'cluster_endpoint': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cluster_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cluster_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'dbaas_token': ('django.db.models.fields.CharField', [], {'max_length': '406'}), + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'environment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'pools'", 'to': u"orm['physical.Environment']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}), + 'project_id': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + 'rancher_endpoint': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'rancher_token': ('django.db.models.fields.CharField', [], {'max_length': '406'}), + 'storageclass': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'teams': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'pools'", 'symmetrical': 'False', 'to': u"orm['account.Team']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'vpc': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'physical.replicationtopology': { + 'Meta': {'object_name': 'ReplicationTopology'}, + 'can_change_parameters': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_clone_db': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_recreate_slave': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'can_reinstall_vm': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_resize_vm': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_setup_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'can_switch_master': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_upgrade_db': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'class_path': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'details': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'engine': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'replication_topologies'", 'symmetrical': 'False', 'to': u"orm['physical.Engine']"}), + 'has_horizontal_scalability': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'parameter': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'replication_topologies'", 'blank': 'True', 'to': u"orm['physical.Parameter']"}), + 'script': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'replication_topologies'", 'null': 'True', 'to': u"orm['physical.Script']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'physical.script': { + 'Meta': {'object_name': 'Script'}, + 'configuration': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'configure_log': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'initialization': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'metric_collector': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'start_database': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'start_replication': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['logical'] \ No newline at end of file diff --git a/dbaas/logical/models.py b/dbaas/logical/models.py index 3200dbb75..e940eea26 100644 --- a/dbaas/logical/models.py +++ b/dbaas/logical/models.py @@ -132,6 +132,9 @@ class Database(BaseModel): is_monitoring = models.BooleanField( verbose_name=_("Is database being monitored?"), default=True ) + was_manually_stopped = models.BooleanField( + verbose_name=_("The database was manually stoppped?"), default=False + ) attention = models.BooleanField( verbose_name=_("The database has GCP divergences?"), default=False, blank=True ) diff --git a/dbaas/logical/templates/logical/database/details/base.html b/dbaas/logical/templates/logical/database/details/base.html index 9bd7a82f4..a0056fe2f 100644 --- a/dbaas/logical/templates/logical/database/details/base.html +++ b/dbaas/logical/templates/logical/database/details/base.html @@ -46,9 +46,9 @@

{% if database.attention %} Attention! {% endif %} - - Manually Stopped - + {% if database.was_manually_stopped %} + Manually Stopped + {% endif %}

diff --git a/dbaas/logical/templates/logical/database/details/details_tab.html b/dbaas/logical/templates/logical/database/details/details_tab.html index da2129db5..7f1bf5b48 100644 --- a/dbaas/logical/templates/logical/database/details/details_tab.html +++ b/dbaas/logical/templates/logical/database/details/details_tab.html @@ -359,9 +359,12 @@ value = $("#id_start_stop_database").val(); if(value.includes('Stop')){ url = "/logical/stop_database/"+ database_id; + att_manually_stopped = true; }else{ url = "/logical/start_database/"+ database_id; + att_manually_stopped = false } + jQuery.ajax({ "dataType": "json", "url": url, @@ -369,6 +372,18 @@ }).fail(function() { alert("invalid server response"); }).done(function(){ + + jQuery.ajax({ + "type": "GET", + "url": "/logical/set_manually_stopped/" + database_id + + "?manually_stopped="+att_manually_stopped, + complete: function () { + running_update = false; + }, + }).fail(function() { + alert("invalid server response"); + }); + running_update = false; window.location.reload(); }); diff --git a/dbaas/logical/urls.py b/dbaas/logical/urls.py index 0ef00b747..d4d5f5be9 100644 --- a/dbaas/logical/urls.py +++ b/dbaas/logical/urls.py @@ -1,5 +1,6 @@ from django.conf.urls import patterns, url -from .views import refresh_status, toggle_monitoring, start_database_vm, stop_database_vm, set_attention, funct_send_all_chg +from .views import (refresh_status, toggle_monitoring, start_database_vm, stop_database_vm, set_attention, + funct_send_all_chg, set_manually_stopped) from .views import (CredentialView, CredentialSSLView, credential_parameter_by_name, check_offering_sizes) @@ -21,6 +22,9 @@ url(r"^toggle_monitoring/(?P\d*)$", toggle_monitoring, name="toggle_monitoring"), + url(r"^set_manually_stopped/(?P\d*)$", + set_manually_stopped, + name="toggle_monitoring"), url(r"^send_all_chg/(?P\d*)$", funct_send_all_chg, name="marked_to_send_all_changes_to_service_now"), diff --git a/dbaas/logical/views.py b/dbaas/logical/views.py index 6e77accb9..b792c7b82 100644 --- a/dbaas/logical/views.py +++ b/dbaas/logical/views.py @@ -240,6 +240,19 @@ def toggle_monitoring(request, database_id): return HttpResponse(output, content_type="application/json") +def set_manually_stopped(request, database_id): + try: + database = Database.objects.get(id=database_id) + except (Database.DoesNotExist, ValueError): + return + database.was_manually_stopped = request.GET.get('manually_stopped') == 'true' + database.save() + instances_status = [] + output = json.dumps({'database_status': database.status_html, + 'instances_status': instances_status}) + return HttpResponse(output, content_type="application/json") + + def funct_send_all_chg(request, database_id): try: database = Database.objects.get(id=database_id) From 5b944078fe673974c6fb35f877a0c89c00babe69 Mon Sep 17 00:00:00 2001 From: Duda Date: Tue, 25 Apr 2023 16:57:43 -0300 Subject: [PATCH 3/4] Ajuste em nome de url e cor de tag em listagem --- dbaas/logical/admin/database.py | 2 +- dbaas/logical/urls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbaas/logical/admin/database.py b/dbaas/logical/admin/database.py index 0920ddd5e..f2d8fefc5 100644 --- a/dbaas/logical/admin/database.py +++ b/dbaas/logical/admin/database.py @@ -245,7 +245,7 @@ def manually_stopped_html(self, database): html_default = '{}' manually_stopped = "" if database.was_manually_stopped: - manually_stopped = html_default.format("warning", "Manually Stopped") + manually_stopped = html_default.format("important", "Manually Stopped") return format_html(manually_stopped) diff --git a/dbaas/logical/urls.py b/dbaas/logical/urls.py index d4d5f5be9..ba450521e 100644 --- a/dbaas/logical/urls.py +++ b/dbaas/logical/urls.py @@ -24,7 +24,7 @@ name="toggle_monitoring"), url(r"^set_manually_stopped/(?P\d*)$", set_manually_stopped, - name="toggle_monitoring"), + name="set_manually_stopped"), url(r"^send_all_chg/(?P\d*)$", funct_send_all_chg, name="marked_to_send_all_changes_to_service_now"), From fcb127f2e57c540b55164592e64279f1c13f2440 Mon Sep 17 00:00:00 2001 From: Duda Date: Wed, 26 Apr 2023 15:45:29 -0300 Subject: [PATCH 4/4] =?UTF-8?q?Ajuste=20para=20execu=C3=A7=C3=A3o=20(defin?= =?UTF-8?q?ir=20manually=5Fstopped=20como=20true/false)=20APENAS=20se=20o?= =?UTF-8?q?=20pa=C3=A7o=20de=20start/stop=20vm=20for=20sucesso.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logical/database/details/details_tab.html | 12 ------------ dbaas/maintenance/task_start_database_vm.py | 3 +++ dbaas/maintenance/task_stop_database_vm.py | 4 ++++ 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/dbaas/logical/templates/logical/database/details/details_tab.html b/dbaas/logical/templates/logical/database/details/details_tab.html index 7f1bf5b48..31f67be6a 100644 --- a/dbaas/logical/templates/logical/database/details/details_tab.html +++ b/dbaas/logical/templates/logical/database/details/details_tab.html @@ -372,18 +372,6 @@ }).fail(function() { alert("invalid server response"); }).done(function(){ - - jQuery.ajax({ - "type": "GET", - "url": "/logical/set_manually_stopped/" + database_id + - "?manually_stopped="+att_manually_stopped, - complete: function () { - running_update = false; - }, - }).fail(function() { - alert("invalid server response"); - }); - running_update = false; window.location.reload(); }); diff --git a/dbaas/maintenance/task_start_database_vm.py b/dbaas/maintenance/task_start_database_vm.py index e9393de0c..895336bd4 100644 --- a/dbaas/maintenance/task_start_database_vm.py +++ b/dbaas/maintenance/task_start_database_vm.py @@ -20,6 +20,9 @@ def task_start_database_vm(database, task, retry_from=None): if steps_for_instances( steps, instances_to_start_database_vm, task, start_database_vm.update_step, since_step=since_step ): + database.was_manually_stopped = False + database.save() + database.update_status() start_database_vm.set_success() task.set_status_success('Starting Database is done') diff --git a/dbaas/maintenance/task_stop_database_vm.py b/dbaas/maintenance/task_stop_database_vm.py index c822f70d5..8a6e3751b 100644 --- a/dbaas/maintenance/task_stop_database_vm.py +++ b/dbaas/maintenance/task_stop_database_vm.py @@ -29,6 +29,10 @@ def task_stop_database_vm(database, task, retry_from=None): if steps_for_instances( steps, instances_to_stop_database_vm, task, stop_database_vm.update_step, since_step=since_step ): + + database.was_manually_stopped = True + database.save() + database.update_status() stop_database_vm.set_success() task.set_status_success('Stopping Database is done')