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