From 08d7f905b57060ae4d6418ee2e681bef4830e96e Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 15 Apr 2020 16:36:41 +0530 Subject: [PATCH] feat: provision to deploy packages --- .../deploy_instance/deploy_instance.json | 45 ++++++----------- frappe/custom/doctype/package/package.js | 24 ++++++--- frappe/custom/doctype/package/package.json | 14 +++++- frappe/custom/doctype/package/package.py | 37 +++++++++++++- frappe/custom/doctype/release/__init__.py | 0 frappe/custom/doctype/release/release.js | 23 --------- frappe/custom/doctype/release/release.json | 41 --------------- frappe/custom/doctype/release/release.py | 50 ------------------- frappe/custom/doctype/release/test_release.py | 10 ---- .../doctype/release_instance/__init__.py | 0 .../release_instance/release_instance.json | 32 ------------ .../release_instance/release_instance.py | 10 ---- 12 files changed, 80 insertions(+), 206 deletions(-) delete mode 100644 frappe/custom/doctype/release/__init__.py delete mode 100644 frappe/custom/doctype/release/release.js delete mode 100644 frappe/custom/doctype/release/release.json delete mode 100644 frappe/custom/doctype/release/release.py delete mode 100644 frappe/custom/doctype/release/test_release.py delete mode 100644 frappe/custom/doctype/release_instance/__init__.py delete mode 100644 frappe/custom/doctype/release_instance/release_instance.json delete mode 100644 frappe/custom/doctype/release_instance/release_instance.py diff --git a/frappe/custom/doctype/deploy_instance/deploy_instance.json b/frappe/custom/doctype/deploy_instance/deploy_instance.json index 2822ab81f9..4bb140f088 100644 --- a/frappe/custom/doctype/deploy_instance/deploy_instance.json +++ b/frappe/custom/doctype/deploy_instance/deploy_instance.json @@ -1,63 +1,46 @@ { "actions": [], - "autoname": "field:instance", - "creation": "2020-04-06 15:34:44.428007", + "creation": "2020-03-18 18:25:02.024237", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "instance", - "user", + "instance_url", + "username", "password" ], "fields": [ { - "fieldname": "instance", + "fieldname": "instance_url", "fieldtype": "Data", "in_list_view": 1, - "in_standard_filter": 1, "label": "Instance URL", - "unique": 1 + "reqd": 1 }, { - "fieldname": "user", + "fieldname": "username", "fieldtype": "Data", "in_list_view": 1, - "in_standard_filter": 1, - "label": "User", - "options": "Email" + "label": "Username", + "reqd": 1 }, { "fieldname": "password", "fieldtype": "Password", - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Password" + "label": "Password", + "reqd": 1 } ], + "istable": 1, "links": [], - "modified": "2020-04-06 15:40:39.242881", + "modified": "2020-04-14 13:56:31.167730", "modified_by": "Administrator", "module": "Custom", "name": "Deploy Instance", "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "write": 1 - } - ], + "permissions": [], "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_views": 1 + "track_changes": 1 } \ No newline at end of file diff --git a/frappe/custom/doctype/package/package.js b/frappe/custom/doctype/package/package.js index 1743f38dd3..47a7bce0df 100644 --- a/frappe/custom/doctype/package/package.js +++ b/frappe/custom/doctype/package/package.js @@ -3,12 +3,6 @@ frappe.ui.form.on('Package', { refresh: function(frm) { - if (frm.doc.package_details) { - frm.add_custom_button(__("Go to Release"), function() { - frappe.set_route("Form", "Release", "Release"); - }); - } - frm.set_query("document_type", "package_details", function () { return { filters: { @@ -16,13 +10,29 @@ frappe.ui.form.on('Package', { } }; }); + + frappe.realtime.on("package", (data) => { + frm.dashboard.show_progress(data.prefix, data.progress / data.total * 100, __("{0}", [data.message])); + if ((data.progress+1) != data.total) { + frm.dashboard.show_progress(data.prefix, data.progress / data.total * 100, __("{0}", [data.message])); + } else { + frm.dashboard.hide_progress(); + } + }); + + if(frm.doc.instances){ + frm.add_custom_button(__("Deploy"), function() { + frm.call("deploy_package"); + }); + } + }, import: function(frm) { frm.call("import_from_package"); } }); -frappe.ui.form.on('Package Details', { +frappe.ui.form.on('Package Detail', { form_render: function (frm, cdt, cdn) { function _show_filters(filters, table) { table.find('tbody').empty(); diff --git a/frappe/custom/doctype/package/package.json b/frappe/custom/doctype/package/package.json index 0607abf6d7..2bec7f9b79 100644 --- a/frappe/custom/doctype/package/package.json +++ b/frappe/custom/doctype/package/package.json @@ -6,6 +6,8 @@ "engine": "InnoDB", "field_order": [ "package_details", + "section_break_2", + "instances", "import_section", "attach", "import" @@ -34,11 +36,21 @@ "fieldtype": "Table", "label": "Package Details", "options": "Package Detail" + }, + { + "fieldname": "section_break_2", + "fieldtype": "Section Break" + }, + { + "fieldname": "instances", + "fieldtype": "Table", + "label": "Instances", + "options": "Deploy Instance" } ], "issingle": 1, "links": [], - "modified": "2020-04-06 14:32:42.202640", + "modified": "2020-04-14 13:50:50.779396", "modified_by": "Administrator", "module": "Custom", "name": "Package", diff --git a/frappe/custom/doctype/package/package.py b/frappe/custom/doctype/package/package.py index 0cdfe4a87e..b4427d55bc 100644 --- a/frappe/custom/doctype/package/package.py +++ b/frappe/custom/doctype/package/package.py @@ -11,9 +11,11 @@ from frappe.model.document import Document from frappe.utils.file_manager import save_file, get_file from frappe import _ from six import string_types +from frappe.frappeclient import FrappeClient +from frappe.model.naming import make_autoname +from frappe.utils.password import get_decrypted_password class Package(Document): - def import_from_package(self): filters = {"attached_to_doctype": "Package", "attached_to_name": "Package"} files = frappe.get_list("File", filters=filters, limit=1, order_by="creation desc") @@ -27,6 +29,39 @@ class Package(Document): frappe.msgprint(_("Package Imported.")) + def deploy_package(self): + package = export_package() + + for dt_file in frappe.get_list("File", filters={"attached_to_doctype": "Release", "attached_to_name": "Release"}): + frappe.delete_doc_if_exists("File", dt_file.name) + + file_name = make_autoname("Package") + save_file(file_name, json.dumps(package), "Package", "Package") + + length = len(self.instances) + for idx, instance in enumerate(self.instances): + frappe.publish_realtime("package", {"progress": idx, "total": length, "message": instance.instance_url, "prefix": _("Deploying")}, + user=frappe.session.user) + + self.install_package_to_remote(package, instance) + + def install_package_to_remote(self, package, instance): + print((instance.doctype, instance.name)) + try: + connection = FrappeClient(instance.instance_url, instance.username, get_decrypted_password(instance.doctype, instance.name)) + except Exception: + frappe.log_error(frappe.get_traceback()) + frappe.throw(_("Couldn't connect to site {0}. Please check Error Logs.").format(instance.instance_url)) + + try: + connection.post_request({ + "cmd": "frappe.custom.doctype.package.package.import_package", + "package": json.dumps(package) + }) + except Exception: + frappe.log_error(frappe.get_traceback()) + frappe.throw(_("Error while installing package to site {0}. Please check Error Logs.").format(instance.instance_url)) + @frappe.whitelist() def export_package(): """Export package as JSON.""" diff --git a/frappe/custom/doctype/release/__init__.py b/frappe/custom/doctype/release/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/custom/doctype/release/release.js b/frappe/custom/doctype/release/release.js deleted file mode 100644 index 709ae18d36..0000000000 --- a/frappe/custom/doctype/release/release.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2020, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Release', { - refresh: function(frm) { - frm.add_custom_button(__("Go to Package"), function() { - frappe.set_route("Form", "Package", "Package"); - }); - - frm.add_custom_button(__("Release"), function() { - frm.call("create_release"); - }); - - frappe.realtime.on("package", (data) => { - frm.dashboard.show_progress(data.prefix, data.progress / data.total * 100, __("{0}", [data.message])); - if ((data.progress+1) != data.total) { - frm.dashboard.show_progress(data.prefix, data.progress / data.total * 100, __("{0}", [data.message])); - } else { - frm.dashboard.hide_progress(); - } - }); - } -}); diff --git a/frappe/custom/doctype/release/release.json b/frappe/custom/doctype/release/release.json deleted file mode 100644 index b3f44196d0..0000000000 --- a/frappe/custom/doctype/release/release.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "actions": [], - "creation": "2020-03-17 13:27:30.158389", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "instances" - ], - "fields": [ - { - "fieldname": "instances", - "fieldtype": "Table", - "label": "Instances", - "options": "Release Instance" - } - ], - "issingle": 1, - "links": [], - "modified": "2020-04-06 14:56:56.206720", - "modified_by": "Administrator", - "module": "Custom", - "name": "Release", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "print": 1, - "read": 1, - "role": "System Manager", - "share": 1, - "write": 1 - } - ], - "quick_entry": 1, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1 -} \ No newline at end of file diff --git a/frappe/custom/doctype/release/release.py b/frappe/custom/doctype/release/release.py deleted file mode 100644 index 05b99f3e57..0000000000 --- a/frappe/custom/doctype/release/release.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -import json -from frappe import _ -from frappe.model.document import Document -from frappe.custom.doctype.package.package import export_package -from frappe.frappeclient import FrappeClient -from frappe.utils.file_manager import save_file -from frappe.model.naming import make_autoname -from frappe.utils.password import get_decrypted_password - -class Release(Document): - - def create_release(self): - package = export_package() - - for dt_file in frappe.get_list("File", filters={"attached_to_doctype": "Release", "attached_to_name": "Release"}): - frappe.delete_doc_if_exists("File", dt_file.name) - - file_name = make_autoname("Package") - save_file(file_name, json.dumps(package), "Release", "Release") - - length = len(self.instances) - for idx, instance in enumerate(self.instances): - frappe.publish_realtime("package", {"progress": idx, "total": length, "message": instance.instance, "prefix": _("Deploying")}, - user=frappe.session.user) - - self.install_package_to_remote(package, instance) - - def install_package_to_remote(self, package, instance): - remote = frappe.get_doc("Deploy Instance", instance.instance) - - try: - connection = FrappeClient(remote.instance, remote.user, get_decrypted_password(remote.doctype, remote.name)) - except Exception: - frappe.log_error(frappe.get_traceback()) - frappe.throw(_("Couldn't connect to site {0}. Please check Error Logs.").format(remote.instance)) - - try: - connection.post_request({ - "cmd": "frappe.custom.doctype.package.package.import_package", - "package": json.dumps(package) - }) - except Exception: - frappe.log_error(frappe.get_traceback()) - frappe.throw(_("Error while installing package to site {0}. Please check Error Logs.").format(remote.instance)) diff --git a/frappe/custom/doctype/release/test_release.py b/frappe/custom/doctype/release/test_release.py deleted file mode 100644 index 13e4e26ac0..0000000000 --- a/frappe/custom/doctype/release/test_release.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and Contributors -# See license.txt -from __future__ import unicode_literals - -# import frappe -import unittest - -class TestRelease(unittest.TestCase): - pass diff --git a/frappe/custom/doctype/release_instance/__init__.py b/frappe/custom/doctype/release_instance/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/custom/doctype/release_instance/release_instance.json b/frappe/custom/doctype/release_instance/release_instance.json deleted file mode 100644 index 4ac4f30246..0000000000 --- a/frappe/custom/doctype/release_instance/release_instance.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "actions": [], - "creation": "2020-03-18 18:25:02.024237", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "instance" - ], - "fields": [ - { - "fieldname": "instance", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Instance", - "options": "Deploy Instance", - "reqd": 1 - } - ], - "istable": 1, - "links": [], - "modified": "2020-04-06 15:37:07.099322", - "modified_by": "Administrator", - "module": "Custom", - "name": "Release Instance", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1 -} \ No newline at end of file diff --git a/frappe/custom/doctype/release_instance/release_instance.py b/frappe/custom/doctype/release_instance/release_instance.py deleted file mode 100644 index f5b745a9b4..0000000000 --- a/frappe/custom/doctype/release_instance/release_instance.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -# import frappe -from frappe.model.document import Document - -class ReleaseInstance(Document): - pass