Skip to content

Commit 1bb463a

Browse files
authored
Merge pull request #223 from globocom/checkbox_disk_auto_resize
Checkbox disk auto resize
2 parents 0c0312d + 6351529 commit 1bb463a

File tree

4 files changed

+200
-2
lines changed

4 files changed

+200
-2
lines changed

dbaas/logical/admin/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class DatabaseAdmin(admin.DjangoServicesAdmin):
9595
(None, {
9696
'fields': [
9797
'name', 'description', 'contacts', 'project', 'team',
98-
'subscribe_to_email_events',
98+
'subscribe_to_email_events', 'disk_auto_resize',
9999
]
100100
}
101101
),
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# -*- coding: utf-8 -*-
2+
from south.utils import datetime_utils as datetime
3+
from south.db import db
4+
from south.v2 import SchemaMigration
5+
from django.db import models
6+
7+
8+
class Migration(SchemaMigration):
9+
10+
def forwards(self, orm):
11+
# Adding field 'Database.disk_auto_resize'
12+
db.add_column(u'logical_database', 'disk_auto_resize',
13+
self.gf('django.db.models.fields.BooleanField')(default=True),
14+
keep_default=False)
15+
16+
17+
def backwards(self, orm):
18+
# Deleting field 'Database.disk_auto_resize'
19+
db.delete_column(u'logical_database', 'disk_auto_resize')
20+
21+
22+
models = {
23+
u'account.team': {
24+
'Meta': {'ordering': "[u'name']", 'object_name': 'Team'},
25+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
26+
'database_alocation_limit': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '2'}),
27+
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
28+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
29+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
30+
'role': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']"}),
31+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
32+
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'})
33+
},
34+
u'auth.group': {
35+
'Meta': {'object_name': 'Group'},
36+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
37+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
38+
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
39+
},
40+
u'auth.permission': {
41+
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
42+
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
43+
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
44+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
45+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
46+
},
47+
u'auth.user': {
48+
'Meta': {'object_name': 'User'},
49+
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
50+
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
51+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
52+
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
53+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
54+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
55+
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
56+
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
57+
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
58+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
59+
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
60+
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
61+
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
62+
},
63+
u'contenttypes.contenttype': {
64+
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
65+
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
66+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
67+
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
68+
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
69+
},
70+
u'logical.credential': {
71+
'Meta': {'ordering': "(u'database', u'user')", 'unique_together': "((u'user', u'database'),)", 'object_name': 'Credential'},
72+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
73+
'database': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'credentials'", 'to': u"orm['logical.Database']"}),
74+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
75+
'password': ('django.db.models.fields.CharField', [], {'max_length': '406'}),
76+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
77+
'user': ('django.db.models.fields.CharField', [], {'max_length': '100'})
78+
},
79+
u'logical.database': {
80+
'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'name', u'environment'),)", 'object_name': 'Database'},
81+
'backup_path': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}),
82+
'contacts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
83+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
84+
'databaseinfra': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databases'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DatabaseInfra']"}),
85+
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
86+
'disk_auto_resize': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
87+
'environment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databases'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Environment']"}),
88+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
89+
'is_in_quarantine': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
90+
'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}),
91+
'project': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'databases'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['logical.Project']"}),
92+
'quarantine_dt': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
93+
'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
94+
'subscribe_to_email_events': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
95+
'team': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'databases'", 'null': 'True', 'to': u"orm['account.Team']"}),
96+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
97+
'used_size_in_bytes': ('django.db.models.fields.FloatField', [], {'default': '0.0'})
98+
},
99+
u'logical.project': {
100+
'Meta': {'ordering': "[u'name']", 'object_name': 'Project'},
101+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
102+
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
103+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
104+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
105+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
106+
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
107+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
108+
},
109+
u'physical.databaseinfra': {
110+
'Meta': {'object_name': 'DatabaseInfra'},
111+
'capacity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
112+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
113+
'disk_offering': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DiskOffering']"}),
114+
'endpoint': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
115+
'endpoint_dns': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
116+
'engine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Engine']"}),
117+
'environment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Environment']"}),
118+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
119+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
120+
'password': ('django.db.models.fields.CharField', [], {'max_length': '406', 'blank': 'True'}),
121+
'per_database_size_mbytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
122+
'plan': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'databaseinfras'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.Plan']"}),
123+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
124+
'user': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
125+
},
126+
u'physical.diskoffering': {
127+
'Meta': {'object_name': 'DiskOffering'},
128+
'available_size_kb': ('django.db.models.fields.PositiveIntegerField', [], {}),
129+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
130+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
131+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
132+
'size_kb': ('django.db.models.fields.PositiveIntegerField', [], {}),
133+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
134+
},
135+
u'physical.engine': {
136+
'Meta': {'unique_together': "((u'version', u'engine_type'),)", 'object_name': 'Engine'},
137+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
138+
'engine_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'engines'", 'on_delete': 'models.PROTECT', 'to': u"orm['physical.EngineType']"}),
139+
'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']"}),
140+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
141+
'path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
142+
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
143+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
144+
'user_data_script': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
145+
'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
146+
},
147+
u'physical.enginetype': {
148+
'Meta': {'object_name': 'EngineType'},
149+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
150+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
152+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
153+
},
154+
u'physical.environment': {
155+
'Meta': {'object_name': 'Environment'},
156+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
157+
'equivalent_environment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['physical.Environment']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
158+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
159+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
160+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
161+
},
162+
u'physical.plan': {
163+
'Meta': {'object_name': 'Plan'},
164+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
165+
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
166+
'disk_offering': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'plans'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['physical.DiskOffering']"}),
167+
'engine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'plans'", 'to': u"orm['physical.Engine']"}),
168+
'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']"}),
169+
'environments': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['physical.Environment']", 'symmetrical': 'False'}),
170+
'equivalent_plan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['physical.Plan']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
171+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
172+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
173+
'is_default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
174+
'is_ha': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
175+
'max_db_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
176+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
177+
'provider': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
178+
'replication_topology': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'replication_topology'", 'null': 'True', 'to': u"orm['physical.ReplicationTopology']"}),
179+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
180+
},
181+
u'physical.replicationtopology': {
182+
'Meta': {'object_name': 'ReplicationTopology'},
183+
'class_path': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
184+
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
185+
'engine': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'replication_topologies'", 'symmetrical': 'False', 'to': u"orm['physical.Engine']"}),
186+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
187+
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
188+
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
189+
}
190+
}
191+
192+
complete_apps = ['logical']

dbaas/logical/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ class Database(BaseModel):
111111
"Check this box if you'd like to receive information regarding this database by email."
112112
)
113113
)
114+
disk_auto_resize = models.BooleanField(
115+
verbose_name=_("Disk auto resize"), default=True,
116+
help_text=_(
117+
"When marked, the disk will be resized automatically."
118+
)
119+
)
114120

115121
objects = models.Manager()
116122
alive = DatabaseAliveManager()

dbaas/notification/tasks_disk_resize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def zabbix_collect_used_disk(task):
9191
message='Zabbix metrics not updated', level=4
9292
)
9393

94-
if current_percentage >= threshold_disk_resize:
94+
if current_percentage >= threshold_disk_resize and database.disk_auto_resize:
9595
try:
9696
task_resize = disk_auto_resize(
9797
database=database,

0 commit comments

Comments
 (0)