Skip to content

Commit

Permalink
Added error handling for delete CI
Browse files Browse the repository at this point in the history
  • Loading branch information
jdewinne committed Jun 15, 2017
1 parent 7277707 commit 98c44e9
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 25 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ deploy:
provider: releases
api_key:
secure: aoVXZyLOBmB4Q2lLKLaqEN8zcqN3K3/3agRBA1znM1PLeqXSE3CwQe6sHkX6BrfMoDDtjqeepDMgJ9TsqJFq+lPY+HuVFzOqGlrWlIZHBUKI3hmfjgM/61CkdK2eBO42Ym4tqCQ4L1Tp42fcrB6M/a/0TGI5ENW2bJk8+ofRT8M=
file: build/libs/xlr-xldeploy-plugin-3.0.0.jar
file: build/libs/xlr-xldeploy-plugin-3.1.0.jar
skip_cleanup: true
on:
all_branches: true
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ returned package ID
 `<os>WINDOWS</os><connectionType>WINRM_NATIVE</connectionType><address>${address}</address><credential ref="Configuration/MyCredential"/>`
* `addToEnvironment` - Switch to decide if to add the CI to an environment
* `envID` - Environment to add the CI to.

+ Delete CI
* `server` - Server to query
* `username` - Override username
* `password` - Override password
* `ciID` - ID of the Configuration Item you want to delete
* `envID` - If provided, will remove the CI from an Environment first
* `throwOnFail` - Boolean - If True, the Task will fail if the Deletion does not succeed.

+ Delete Infrastructure - This task will delete the specified Infrastructure CI, AND will also undeploy any deployed applications on the infrastrucutre as well as remove the infrastructure from any environments where it is referenced as a container.
* `server` - Server to query
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ plugins {
id "com.xebialabs.xl.docker" version "1.1.0"
}

version = "3.0.0"
version = "3.1.0"

apply plugin: 'java'
apply plugin: 'idea'
Expand Down
23 changes: 16 additions & 7 deletions src/main/resources/synthetic.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
-->
<synthetic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xebialabs.com/deployit/synthetic synthetic.xsd" xmlns="http://www.xebialabs.com/deployit/synthetic">
xsi:schemaLocation="http://www.xebialabs.com/deployit/synthetic synthetic.xsd"
xmlns="http://www.xebialabs.com/deployit/synthetic">

<type type="xldeploy.Task" extends="xlrelease.PythonScript" virtual="true">
<property name="iconLocation" default="xlr_xldeploy/xldeploy-icon-black-small.png" hidden="true"/>
<property name="taskColor" hidden="true" default="#68B749"/>

<property name="xldeployServer" category="input" label="Server" referenced-type="xldeploy.XLDeployServer" kind="ci"/>
<property name="xldeployServer" category="input" label="Server" referenced-type="xldeploy.XLDeployServer"
kind="ci"/>
<property name="username" category="input" required="false"/>
<property name="password" password="true" category="input" required="false"/>
</type>
Expand Down Expand Up @@ -102,7 +104,8 @@
description="If marked true and a package with the same ID already exists on the destination server, this will overwrite it. If false, it will throw an error."/>
</type>

<type type="xldeploy.ImportTask" label="XL Deploy: Import package" extends="xldeploy.Task" description="Imports a package from a remote URL">
<type type="xldeploy.ImportTask" label="XL Deploy: Import package" extends="xldeploy.Task"
description="Imports a package from a remote URL">
<property name="scriptLocation" default="xlr_xldeploy/importTask.py" hidden="true"/>
<property name="repositoryUrl" category="input" label="Repository URL" required="true"/>
<property name="repositoryUsername" category="input" label="Repository username" required="false"/>
Expand Down Expand Up @@ -132,7 +135,8 @@
<property name="packageIds" category="output" kind="list_of_string" label="Package IDs"/>
</type>

<type type="xldeploy.GetLastVersionDeployedTask" label="XL Deploy: Get last deployed version" extends="xldeploy.Task"
<type type="xldeploy.GetLastVersionDeployedTask" label="XL Deploy: Get last deployed version"
extends="xldeploy.Task"
description="Finds the latest version of the Package deployed in XL Deploy">
<property name="scriptLocation" default="xlr_xldeploy/getLatestDeployedTask.py" hidden="true"/>
<property name="environmentId" category="input" label="Environment ID" required="true"/>
Expand All @@ -141,7 +145,8 @@
<property name="applicationId" category="output" label="Application ID"/>
</type>

<type type="xldeploy.DoesCIExist" extends="xldeploy.Task" label="XL Deploy: Does CI exist" description="Checks if a CI exists">
<type type="xldeploy.DoesCIExist" extends="xldeploy.Task" label="XL Deploy: Does CI exist"
description="Checks if a CI exists">
<property name="scriptLocation" default="xlr_xldeploy/doesCIExistTask.py" hidden="true"/>

<property name="ciID" category="input" label="CI ID" required="true"/>
Expand Down Expand Up @@ -171,7 +176,10 @@
description="Deletes a CI after optionally removing it from an environment">
<property name="scriptLocation" default="xlr_xldeploy/deleteCITask.py" hidden="true"/>
<property name="ciID" category="input" label="CI ID" required="true"/>
<property name="envID" category="input" label="Env ID"/>
<property name="envID" category="input" label="Env ID" required="false"/>
<property name="throwOnFail" category="input" kind="boolean" label="Throw on Fail"
description="If True, the Task will fail if the CI doesn't get deleted or if one of the provided CIs does not exist."
default="false"/>
</type>

<type type="xldeploy.DeleteInfrastructure" extends="xldeploy.Task" label="XL Deploy: Delete Infrastructure"
Expand Down Expand Up @@ -238,7 +246,8 @@
<property name="embedded" kind="boolean" hidden="true" default="true"
required="false"/> <!-- XLR 7.0.0 compatibility -->

<property name="xldeployServer" category="input" label="Server" referenced-type="xldeploy.XLDeployServer" kind="ci"/>
<property name="xldeployServer" category="input" label="Server" referenced-type="xldeploy.XLDeployServer"
kind="ci"/>
<property name="username" category="input" required="false"/>
<property name="password" password="true" category="input" required="false"/>
<property name="environment" category="input"
Expand Down
40 changes: 27 additions & 13 deletions src/main/resources/xlr_xldeploy/XLDeployClient.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,9 @@ def get_parameter_names(self, parameter_type_id):
def prepare_control_task(self, control_task_name, target_ci_id, parameters=None):
prepare_control_task_url = "/deployit/control/prepare/%s/%s" % (control_task_name, target_ci_id)
prepare_response = self.http_request.get(prepare_control_task_url, contentType='application/xml')
check_response(prepare_response, "Failed to prepare control task [%s]. Server return [%s], with content [%s]" % (
target_ci_id, prepare_response.status, prepare_response.response))
check_response(prepare_response,
"Failed to prepare control task [%s]. Server return [%s], with content [%s]" % (
target_ci_id, prepare_response.status, prepare_response.response))
control_obj = prepare_response.getResponse()
root = ET.fromstring(control_obj)
parameter_type_id = get_parameter_type_name(root)
Expand Down Expand Up @@ -198,8 +199,10 @@ def deployment_prepare_undeploy(self, deployed_application_id, orchestrators=Non
deployment_prepare_undeploy_url = "/deployit/deployment/prepare/undeploy?deployedApplication=%s" % deployed_application_id
deployment_prepare_undeploy_url_response = self.http_request.get(deployment_prepare_undeploy_url,
contentType='application/xml')
check_response(deployment_prepare_undeploy_url_response, "Failed to prepare undeploy. Server return [%s], with content [%s]" % (
deployment_prepare_undeploy_url_response.status, deployment_prepare_undeploy_url_response.response))
check_response(deployment_prepare_undeploy_url_response,
"Failed to prepare undeploy. Server return [%s], with content [%s]" % (
deployment_prepare_undeploy_url_response.status,
deployment_prepare_undeploy_url_response.response))
undeployment_xml = deployment_prepare_undeploy_url_response.getResponse()
undeployment_xml = add_orchestrators(undeployment_xml, orchestrators)
undeployment_xml = set_deployed_application_properties(undeployment_xml, deployed_application_properties)
Expand All @@ -210,26 +213,30 @@ def deployment_prepare_update(self, deployment_package, environment):
deployment_package, "%s/%s" % (environment, deployment_package.rsplit('/', 2)[1]))
deployment_prepare_update_response = self.http_request.get(deployment_prepare_update_url,
contentType='application/xml')
check_response(deployment_prepare_update_response, "Failed to prepare update deploy. Server return [%s], with content [%s]" % (
deployment_prepare_update_response.status, deployment_prepare_update_response.response))
check_response(deployment_prepare_update_response,
"Failed to prepare update deploy. Server return [%s], with content [%s]" % (
deployment_prepare_update_response.status, deployment_prepare_update_response.response))
return deployment_prepare_update_response.getResponse()

def deployment_prepare_initial(self, deployment_package, environment):
deployment_prepare_initial_url = "/deployit/deployment/prepare/initial?version=%s&environment=%s" % (
deployment_package, environment)
deployment_prepare_initial_response = self.http_request.get(deployment_prepare_initial_url,
contentType='application/xml')
check_response(deployment_prepare_initial_response, "Failed to prepare initial deploy. Server return [%s], with content [%s]" % (
deployment_prepare_initial_response.status, deployment_prepare_initial_response.response))
check_response(deployment_prepare_initial_response,
"Failed to prepare initial deploy. Server return [%s], with content [%s]" % (
deployment_prepare_initial_response.status, deployment_prepare_initial_response.response))
return deployment_prepare_initial_response.getResponse()

def deployment_prepare_deployeds(self, deployment, orchestrators=None, deployed_application_properties=None,
overrideDeployedProps=None, deployed_properties=None):
deployment_prepare_deployeds = "/deployit/deployment/prepare/deployeds"
deployment_prepare_deployeds_response = self.http_request.post(deployment_prepare_deployeds, deployment,
contentType='application/xml')
check_response(deployment_prepare_deployeds_response, "Failed to prepare deployeds. Server return [%s], with content [%s]" % (
deployment_prepare_deployeds_response.status, deployment_prepare_deployeds_response.response))
check_response(deployment_prepare_deployeds_response,
"Failed to prepare deployeds. Server return [%s], with content [%s]" % (
deployment_prepare_deployeds_response.status,
deployment_prepare_deployeds_response.response))
deployment_xml = deployment_prepare_deployeds_response.getResponse()
deployment_xml = add_orchestrators(deployment_xml, orchestrators)
deployment_xml = set_deployed_application_properties(deployment_xml, deployed_application_properties)
Expand Down Expand Up @@ -314,13 +321,17 @@ def get_latest_deployed_version(self, environment_id, application_name):
latest_package = item.attrib['ref']
return latest_package

def check_ci_exist(self, ci_id):
def check_ci_exist(self, ci_id, throw_on_fail=False):
query_task = "/deployit/repository/exists/%s" % ci_id
headers = {'Accept': 'application/json', 'Content-Type': 'application/json'}
query_task_response = self.http_request.get(query_task, headers=headers)
check_response(query_task_response, "Failed to check ci [%s]. Server return [%s], with content [%s]" % (
ci_id, query_task_response.status, query_task_response.response))
return query_task_response.getResponse().find('true') > 0
if query_task_response.getResponse().find('true') > 0:
return True
if throw_on_fail:
raise Exception("CI with id [%s] does not exist." % ci_id)
return False

def create_directory(self, ci_id):
self.create_ci(ci_id, 'core.Directory')
Expand Down Expand Up @@ -394,7 +405,10 @@ def update_ci(self, ci_id, data, content_type):

def delete_ci(self, ci_id):
delete_task = '/deployit/repository/ci/' + ci_id
self.http_request.delete(delete_task)
headers = {'Accept': 'application/json', 'Content-Type': 'application/json'}
response = self.http_request.delete(delete_task, headers=headers)
check_response(response, "Failed to delete ci with id [%s]. Server return [%s], with content [%s]" % (
ci_id, response.status, response.response))

def get_ci_tree(self, ci_id):
infrastructure_list = [ci_id]
Expand Down
7 changes: 4 additions & 3 deletions src/main/resources/xlr_xldeploy/deleteCITask.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@

from xlr_xldeploy.XLDeployClientUtil import XLDeployClientUtil

xldClient = XLDeployClientUtil.create_xldeploy_client(xldeployServer, username, password)
xld_client = XLDeployClientUtil.create_xldeploy_client(xldeployServer, username, password)

xld_client.check_ci_exist(ciID, throwOnFail)
if envID:
xldClient.remove_ci_from_environment(envID,ciID)
xld_client.remove_ci_from_environment(envID, ciID)

xldClient.delete_ci(ciID)
xld_client.delete_ci(ciID)

0 comments on commit 98c44e9

Please sign in to comment.