diff --git a/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/__main__.py b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/__main__.py index 8a6812a..0d63343 100644 --- a/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/__main__.py +++ b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/__main__.py @@ -1,28 +1,25 @@ -from cloudshell.workflow.orchestration.sandbox import Sandbox from cloudshell.helpers.scripts import cloudshell_scripts_helpers as helpers from cloudshell.helpers.save_workflow.save_app_utility import SaveAppUtility - import os +NEW_APP_PARAM = "NEWAPPNAME" +IMAGE_URL_PARAM = "DISPLAYIMAGEURL" + def save_app(): - sandbox = Sandbox() connectivity = helpers.get_connectivity_context_details() resource = helpers.get_resource_context_details() + reservation_details = helpers.get_reservation_context_details() + sandbox_id = reservation_details.id + api = helpers.get_api_session() - if 'NEWAPPNAME' in os.environ: - new_app_name = os.environ['NEWAPPNAME'] - else: - new_app_name = '' - - if 'DISPLAYIMAGEURL' in os.environ: - image_url = os.environ['DISPLAYIMAGEURL'] - else: - image_url = '' + new_app_name = os.environ.get(NEW_APP_PARAM, "") + image_url = os.environ.get(IMAGE_URL_PARAM, "") - apputility = SaveAppUtility(sandbox, resource.name, connectivity.server_address, connectivity.admin_user, - connectivity.admin_pass, image_url, new_app_name, save_as=True) - apputility.save_flow() + app_utility = SaveAppUtility(api, sandbox_id, resource.name, connectivity.server_address, connectivity.admin_user, + connectivity.admin_pass, image_url, new_app_name, save_as=True) + saved_app_info = app_utility.save_flow() + print(saved_app_info) if __name__ == "__main__": diff --git a/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/requirements.txt b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/requirements.txt index 582eddd..6fefdff 100644 --- a/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/requirements.txt +++ b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/requirements.txt @@ -1,4 +1,5 @@ -cloudshell-orch-core>=1.7.0.0,<1.8.0.0 -cloudshell-automation-api>=9.3 +# cloudshell-orch-core>=1.7.0.0,<1.8.0.0 +# cloudshell-automation-api>=9.3 +# requests==2.23.0 +# why do we need to list dependencies that are included in app helper package cloudshell-app-helper>=2.0.0,<3.0.0 -requests==2.23.0 \ No newline at end of file diff --git a/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/version.txt b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/version.txt new file mode 100644 index 0000000..afaf360 --- /dev/null +++ b/Orchestration Scripts/Resource Scripts/SaveAsAppTemplate/version.txt @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/Orchestration Scripts/Setup Scripts/AppSaveSetup/__main__.py b/Orchestration Scripts/Setup Scripts/AppSaveSetup/__main__.py index 0ee3c72..852e1d7 100644 --- a/Orchestration Scripts/Setup Scripts/AppSaveSetup/__main__.py +++ b/Orchestration Scripts/Setup Scripts/AppSaveSetup/__main__.py @@ -3,7 +3,11 @@ from cloudshell.helpers.save_workflow.save_app_info_orch import save_app_deployment_info +def save_deployment_info(sandbox, components=None): + save_app_deployment_info(sandbox.automation_api, sandbox.id) + + sandbox = Sandbox() DefaultSetupWorkflow().register(sandbox) -sandbox.workflow.add_to_preparation(save_app_deployment_info, None) +sandbox.workflow.add_to_preparation(save_deployment_info, None) sandbox.execute_setup() diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/__init__.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/__init__.py index e69de29..b50dc4a 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/__init__.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/__init__.py @@ -0,0 +1,3 @@ +__author__ = 'quali' +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) \ No newline at end of file diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/build_app_xml.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/build_app_xml.py index 9d7ecb0..95cad19 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/build_app_xml.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/build_app_xml.py @@ -1,5 +1,5 @@ def attribute(name, value, overwrite=False): - xml =""" + xml = """ """ return xml.format(Name=name, Value=value, overwrite='Override="true"' if overwrite else "") @@ -15,8 +15,9 @@ def deployment_path(deploy_path, cloud_provider): """ - return xml.format(DeployAttributes="\n".join([attribute(x, y, True) for x, y in deploy_path['attributes'].iteritems()]), - cp=cloud_provider, dn=deploy_path['name'], dsn=deploy_path['service_name']) + return xml.format( + DeployAttributes="\n".join([attribute(x, y, True) for x, y in deploy_path['attributes'].items()]), + cp=cloud_provider, dn=deploy_path['name'], dsn=deploy_path['service_name']) def deployment_paths(deploy_paths, cloud_provider): @@ -37,10 +38,11 @@ def app_resource(attributes, model, driver): """ - return xml.format(Attributes="\n".join(attribute(x, y, True) for x, y in attributes.iteritems()), model=model, driver=driver) + return xml.format(Attributes="\n".join(attribute(x, y, True) for x, y in attributes.items()), model=model, + driver=driver) -def app_resource_info(app_name, deploy_paths, app_attributes, model, driver, cloud_provider, image_name): +def app_resource_info(app_name: str, deploy_paths, app_attributes, model, driver, cloud_provider, image_name): xml = """ {AppResource} @@ -50,7 +52,8 @@ def app_resource_info(app_name, deploy_paths, app_attributes, model, driver, clo """ - return xml.format(AppName=app_name, img=image_name, AppResource=app_resource(app_attributes, model, driver), DeploymentPath=deployment_paths(deploy_paths, cloud_provider)) + return xml.format(AppName=app_name, img=image_name, AppResource=app_resource(app_attributes, model, driver), + DeploymentPath=deployment_paths(deploy_paths, cloud_provider)) def add_category(category): @@ -72,10 +75,9 @@ def categories_info(categories): def app_template(app_name, deploy_paths, categories, app_attributes, model, driver, cloud_provider, image_name): """ - :return: """ - xml =""" + xml = """ {AppResourceInfo} @@ -86,4 +88,3 @@ def app_template(app_name, deploy_paths, categories, app_attributes, model, driv categories = categories_info(categories) return xml.format(AppResourceInfo=app_resource, Categories=categories if categories else "") - diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/upload_app_xml.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/upload_app_xml.py index 3e7e53c..d1be92f 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/upload_app_xml.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/app_import/upload_app_xml.py @@ -3,12 +3,13 @@ import zipfile import requests import shutil +import base64 -from images import vm_image +from cloudshell.helpers.app_import.images import vm_image -def upload_app_to_cloudshell(cs_api, reservation_id, app_name, app_xml_content, server, user="admin", password="admin", - display_image_result=None, display_image_name='vm.png'): +def upload_app_to_cloudshell(app_name, app_xml_content, server, user="admin", password="admin", + display_image_result="", display_image_name='vm.png'): """ :param CloudShellAPISession cs_api: :param string reservation_id: @@ -46,10 +47,10 @@ def upload_app_to_cloudshell(cs_api, reservation_id, app_name, app_xml_content, os.remove(display_image_file) fh = open(display_image_file, "wb") - if display_image_result is not None: - fh.write(display_image_result.decode('base64')) + if not display_image_result: + fh.write(base64.b64decode(display_image_result)) else: - fh.write(vm_image.decode('base64')) + fh.write(base64.b64decode(vm_image)) fh.close() zip_file = zipfile.ZipFile(blueprint_zip_file, "w") @@ -62,15 +63,22 @@ def upload_app_to_cloudshell(cs_api, reservation_id, app_name, app_xml_content, zip_file.close() zip_content = open(blueprint_zip_file, "rb").read() shutil.rmtree(working_dir) - authentication_code = requests.put("http://{}:9000/Api/Auth/Login".format(server), - {"username": user, "password": password, "domain": "Global"}).content - result = requests.post("http://{}:9000/API/Package/ImportPackage".format(server), - headers={"Authorization": "Basic {}".format(authentication_code[1:-1])}, - files={"QualiPackage": zip_content}) - if 'false' in result.content: - raise Exception('Issue importing App XML into Cloudshell: ' + result.content) - if result.status_code >= 300: - return result.content - else: - return None + server_url = "http://{}:9000/Api/Auth/Login".format(server) + + login_response = requests.put(server_url, + data={"username": user, "password": password, "domain": "Global"}) + if not login_response.ok: + raise Exception(f"Failed login to Quali API trying to import App Package.\n" + f"Status Code: {login_response.status_code}. Reason: {login_response.reason}") + token = login_response.text[1:-1] + upload_response = requests.post("http://{}:9000/API/Package/ImportPackage".format(server), + headers={"Authorization": f"Basic {token}"}, + files={"QualiPackage": zip_content}) + if not upload_response.ok: + raise Exception("Failed upload of app XML into cloudshell.\n" + f"Status Code: {upload_response.status_code}, Reason: {upload_response.reason}") + if 'false' in upload_response.text.lower(): + raise Exception('Issue importing App XML into Cloudshell: ' + upload_response.text) + + return upload_response.text diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/__init__.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/__init__.py index e69de29..b50dc4a 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/__init__.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/__init__.py @@ -0,0 +1,3 @@ +__author__ = 'quali' +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) \ No newline at end of file diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_info_orch.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_info_orch.py index e7fd694..5bf50a8 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_info_orch.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_info_orch.py @@ -1,13 +1,13 @@ import json -from cloudshell.api.cloudshell_api import SandboxDataKeyValue +from cloudshell.api.cloudshell_api import SandboxDataKeyValue, CloudShellAPISession from cloudshell.helpers.save_workflow.deploy_info import DeployInfo -def save_app_deployment_info(sandbox, components=None): - for app in sandbox.automation_api.GetReservationDetails(sandbox.id).ReservationDescription.Apps: +def save_app_deployment_info(api: CloudShellAPISession, sandbox_id: str): + for app in api.GetReservationDetails(sandbox_id).ReservationDescription.Apps: serialized_deployment_info = json.dumps(DeployInfo(app.DeploymentPaths)) key_value = SandboxDataKeyValue(app.Name, serialized_deployment_info) - sandbox.automation_api.SetSandboxData(sandbox.id, [key_value]) + api.SetSandboxData(sandbox_id, [key_value]) diff --git a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_utility.py b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_utility.py index 4b5fc60..1bde7f6 100644 --- a/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_utility.py +++ b/python packages/cloudshell-app-helper-1.0.0/cloudshell/helpers/save_workflow/save_app_utility.py @@ -1,15 +1,23 @@ import os import json import requests +from timeit import default_timer +from cloudshell.api.cloudshell_api import CloudShellAPISession from cloudshell.helpers.app_import.build_app_xml import app_template from cloudshell.helpers.app_import.upload_app_xml import upload_app_to_cloudshell -from cloudshell.api.cloudshell_api import InputNameValue + +# what I currently see in latest AWS and OCI 2G shells +CP_2G_CREATE_IMAGE_COMMAND = "save_app" +AWS_DEPLOY_PARAM_KEY = "AWS AMI Id" class SaveAppUtility: - def __init__(self, sandbox, resource_name, server_address, admin_user, admin_password, display_image_url='', new_app_name='', save_as=False, revertNum=1): - self.sandbox = sandbox + def __init__(self, api: CloudShellAPISession, reservation_id: str, resource_name: str, server_address: str, + admin_user: str, admin_password: str, display_image_url='', new_app_name='', save_as=False, + revertNum=1): + self.api = api + self.reservation_id = reservation_id self.resource_name = resource_name self.revertNum = revertNum self.app_name = '' @@ -18,7 +26,7 @@ def __init__(self, sandbox, resource_name, server_address, admin_user, admin_pas self.api_missing = False - for vm in self.sandbox.automation_api.GetReservationDetails(self.sandbox.id).ReservationDescription.Resources: + for vm in self.api.GetReservationDetails(self.reservation_id).ReservationDescription.Resources: if vm.Name == self.resource_name: self.app_name = vm.AppDetails.AppName try: @@ -53,20 +61,23 @@ def __init__(self, sandbox, resource_name, server_address, admin_user, admin_pas def verify_deploy_info_and_display_image(self): self.get_deployment_info() if self.deploy_info is None: - raise Exception("Could not locate Sandbox information on {}, App must be deployed by Setup script to use this functionality.\n".format(self.resource_name)) + raise Exception( + "Could not locate Sandbox information on {}, App must be deployed by Setup script to use this functionality.\n".format( + self.resource_name)) self.get_display_image() def get_deployment_info(self): - for keyValue in self.sandbox.automation_api.GetSandboxData(self.sandbox.id).SandboxDataKeyValues: + for keyValue in self.api.GetSandboxData(self.reservation_id).SandboxDataKeyValues: if keyValue.Key == self.app_name: self.deploy_info = json.loads(keyValue.Value) break def get_display_image(self): - self.display_image_result = self.sandbox.automation_api.GetReservationAppImage(self.sandbox.id, - self.resource_name).AppTemplateImage + self.display_image_result = self.api.GetReservationAppImage(self.reservation_id, + self.resource_name).AppTemplateImage + # TODO: have option to override this always with display image if self.display_image_result == '': try: if self.display_image_url != '': @@ -80,39 +91,53 @@ def get_display_image(self): self.display_image_name = 'vm.png' def save_app_info(self, delete): - command = [x.Name for x in self.sandbox.automation_api.GetResourceConnectedCommands(self.resource_name).Commands - if x.Name == 'create_app_image'] + command_search = [x.Name for x in self.api.GetResourceConnectedCommands(self.resource_name).Commands + if x.Name == CP_2G_CREATE_IMAGE_COMMAND] - if len(command) == 1: - if delete: - inputs = ['True', self.new_app_name, str(self.revertNum)] - else: - inputs = ['False', self.new_app_name, str(self.revertNum)] - self.saved_app_info = json.loads(self.sandbox.automation_api.ExecuteResourceConnectedCommand(self.sandbox.id, - self.resource_name, - 'create_app_image', - 'connectivity', - inputs).Output) + if not command_search: + exc_msg = (f"Operation not supported by Cloud Provider\n" + f"Command f{CP_2G_CREATE_IMAGE_COMMAND} not found on resource {self.resource_name}") + raise Exception(exc_msg) + + if delete: + inputs = ['True', self.new_app_name, str(self.revertNum)] else: - raise Exception("Operation not supported by Cloud Provider\n") + inputs = ['False', self.new_app_name, str(self.revertNum)] + + save_msg = f"Saving new AMI on AWS for app '{self.resource_name}'. This may take a few minutes..." + self.api.WriteMessageToReservationOutput(self.reservation_id, save_msg) + start_timer = default_timer() + try: + save_response = self.api.ExecuteResourceConnectedCommand(self.reservation_id, + self.resource_name, + CP_2G_CREATE_IMAGE_COMMAND, + 'connectivity').Output + except Exception as e: + exc_msg = f"Issue saving app {self.resource_name}. {type(e).__name__}: {str(e)}" + raise Exception(exc_msg) + total_seconds = default_timer() - start_timer + success_msg = f"Finished saving AMI in {total_seconds:.2f} seconds:\n{save_response}" + self.api.WriteMessageToReservationOutput(self.reservation_id, success_msg) + self.saved_app_info = json.loads(save_response) def revert_app_info(self): - command = [x.Name for x in self.sandbox.automation_api.GetResourceConnectedCommands(self.resource_name).Commands + command = [x.Name for x in self.api.GetResourceConnectedCommands(self.resource_name).Commands if x.Name == 'revert_app_image'] inputs = [self.new_app_name] if len(command) == 1: - self.saved_app_info = json.loads(self.sandbox.automation_api.ExecuteResourceConnectedCommand(self.sandbox.id, - self.resource_name, - 'revert_app_image', - 'connectivity', - inputs).Output) + self.saved_app_info = json.loads(self.api.ExecuteResourceConnectedCommand(self.reservation_id, + self.resource_name, + 'revert_app_image', + 'connectivity', + inputs).Output) else: raise Exception("Operation not supported by Cloud Provider\n") def create_app_xml(self): - resource = self.sandbox.automation_api.GetResourceDetails(self.resource_name) + self.api.WriteMessageToReservationOutput(self.reservation_id, "Creating new app template...") + resource = self.api.GetResourceDetails(self.resource_name) app_attributes = dict() for attr in resource.ResourceAttributes: @@ -120,37 +145,43 @@ def create_app_xml(self): app_categories = ['Applications'] - if self.saved_app_info is not None: + if self.saved_app_info: for deploy_path in self.deploy_info['deploypaths']: - if deploy_path['is_default']: - for key, value in self.saved_app_info.iteritems(): - # patch for AWS - if 'AWS' in key: - deploy_path['attributes']['AWS AMI Id'] = value + if not deploy_path['is_default']: + continue + service_name = deploy_path["service_name"] + for key, value in self.saved_app_info.items(): + # patch for AWS + if "AWS" in key: + if "2G" in service_name: + deploy_path["attributes"][f"{service_name}.{AWS_DEPLOY_PARAM_KEY}"] = value else: - deploy_path['attributes'][key] = value + deploy_path['attributes'][AWS_DEPLOY_PARAM_KEY] = value + else: + deploy_path['attributes'][key] = value self.app_xml = app_template(self.new_app_name, self.deploy_info['deploypaths'], app_categories, app_attributes, resource.ResourceModelName, resource.DriverName, resource.VmDetails.CloudProviderFullName, self.display_image_name) def upload_app(self): - result = upload_app_to_cloudshell(self.sandbox.automation_api, self.sandbox.id, self.new_app_name, self.app_xml, - self.server_address, self.admin_user, self.admin_password, self.display_image_result, self.display_image_name) - if result is None: - self.sandbox.automation_api.WriteMessageToReservationOutput(self.sandbox.id, - "App '{}' has been updated from instance '{}'\n".format(self.new_app_name, self.resource_name)) - else: - raise Exception("Error uploading App to CloudShell\n{}".format(result)) + self.api.WriteMessageToReservationOutput(self.reservation_id, "Uploading app template to Cloudshell...") + result = upload_app_to_cloudshell(self.new_app_name, self.app_xml, + self.server_address, self.admin_user, self.admin_password, + self.display_image_result, self.display_image_name) + success_msg = (f"App '{self.new_app_name}' has been updated from instance '{self.resource_name}'\n" + f"Upload Response: {result}") + self.api.WriteMessageToReservationOutput(self.reservation_id, success_msg) def save_flow(self, delete=False): if not self.api_missing: self.verify_deploy_info_and_display_image() - self.save_app_info(delete) + self.save_app_info(delete) # what is delete for? self.create_app_xml() self.upload_app() if delete: - self.sandbox.automation_api.RefreshAppInBlueprints(self.AppTemplateName) + self.api.RefreshAppInBlueprints(self.AppTemplateName) + return self.saved_app_info def save_flow_just_app(self, update=False): if not self.api_missing: @@ -158,7 +189,7 @@ def save_flow_just_app(self, update=False): self.create_app_xml() self.upload_app() if update: - self.sandbox.automation_api.RefreshAppInBlueprints(self.AppTemplateName) + self.api.RefreshAppInBlueprints(self.AppTemplateName) def revert_flow(self): if not self.api_missing: @@ -166,4 +197,4 @@ def revert_flow(self): self.revert_app_info() self.create_app_xml() self.upload_app() - self.sandbox.automation_api.RefreshAppInBlueprints(self.AppTemplateName) + self.api.RefreshAppInBlueprints(self.AppTemplateName) diff --git a/python packages/cloudshell-app-helper-1.0.0/docs/aws_2g_save_app_response_sample.json b/python packages/cloudshell-app-helper-1.0.0/docs/aws_2g_save_app_response_sample.json new file mode 100644 index 0000000..ef13b69 --- /dev/null +++ b/python packages/cloudshell-app-helper-1.0.0/docs/aws_2g_save_app_response_sample.json @@ -0,0 +1 @@ +{"AWS EC2 Instance.AWS AMI Id": "ami-0141a62ec33a8159d"} \ No newline at end of file diff --git a/python packages/cloudshell-app-helper-1.0.0/docs/sandbox_data_deploy_path_sample.txt b/python packages/cloudshell-app-helper-1.0.0/docs/sandbox_data_deploy_path_sample.txt new file mode 100644 index 0000000..f43983b --- /dev/null +++ b/python packages/cloudshell-app-helper-1.0.0/docs/sandbox_data_deploy_path_sample.txt @@ -0,0 +1,35 @@ +app deployment data saved to sandbox as "app name", NOT the deployed app resource name, and the deploypaths list json + +sb_data_key: CentOS_no_config_2G_Test +sb_data_value: +{ + "deploypaths": [ + { + "name": "AWS US-West-2 - AWS EC2 Instance", + "is_default": true, + "service_name": "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G", + "attributes": { + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.AWS AMI Id": "ami-0c9ff37f7a65a36a2", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Allow all Sandbox Traffic": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Instance Type": "t2.large", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.IAM Role Name": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Inbound Ports": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Public IP Options": "No Public IP", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage Size": "0", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage IOPS": "0", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage Type": "auto", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Root Volume Name": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Autoload": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for IP": "False", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for Status Check": "False", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for Credentials": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Custom Tags": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.User Data URL": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.User Data Parameters": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Private IP": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Enable Source Dest Check": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Status Check Timeout": "0" + } + } + ] +} \ No newline at end of file diff --git a/python packages/cloudshell-app-helper-1.0.0/docs/saved_deployment_path_sample.json b/python packages/cloudshell-app-helper-1.0.0/docs/saved_deployment_path_sample.json new file mode 100644 index 0000000..cc1f769 --- /dev/null +++ b/python packages/cloudshell-app-helper-1.0.0/docs/saved_deployment_path_sample.json @@ -0,0 +1,31 @@ +{ + "deploypaths": [ + { + "name": "AWS US-West-2 - AWS EC2 Instance", + "is_default": true, + "service_name": "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G", + "attributes": { + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.AWS AMI Id": "ami-0c9ff37f7a65a36a2", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Allow all Sandbox Traffic": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Instance Type": "t2.large", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.IAM Role Name": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Inbound Ports": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Public IP Options": "No Public IP", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage Size": "0", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage IOPS": "0", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Storage Type": "auto", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Root Volume Name": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Autoload": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for IP": "False", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for Status Check": "False", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Wait for Credentials": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Custom Tags": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.User Data URL": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.User Data Parameters": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Private IP": "", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Enable Source Dest Check": "True", + "Amazon AWS Cloud Provider 2G.Amazon AWS EC2 Instance 2G.Status Check Timeout": "0" + } + } + ] +} \ No newline at end of file diff --git a/python packages/cloudshell-app-helper-1.0.0/requirements.txt b/python packages/cloudshell-app-helper-1.0.0/requirements.txt index 64dfb3a..5bb69a2 100644 --- a/python packages/cloudshell-app-helper-1.0.0/requirements.txt +++ b/python packages/cloudshell-app-helper-1.0.0/requirements.txt @@ -1,3 +1,2 @@ -cloudshell-orch-core>=3.3.0.0,<3.4.0.0 cloudshell-automation-api>=2020.2.0.0 -requests==2.23.0 \ No newline at end of file +requests diff --git a/python packages/cloudshell-app-helper-1.0.0/version.txt b/python packages/cloudshell-app-helper-1.0.0/version.txt index 703cec9..10510f7 100644 --- a/python packages/cloudshell-app-helper-1.0.0/version.txt +++ b/python packages/cloudshell-app-helper-1.0.0/version.txt @@ -1 +1 @@ -2.0.6 \ No newline at end of file +2.0.7.1 \ No newline at end of file