mirror of https://github.com/jumpserver/jumpserver
140 lines
5.3 KiB
Python
140 lines
5.3 KiB
Python
# Generated by Django 2.2.13 on 2020-10-19 12:01
|
|
|
|
from django.db import migrations, models
|
|
import django.db.models.deletion
|
|
import uuid
|
|
|
|
|
|
CATEGORY_DB_LIST = ['mysql', 'oracle', 'postgresql', 'mariadb']
|
|
CATEGORY_REMOTE_LIST = ['chrome', 'mysql_workbench', 'vmware_client', 'custom']
|
|
CATEGORY_CLOUD_LIST = ['k8s']
|
|
|
|
CATEGORY_DB = 'db'
|
|
CATEGORY_REMOTE = 'remote_app'
|
|
CATEGORY_CLOUD = 'cloud'
|
|
CATEGORY_LIST = [CATEGORY_DB, CATEGORY_REMOTE, CATEGORY_CLOUD]
|
|
|
|
|
|
def get_application_category(old_app):
|
|
_type = old_app.type
|
|
if _type in CATEGORY_DB_LIST:
|
|
category = CATEGORY_DB
|
|
elif _type in CATEGORY_REMOTE_LIST:
|
|
category = CATEGORY_REMOTE
|
|
elif _type in CATEGORY_CLOUD_LIST:
|
|
category = CATEGORY_CLOUD
|
|
else:
|
|
category = None
|
|
return category
|
|
|
|
|
|
def common_to_application_json(old_app):
|
|
category = get_application_category(old_app)
|
|
date_updated = old_app.date_updated if hasattr(old_app, 'date_updated') else old_app.date_created
|
|
return {
|
|
'id': old_app.id,
|
|
'name': old_app.name,
|
|
'type': old_app.type,
|
|
'category': category,
|
|
'comment': old_app.comment,
|
|
'created_by': old_app.created_by,
|
|
'date_created': old_app.date_created,
|
|
'date_updated': date_updated,
|
|
'org_id': old_app.org_id
|
|
}
|
|
|
|
|
|
def db_to_application_json(database):
|
|
app_json = common_to_application_json(database)
|
|
app_json.update({
|
|
'attrs': {
|
|
'host': database.host,
|
|
'port': database.port,
|
|
'database': database.database
|
|
}
|
|
})
|
|
return app_json
|
|
|
|
|
|
def remote_to_application_json(remote):
|
|
app_json = common_to_application_json(remote)
|
|
attrs = {
|
|
'asset': str(remote.asset.id),
|
|
'path': remote.path,
|
|
}
|
|
attrs.update(remote.params)
|
|
app_json.update({
|
|
'attrs': attrs
|
|
})
|
|
return app_json
|
|
|
|
|
|
def k8s_to_application_json(k8s):
|
|
app_json = common_to_application_json(k8s)
|
|
app_json.update({
|
|
'attrs': {
|
|
'cluster': k8s.cluster
|
|
}
|
|
})
|
|
return app_json
|
|
|
|
|
|
def migrate_and_integrate_applications(apps, schema_editor):
|
|
db_alias = schema_editor.connection.alias
|
|
|
|
database_app_model = apps.get_model("applications", "DatabaseApp")
|
|
remote_app_model = apps.get_model("applications", "RemoteApp")
|
|
k8s_app_model = apps.get_model("applications", "K8sApp")
|
|
|
|
database_apps = database_app_model.objects.using(db_alias).all()
|
|
remote_apps = remote_app_model.objects.using(db_alias).all()
|
|
k8s_apps = k8s_app_model.objects.using(db_alias).all()
|
|
|
|
database_applications = [db_to_application_json(db_app) for db_app in database_apps]
|
|
remote_applications = [remote_to_application_json(remote_app) for remote_app in remote_apps]
|
|
k8s_applications = [k8s_to_application_json(k8s_app) for k8s_app in k8s_apps]
|
|
|
|
applications_json = database_applications + remote_applications + k8s_applications
|
|
application_model = apps.get_model("applications", "Application")
|
|
applications = [
|
|
application_model(**application_json)
|
|
for application_json in applications_json
|
|
if application_json['category'] in CATEGORY_LIST
|
|
]
|
|
for application in applications:
|
|
if application_model.objects.using(db_alias).filter(name=application.name).exists():
|
|
application.name = '{}-{}'.format(application.name, application.type)
|
|
application.save()
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('assets', '0057_fill_node_value_assets_amount_and_parent_key'),
|
|
('applications', '0005_k8sapp'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='Application',
|
|
fields=[
|
|
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
|
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
|
('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
|
|
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
|
|
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
|
('name', models.CharField(max_length=128, verbose_name='Name')),
|
|
('category', models.CharField(choices=[('db', 'Database'), ('remote_app', 'Remote app'), ('cloud', 'Cloud')], max_length=16, verbose_name='Category')),
|
|
('type', models.CharField(choices=[('mysql', 'MySQL'), ('oracle', 'Oracle'), ('postgresql', 'PostgreSQL'), ('mariadb', 'MariaDB'), ('chrome', 'Chrome'), ('mysql_workbench', 'MySQL Workbench'), ('vmware_client', 'vSphere Client'), ('custom', 'Custom'), ('k8s', 'Kubernetes')], max_length=16, verbose_name='Type')),
|
|
('attrs', models.JSONField(default=dict)),
|
|
('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')),
|
|
('domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='applications', to='assets.Domain', verbose_name='Domain')),
|
|
],
|
|
options={
|
|
'ordering': ('name',),
|
|
'unique_together': {('org_id', 'name')},
|
|
},
|
|
),
|
|
migrations.RunPython(migrate_and_integrate_applications),
|
|
]
|