Skip to content

Commit a294731

Browse files
authored
Merge pull request #874 from globocom/dev
Dev > Master
2 parents 597f3fd + a6ad8ba commit a294731

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+8611
-43
lines changed

dbaas/drivers/base.py

+3
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,9 @@ def get_final_infra_credentials(self):
473473
credential_type=self.credential_type
474474
)
475475
return credential.user, credential.password
476+
477+
def create_db_params_changes(self, database):
478+
raise NotImplementedError('Not implemented for Driver')
476479

477480

478481
class DatabaseStatus(object):

dbaas/drivers/mysqldb.py

+51
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from physical.models import Instance
1414
from drivers import BaseDriver, DatabaseInfraStatus, DatabaseStatus
1515
from drivers import errors as driver_errors
16+
from django.core.exceptions import ObjectDoesNotExist
1617

1718

1819
LOG = logging.getLogger(__name__)
@@ -537,7 +538,57 @@ def remove_metric_collector_user(self, username):
537538

538539
def get_start_pty_default(self):
539540
return True
541+
542+
def create_db_params_changes(self, database):
543+
from physical.models import DatabaseInfraParameter
540544

545+
parameter = self.get_max_connections_parameter()
546+
value = self.get_max_connections_value(database)
547+
548+
LOG.info('Parameter {} will be set to {}'.format(parameter.name, value))
549+
550+
DatabaseInfraParameter.update_parameter_value(
551+
databaseinfra=database.databaseinfra,
552+
parameter=parameter,
553+
value=value
554+
)
555+
556+
def get_max_connections_parameter(self):
557+
from physical.models import Parameter
558+
559+
param = Parameter.objects.filter(name='max_connections').first()
560+
if not param:
561+
raise ObjectDoesNotExist('Parametro max_connections nao foi encontrado')
562+
563+
return param
564+
565+
def get_max_connections_value(self, database):
566+
from system.models import Configuration
567+
568+
steps = Configuration.get_by_name('max_connections_steps')
569+
if not steps:
570+
raise ObjectDoesNotExist('Configuration max_connections_steps nao foi encontrado')
571+
572+
offering = database.databaseinfra.offering
573+
return self.get_max_connections_value_from_steps(steps, offering)
574+
575+
576+
def get_max_connections_value_from_steps(self, steps, offering):
577+
# steps ~= "0:1000,32768:2000,65536:4000"
578+
steps_list = steps.split(',')
579+
steps_map = {}
580+
581+
for step in steps_list:
582+
# step ~= "0:1000"
583+
steps_map[step.split(':')[0]] = step.split(':')[1]
584+
585+
ram = str(offering.memory_size_mb)
586+
587+
# steps_map ~= {'0': '1000', '32768': '2000'...}
588+
if ram not in steps_map:
589+
return int(steps_map['0'])
590+
591+
return int(steps_map[ram])
541592

542593
class MySQLFOXHA(MySQL):
543594

dbaas/drivers/replication_topologies/base.py

+3
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,9 @@ def get_stop_database_vm_steps(self):
735735

736736
def get_auto_upgrade_database_vm_offering(self):
737737
raise NotImplementedError('Not implemented for topology')
738+
739+
def get_configure_db_params_steps(self):
740+
raise NotImplementedError('Not implemented for topology')
738741

739742
def get_start_database_vm_steps(self):
740743
return [{

dbaas/drivers/replication_topologies/mongodb.py

+95
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,101 @@ def get_recreate_slave_steps(self):
916916
'workflow.steps.util.database.ConfigurePrometheusMonitoring'
917917
)
918918
}]
919+
920+
def get_auto_upgrade_database_vm_offering(self):
921+
return [{
922+
'Create new VM': (
923+
'workflow.steps.util.infra.OfferingAutoUpgrade',
924+
'workflow.steps.util.host_provider.AllocateIPTemporaryInstance',
925+
'workflow.steps.util.host_provider.CreateVirtualMachineTemporaryInstance',
926+
# 'workflow.steps.util.dns.CreateDNS',
927+
# 'workflow.steps.util.dns.CheckIsReady',
928+
'workflow.steps.util.vm.WaitingBeReadyTemporaryInstance',
929+
'workflow.steps.util.vm.UpdateOSDescriptionTemporaryInstance',
930+
)}, {
931+
'Attach new Volume': (
932+
'workflow.steps.util.volume_provider.NewVolumeFromSnapshot',
933+
'workflow.steps.util.volume_provider.AttachDataVolumeTemporaryInstance',
934+
'workflow.steps.util.volume_provider.MountDataVolumeTemporaryInstance',
935+
)}, {
936+
'Set SSL': (
937+
'workflow.steps.util.ssl.UpdateOpenSSlLibIfConfiguredTemporaryInstance',
938+
'workflow.steps.util.ssl.MongoDBUpdateCertificatesIfConfiguredTemporaryInstance',
939+
'workflow.steps.util.ssl.CreateSSLFolderRollbackIfRunningIfConfiguredTemporaryInstance',
940+
'workflow.steps.util.ssl.MongoDBCreateSSLConfForInfraIfConfiguredTemporaryInstance',
941+
'workflow.steps.util.ssl.RequestSSLForInfraIfConfiguredTemporaryInstance',
942+
'workflow.steps.util.ssl.CreateJsonRequestFileInfraIfConfiguredTemporaryInstance',
943+
'workflow.steps.util.ssl.CreateCertificateInfraMongoDBIfConfiguredTemporaryInstance',
944+
'workflow.steps.util.ssl.SetSSLFilesAccessMongoDBIfConfiguredTemporaryInstance',
945+
'workflow.steps.util.ssl.UpdateExpireAtDateTemporaryInstance',
946+
)}, {
947+
'Configure Plan': (
948+
'workflow.steps.util.plan.ConfigureTemporaryInstance',
949+
'workflow.steps.util.plan.ConfigureLogTemporaryInstance',
950+
'workflow.steps.util.metric_collector.ConfigureTelegrafTemporaryInstance',
951+
'workflow.steps.util.database_upgrade_patch.MongoDBCHGBinStepTemporaryInstance',
952+
'workflow.steps.util.database.StartDatabaseTemporaryInstance',
953+
'workflow.steps.util.database.StartCheckOnlyOsProcessTemporaryInstance',
954+
'workflow.steps.util.database.CheckIsUpTemporaryInstance',
955+
)}, {
956+
'Add Instance to ReplicaSet': (
957+
'workflow.steps.mongodb.database.AddInstanceToReplicaSetTemporaryInstance',
958+
'workflow.steps.util.database.WaitForReplicationTemporaryInstance',
959+
)}, {
960+
'Restart Telegraf and Rsyslog': (
961+
'workflow.steps.util.metric_collector.RestartTelegrafTemporaryInstance',
962+
'workflow.steps.util.database.StartRsyslogTemporaryInstance',
963+
)}, {
964+
'Replicate ACLs': (
965+
'workflow.steps.util.acl.ReplicateAcls2NewInstanceTemporaryInstance',
966+
'workflow.steps.util.acl.BindNewInstanceTemporaryInstance',
967+
)}, {
968+
'Add Alarms and Monitoring': (
969+
'workflow.steps.util.zabbix.CreateAlarmsTemporaryInstance',
970+
'workflow.steps.util.db_monitor.CreateMonitoringTemporaryInstance',
971+
'workflow.steps.util.database.ConfigurePrometheusMonitoringTemporaryInstance',
972+
)}, {
973+
'Changing Primary': (
974+
'workflow.steps.util.vm.ChangeMasterTemporaryInstance',
975+
)}, {
976+
'Resizing database': (
977+
'workflow.steps.util.zabbix.DisableAlarms',
978+
'workflow.steps.util.database.StopSlave',
979+
'workflow.steps.util.database.StopRsyslog',
980+
'workflow.steps.util.database.Stop',
981+
'workflow.steps.util.plan.ResizeConfigure',
982+
'workflow.steps.util.plan.ConfigureLog',
983+
'workflow.steps.util.host_provider.Stop',
984+
'workflow.steps.util.host_provider.ChangeOffering',
985+
'workflow.steps.util.host_provider.Start',
986+
'workflow.steps.util.vm.WaitingBeReady',
987+
'workflow.steps.util.database.Start',
988+
'workflow.steps.util.database.StartSlave',
989+
'workflow.steps.util.database.CheckIsUp',
990+
'workflow.steps.util.database.WaitForReplication',
991+
'workflow.steps.util.infra.Offering',
992+
'workflow.steps.util.vm.InstanceIsSlave',
993+
'workflow.steps.util.zabbix.EnableAlarms',
994+
)}, {
995+
'Returning Primary to original VM': (
996+
'workflow.steps.util.vm.ChangeMasterNotTemporaryInstance',
997+
)}, {
998+
'Destroying temporary VM': (
999+
'workflow.steps.util.db_monitor.DisableMonitoringTemporaryInstance',
1000+
'workflow.steps.util.zabbix.DestroyAlarmsTemporaryInstance',
1001+
1002+
'workflow.steps.util.database.StopRsyslogTemporaryInstance',
1003+
'workflow.steps.mongodb.database.RemoveInstanceFromReplicaSetTemporaryInstance',
1004+
'workflow.steps.util.database.StopTemporaryInstance',
1005+
1006+
'workflow.steps.util.volume_provider.DetachDataVolumeTemporaryInstance',
1007+
'workflow.steps.util.volume_provider.DestroyVolumeTemporaryInstance',
1008+
1009+
# 'workflow.steps.util.dns.DestroyDNSTemporaryInstance',
1010+
'workflow.steps.util.host_provider.DestroyVirtualMachineTemporaryInstance',
1011+
'workflow.steps.util.host_provider.DestroyIPTemporaryInstance',
1012+
)}
1013+
]
9191014

9201015
def get_host_migrate_steps(self):
9211016
return [{

dbaas/drivers/replication_topologies/mysql.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,15 @@ def get_deploy_steps(self):
210210
'workflow.steps.util.database.MakeSnapshot',
211211
)
212212
}]
213+
214+
def get_configure_db_params_steps(self):
215+
return [{
216+
'Configuring DB Params': (
217+
'workflow.steps.util.database.CreateParameterChange',
218+
'workflow.steps.util.plan.ConfigureOnlyDBConfigFile',
219+
'workflow.steps.util.database.ChangeDynamicParameters',
220+
'workflow.steps.util.database.UpdateKernelParameters',
221+
)}] + self.get_change_parameter_steps_final()
213222

214223
def get_host_migrate_steps(self):
215224
return [{
@@ -553,10 +562,10 @@ def get_deploy_steps(self):
553562
'workflow.steps.util.ssl.UpdateExpireAtDate',
554563
)}, {
555564
'Starting database': (
556-
'workflow.steps.util.plan.ConfigureForNewInfra',
557-
'workflow.steps.util.plan.ConfigureLogForNewInfra',
565+
'workflow.steps.util.plan.ConfigureForNewInfra', # mysql_foxha_57_configuration.sh
566+
'workflow.steps.util.plan.ConfigureLogForNewInfra', # rsyslog_config.sh
558567
'workflow.steps.util.metric_collector.ConfigureTelegraf',
559-
'workflow.steps.util.database.Start',
568+
'workflow.steps.util.database.Start', # start database
560569
'workflow.steps.util.metric_collector.RestartTelegraf',
561570
'workflow.steps.util.database.StartRsyslog',
562571
'workflow.steps.util.database.CheckIsUp',
@@ -1065,30 +1074,22 @@ def get_update_ssl_steps(self):
10651074
'Disable monitoring and alarms': (
10661075
'workflow.steps.util.zabbix.DisableAlarms',
10671076
'workflow.steps.util.db_monitor.DisableMonitoring',
1077+
'workflow.steps.util.ssl.UpdateExpireAtDateRollback',
1078+
'workflow.steps.util.ssl.BackupSSLFolder',
10681079
),
10691080
}] + [{
10701081
'Disable SSL': (
10711082
'workflow.steps.util.ssl.UnSetReplicationUserRequireSSL',
10721083
),
10731084
}] + [{
10741085
'Configure SSL': (
1075-
'workflow.steps.util.ssl.UpdateExpireAtDateRollback',
1076-
'workflow.steps.util.ssl.MoveSSLFolder',
1077-
'workflow.steps.util.ssl.UpdateOpenSSlLib',
1078-
'workflow.steps.util.ssl.CreateSSLFolder',
1079-
'workflow.steps.util.ssl.CreateSSLConfForInfraEndPoint',
1080-
'workflow.steps.util.ssl.CreateSSLConfForInstanceIP',
1081-
'workflow.steps.util.ssl.RequestSSLForInfra',
1082-
'workflow.steps.util.ssl.RequestSSLForInstance',
1086+
'workflow.steps.util.ssl.UpdateSSLForInfra',
1087+
'workflow.steps.util.ssl.UpdateSSLForInstance',
10831088
'workflow.steps.util.ssl.CreateJsonRequestFileInfra',
10841089
'workflow.steps.util.ssl.CreateJsonRequestFileInstance',
10851090
'workflow.steps.util.ssl.CreateCertificateInfra',
10861091
'workflow.steps.util.ssl.CreateCertificateInstance',
10871092
'workflow.steps.util.ssl.SetSSLFilesAccessMySQL',
1088-
'workflow.steps.util.ssl.SetInfraConfiguredSSL',
1089-
'workflow.steps.util.plan.Configure',
1090-
'workflow.steps.util.plan.ConfigureLog',
1091-
'workflow.steps.util.metric_collector.ConfigureTelegraf',
10921093
'workflow.steps.util.ssl.UpdateExpireAtDate',
10931094
),
10941095
}] + [{
@@ -1097,7 +1098,7 @@ def get_update_ssl_steps(self):
10971098
'workflow.steps.util.vm.ChangeMaster',
10981099
'workflow.steps.util.database.CheckIfSwitchMaster',
10991100
'workflow.steps.util.database.Stop',
1100-
# 'workflow.steps.util.ssl.RestoreSSLFolder4Rollback',
1101+
'workflow.steps.util.ssl.RestoreSSLFolder4Rollback',
11011102
'workflow.steps.util.database.Start',
11021103
'workflow.steps.util.metric_collector.RestartTelegraf',
11031104
'workflow.steps.util.database.CheckIfSwitchMasterRollback',
@@ -1111,7 +1112,6 @@ def get_update_ssl_steps(self):
11111112
),
11121113
}] + [{
11131114
'Enabling monitoring and alarms': (
1114-
'workflow.steps.util.db_monitor.UpdateInfraSSLMonitor',
11151115
'workflow.steps.util.db_monitor.EnableMonitoring',
11161116
'workflow.steps.util.zabbix.EnableAlarms',
11171117
),

dbaas/logical/templates/logical/database/details/parameters_tab.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
<fieldset class="module aligned ">
66
<div class="panel-heading">
77
<h3 class="panel-title">Custom Parameters</h3>
8+
{% if show_auto_configure_btn %}
9+
<a href="{% url 'auto_configure_db_params_btn' database.id %}" target="_blank" class="btn btn-primary">AutoConfigure DB Params</a>
10+
{% endif %}
811
</div>
912

1013
<div class="panel-body">
11-
1214
<table id="table-parameters" class="table table-striped table-hover" data-database-id="{{database.pk}}" >
1315
<thead>
1416
<tr>

dbaas/logical/urls.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.conf.urls import patterns, url
22
from .views import refresh_status, toggle_monitoring, start_database_vm, stop_database_vm, set_attention, funct_send_all_chg
33
from .views import (CredentialView, CredentialSSLView,
4-
credential_parameter_by_name, check_offering_sizes, resize_vm_from_btn)
4+
credential_parameter_by_name, check_offering_sizes, resize_vm_from_btn, auto_configure_db_params_btn)
55

66

77
urlpatterns = patterns(
@@ -38,5 +38,8 @@
3838
name="check_offering_sizes"),
3939
url(r"^resize_vm/(?P<database_id>\d*)/(?P<resize_target>[\w\-\_]+)",
4040
resize_vm_from_btn,
41-
name="resize_vm_from_btn")
41+
name="resize_vm_from_btn"),
42+
url(r"^autoconfigure_db_params/(?P<database_id>\d*[\w\-\_]+)",
43+
auto_configure_db_params_btn,
44+
name="auto_configure_db_params_btn")
4245
)

dbaas/logical/views.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,17 @@ def get_context_data(self, **kwargs):
693693
self.context['form_status'] = self.form_status
694694
self.context['last_change_parameters'] = last_change_parameters
695695

696+
user_teams = self.request.user.team_set.all()
697+
teams_names = []
698+
for team in user_teams:
699+
teams_names.append(team.name)
700+
701+
show_auto_configure_btn = False
702+
if self.request.user.is_superuser or 'dbaas' in teams_names:
703+
show_auto_configure_btn = True
704+
705+
self.context['show_auto_configure_btn'] = show_auto_configure_btn
706+
696707
return self.context
697708

698709
def post(self, request, *args, **kwargs):
@@ -2747,8 +2758,25 @@ def resize_vm_from_btn(request, database_id, resize_target):
27472758
LOG.info("Starting database auto upgrade: database {}, user: {}".format(database, user))
27482759

27492760
TaskRegister.auto_upgrade_database_vm_offering(
2750-
database=database, user=user
2761+
database=database, user=user, resize_target=resize_target
27512762
)
27522763

27532764
future_offering = database.get_future_offering(resize_target)
27542765
return HttpResponse(json.dumps({'future_offering': future_offering.name}), content_type="application/json")
2766+
2767+
2768+
@login_required()
2769+
@method_decorator(csrf_exempt)
2770+
def auto_configure_db_params_btn(request, database_id):
2771+
database = get_object_or_404(Database, pk=database_id)
2772+
user = request.user
2773+
2774+
from notification.tasks import TaskRegister
2775+
2776+
LOG.info("Starting auto configure DB Params: database {}, user: {}".format(database, user))
2777+
2778+
TaskRegister.configure_db_params(
2779+
database=database, user=user
2780+
)
2781+
2782+
return HttpResponse(({'success'}), content_type="application/json")

dbaas/maintenance/admin/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from . database_start_database_vm import DatabaseStartDatabaseVMAdmin
3030
from . database_stop_database_vm import DatabaseStopDatabaseVMAdmin
3131
from . database_auto_upgrade_vm_offering import DatabaseAutoUpgradeVMOferringAdmin
32+
from . database_configure_db_params import DatabaseConfigureDBParamsAdmin
3233

3334

3435
admin.site.register(models.Maintenance, MaintenanceAdmin)
@@ -79,3 +80,7 @@
7980
admin.site.register(
8081
models.DatabaseAutoUpgradeVMOffering, DatabaseAutoUpgradeVMOferringAdmin
8182
)
83+
84+
admin.site.register(
85+
models.DatabaseConfigureDBParams, DatabaseConfigureDBParamsAdmin
86+
)

dbaas/maintenance/admin/database_auto_upgrade_vm_offering.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ class DatabaseAutoUpgradeVMOferringAdmin(DatabaseMaintenanceTaskAdmin):
2222
)
2323

2424
readonly_fields = (
25-
"database", "task",
25+
"database", "task", "resize_target",
2626
"started_at", "link_task", "finished_at", "status",
27-
"maintenance_action", "task_schedule"
27+
"maintenance_action", "task_schedule",
28+
"number_of_instances", "number_of_instances_before",
29+
"base_snapshot"
2830
)
2931

3032
def maintenance_action(self, maintenance):
@@ -84,7 +86,8 @@ def retry_view(self, request, auto_upgrade_vm_offering_id):
8486
TaskRegister.auto_upgrade_database_vm_offering(
8587
database=retry_from.database,
8688
user=request.user,
87-
retry_from=retry_from
89+
retry_from=retry_from,
90+
resize_target=retry_from.resize_target
8891
)
8992

9093
url = reverse('admin:notification_taskhistory_changelist')

0 commit comments

Comments
 (0)