def execute_script(server):
    print "Running script [%s] on server instance [%s]" % (scriptToExecute, server.getProperty("serverName"))
    sshOpts = SshConnectionOptions(server.getProperty("address"), server.getProperty("username"), password=server.getProperty("password"))
    host = OverthereHost(sshOpts)
    session = OverthereHostSession(host)
    response = session.execute([scriptToExecute], check_success=False)
    if response.rc != 0:
        print "Failed to execute command"
        print response.stderr
    else:
        print "Response", str(response.stdout)

    session.close_conn()
示例#2
0
class ConfigFsServer(object):
    def __init__(self, server, username=None, password=None):
        self.sshOpts = SshConnectionOptions(server['host'], username=server['username'],password=server['password'])
        self.host = OverthereHost(self.sshOpts)
        self.session = OverthereHostSession(self.host)
 

    def __del__(self):
        self.session.close_conn() 


    @staticmethod
    def createServer(server, username=None, password=None):
        return ConfigFsServer(server, username, password)

    def get_file_contents(self, file_path):
        response = self.session.read_file(file_path)
        return response
def server_diff(hostA, hostB, source_file, remote_path):
    global OverthereHostSession
    global OperatingSystemFamily
    global LocalConnectionOptions
    global ObertherHostSession
    global StringUtils
    global Diff

    #context.logOutput(remote_path)
    localOpts = LocalConnectionOptions(os=OperatingSystemFamily.UNIX)
    local_session =  OverthereHostSession(OverthereHost(localOpts))
    sessionA = OverthereHostSession(hostA)
    sessionB = OverthereHostSession(hostB)
    try:
        d1 = sessionA.remote_file(remote_path)
        local_d1 = local_session.work_dir_file("hostA")
        local_session.copy_to(d1, local_d1)
        myFile = "%s" % (local_d1)
        local_f1 = myFile.split(':')[1]

        d2  = sessionB.remote_file(remote_path)
        local_d2 = local_session.work_dir_file("hostB")
        local_session.copy_to(d2, local_d2)
        myFile = "%s" % (local_d2)
        local_f2 = myFile.split(':')[1]

        response = local_session.execute("diff %s %s" % (local_f1, local_f2), check_success=False)
    finally:
        sessionA.close_conn()
        sessionB.close_conn()
        local_session.close_conn()
    # End try
    return response.stdout
示例#4
0
class DarBuildServer(object):
    def __init__(self, server):
        self.sshOpts = SshConnectionOptions(server['host'], username=server['username'],password=server['password'])
        self.host = OverthereHost(self.sshOpts)
        self.session = OverthereHostSession(self.host)
        self.zipBinary = server['pathToZipExecutable']
        self.workingDirectory = server['workingDirectory']
        self.create_directory(self.workingDirectory)
        workDir = self.session.remote_file(self.workingDirectory)
        self.session.get_conn().setWorkingDirectory(workDir)

    def __del__(self):
        self.destroy_work_directory()
        self.session.close_conn() 


    @staticmethod
  
    def createServer(server): 
        return DarBuildServer(server)
    #    
  
    def init_dar(self, appName, appVersion):
        workspace_root = self.create_dar_directory(appName, appVersion) 
        manifest_filename = "%s/deployit-manifest.xml" % workspace_root
        self.write_dar_manifest(appName, appVersion, workspace_root) 

    def import_ear(self, appName, appVersion, deployable, url):   
        self.download_file_into_dar(appName, appVersion,deployable, str(url)) 
  
    def create_dar_directory(self, appName, appVersion):
        dirName = "%s/%s" % (appVersion, appName)

        # check if the directory exists .. if it does we should go do something else.
        # might want to do a better locking mechanism
        if self.dir_exists(dirName): 
          print "unable to create dar directory: %s/%s/%s" % (self.workingDirectory, appVersion, appName)  
          raise Exception('unable to create Dar Package Directory')
        else: 
          self.create_directory(dirName)

        return dirName

        
    def download_file_into_dar(self, appName, appVersion, deployable, url):
        #filename = url.split('/')[-1]
        filename = os.path.basename(url)
        outfile = "%s/%s/%s/%s" % (appVersion, appName,deployable, filename) 
        dirName =  "%s/%s/%s" % (appVersion, appName,deployable)
        if self.dir_exists(dirName): 
          print "output dir already exists: %s" % (dirName)
        else: 
          self.create_directory(dirName)

        self.execute_command("/usr/bin/curl -L -o %s %s" % (outfile, url))

    def read_manifest(self, appName, appVersion):
        file_name = "%s/%s/%s/deployit-manifest.xml" % (self.workingDirectory, appVersion, appName)
        return self.session.read_file(file_name, encoding="UTF-8")

    
    def write_manifest(self, appName, appVersion, content):
        file_name = "%s/%s/deployit-manifest.xml" % (appVersion, appName)
        self.write_to_file(file_name, content) 
         
    def create_directory(self, dirName):
        self.execute_command("/bin/mkdir -p %s" % (dirName)) 
	 
    def create_file(self, fileName, content=None):
        if content:
         self.write_to_file(fileName, str(content))
        else:
         self.execute_command("/bin/touch %s" % (fileName)) 
 

    def write_to_file(self, fileName, content):
        remoteFile = self.session.remote_file("%s/%s" % (self.workingDirectory, fileName)) 
        self.session.copy_text_to_file(str(content), remoteFile)
          
    def dir_exists(self, dirName): 
        print dirName
        command = "[ -d %s ]" % (dirName)
        response = self.session.execute(command, check_success=False, suppress_streaming_output=False)
        
        if response.rc == 0 :
          return True
        else: 
          return False


    def execute_command(self, command):
        print "executing command: %s " % (command)
        response = self.session.execute(command, check_success=False, suppress_streaming_output=False)


        if response.rc != 0:
          print response.stderr
          print "unable to execute command %s" % (command)
          raise Exception('unable to execute command ')
        else:
          print "Response:", str(response.stdout)

       # self.switch_working_directory()
        return response

    
    def write_dar_manifest(self, appName, appVersion, workspace_root):
       filename = "./%s/deployit-manifest.xml" % (workspace_root)
       file_content = self.basic_dar_manifest_template().substitute(appVersion=appVersion, appName=appName)
       self.create_file(filename, file_content)      

    def basic_dar_manifest_template(self):
       xml_template  = '<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n'
       xml_template += ' <udm.DeploymentPackage version=\"$appVersion\" application=\"$appName\"> \n'
       xml_template += '   <orchestrator /> \n'
       xml_template += '   <deployables/> \n' 
       xml_template += ' </udm.DeploymentPackage> \n'
       return Template(xml_template)

    def package_dar(self, appName, appVersion):
        command = "if [ -f %s_%s.dar ] \n"
        command += " then rm -rf %s_%s.dar \n"
        command += "fi \n"
        command += "cd %s/%s \n" % (appVersion, appName)
        command += "/usr/bin/zip -r %s/%s_%s.dar *" % (self.workingDirectory, appName, appVersion.replace('.','_'))
        self.execute_multiline_command(command)

    def write_exec_script(self, commands, script):
        self.session.upload_text_content_to_work_dir(self, commands, script, executable=False)

    def execute_multiline_command(self, command):

        tmp_filename = self.filename_generator()
        self.write_to_file(tmp_filename, command)
        self.execute_command("chmod +x %s" % (tmp_filename))
        self.execute_command("./%s" % (tmp_filename))


    def filename_generator(self, size=9, chars=string.ascii_uppercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    def upload_dar_package(self, appName, appVersion, xldeployServer):
        dar_file_name = "%s_%s.dar" % (appName, appVersion.replace('.','_'))
        command = "/usr/bin/curl -u %s:%s -X POST -H \"content-type:multipart/form-data\" %s/package/upload/%s -F fileData=@./%s " % (xldeployServer['username'], xldeployServer['password'], xldeployServer['url'], dar_file_name, dar_file_name)
        print command
        self.execute_command(command)
class ConfigRTCServer(object):
    def __init__(self, server, dirname="tmp"):
        self.sshOpts = SshConnectionOptions(server['host'], username=server['username'],password=server['password'])
        self.host = OverthereHost(self.sshOpts)
        self.session = OverthereHostSession(self.host)
        self.WorkDirBase = server['filesystemLocation']
        self.WorkDirTimeStamp = int(time.time())
        self.WorkDirName = dirname
        self.workDirectory = None
        self.RtcClient = server['pathToClientSoftware']

    def __del__(self):
        self.destroy_work_directory()
        self.session.close_conn() 


    @staticmethod
  
    def createServer(server, dirname): 
        return ConfigRTCServer(server, dirname)
       
    def get_file_contents(self, file_name):
        response = self.session.read_file("%s/%s" % (self.getWorkDirectory(), file_name))
        return response
    
	 
    def execute_lscm_command(self, command, run_in_workdirectory=False):
        print command
        command = self.sub_placeholders(command)
        print command
        lscm_command="%s %s" % (self.RtcClient, command)

        if run_in_workdirectory is False:
          response = self.execute_command(lscm_command)
        else:
          response = self.execute_command_in_workDirectory(lscm_command)
        return response


    def execute_command(self, command):
        print "executing command: %s " % (command)
        response = self.session.execute(command, check_success=False, suppress_streaming_output=False)
        if response.rc != 0:
          print response.stderr
          print "unable to execute command %s" % (command)
          raise Exception('unable to execute command ')
        else:
          print "Response", str(response.stdout)
          return response
        
    def getWorkDirectory(self):
        if self.workDirectory is None:
          self.execute_command("/bin/mkdir -p %s/%s/%s" % (self.WorkDirBase,self.WorkDirTimeStamp,self.WorkDirName))
          self.workDirectory =  "%s/%s/%s" % (self.WorkDirBase,self.WorkDirTimeStamp,self.WorkDirName)
        return self.workDirectory

    def destroy_work_directory(self):
        if self.workDirectory is not None:
          self.execute_command("/bin/rm -rf %s/%s" % (self.WorkDirBase, self.WorkDirName))
    
    def sub_placeholders(self, input):
        print self.workDirectory
        print self.getWorkDirectory()
	output = input.replace('<work_dir>',  self.getWorkDirectory())
        return output
示例#6
0
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS
# FOR A PARTICULAR PURPOSE. THIS CODE AND INFORMATION ARE NOT SUPPORTED BY XEBIALABS.
#

from overtherepy import LocalConnectionOptions, OverthereHost, OverthereHostSession
from com.xebialabs.overthere import OperatingSystemFamily
import sys
import re

def to_map(stdout):
    data={}
    for s in response.stdout:
        if 'export' in s:
            info = s.replace('export ',' ').replace('"',' ').strip().split('=')
            data[str(info[0])]=str(info[1])
    return data


session = OverthereHostSession(target.container.host)
response = session.execute("docker-machine env %s " % target.machineName)
data=to_map(response.stdout)
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', data['DOCKER_HOST'])
if len(ip) == 1:
    data['address'] = ip[0]
    print "IP Address is %s " % data['address']
print data
session.close_conn()
context.setAttribute(context_key, data)


        new_stack_status = data['Stacks'][0]['StackStatus']
        if new_stack_status == stack_status:
            sys.stdout.write(".")
        else:
            sys.stdout.write("\n")
            sys.stdout.write(new_stack_status)
            stack_status = new_stack_status

        if stack_status == "ROLLBACK_COMPLETE" or stack_status == "UPDATE_ROLLBACK_COMPLETE":
            sys.stdout.write("\n")
            print "KO"
            sys.exit(1)
            break
        else:
            result = "RETRY"
    finally:
        if result == "RETRY":
            inc_context(stack_name)
            cpt = get_value_context(stack_name)
            #print "WAIT....{0}/{1}".format(cpt, attempts)
            if cpt < int(attempts):
                result = "RETRY"
                import time
                time.sleep(5)
            else:
                print "Too many attempts {0}".format(attempts)
                result = int(attempts)

session.close_conn()
class TestOverthereSession(object):

    # preparing to test
    def setUp(self):
        self._linuxhost = OverthereHost(LocalConnectionOptions(os=OperatingSystemFamily.UNIX))
        self._session = OverthereHostSession(self._linuxhost)
        self._session.logger = OverthereSessionLogger(capture=True)

    # ending the test
    def tearDown(self):
        self._session.close_conn()

    def _clear_logs(self):
        self._session.logger.output_lines = []
        self._session.logger.error_lines = []

    def assert_in_list(self, list, expect):
        r = [s for s in list if str(s) == str(expect)]
        eq_(len(r), 1, "expect [%s] to be in list [%s]" % (expect, str(list)))

    def test_not_windows_host(self):
        ok_(not self._session.is_windows())

    def test_work_dir_cleanup(self):
        workdir = self._session.work_dir()
        ok_(workdir.exists())
        workdir_path = workdir.path
        self._session.close_conn()
        ok_(not os.path.exists(workdir_path))

    def test_read_write_file(self):
        f = self._session.upload_text_content_to_work_dir("some text", "my.txt")
        text = self._session.read_file(f.path)
        eq_("some text", text)

    def test_upload_executable_file(self):
        f = self._session.upload_text_content_to_work_dir("#!/bin/sh\necho hello", "my.sh", executable=True)
        r = self._session.execute(f.path)
        self.assert_in_list(r.stdout, "hello")

    def test_upload_classpath_resource(self):
        f = self._session.upload_classpath_resource_to_work_dir("testfiles/singleline.txt")
        text = self._session.read_file(f.path)
        eq_("some text 1", text)

    def test_read_lines(self):
        f = self._session.upload_classpath_resource_to_work_dir("testfiles/multiline.txt")
        lines = self._session.read_file_lines(f.path)
        eq_(3, len(lines))

    def test_execute(self):
        f = self._session.upload_classpath_resource_to_work_dir("testfiles/echo.sh", executable=True)
        response = self._session.execute([f.path, "ping"])
        eq_(response['rc'], 0)
        eq_(response['stdout'][0], "Hi ping")

    def test_execute_automatic_system_exit_on_failure(self):
        success = False
        try:
            f = self._session.upload_classpath_resource_to_work_dir("testfiles/echo.sh", executable=True)
            self._session.execute([f.path, "ping", "1"])
        except SystemExit:
            success = True
            pass
        eq_(success, True)

    def test_execute_check_success_turned_off(self):
        f = self._session.upload_classpath_resource_to_work_dir("testfiles/echo.sh", executable=True)
        response = self._session.execute("%s ping 1" % f.path, check_success=False)
        eq_(response.rc, 1)
        eq_(response['stdout'][0], "Hi ping")
        eq_(response['stdout'][1], "Exiting with 1")

    def test_with_support(self):
        s = OverthereHostSession(self._linuxhost)
        with s:
            work_dir = s.work_dir().path
            eq_(os.path.exists(work_dir), True)

        eq_(os.path.exists(work_dir), False)

    def _local_file(self, resource):
        url = Thread.currentThread().contextClassLoader.getResource(resource)
        return self._session.local_file(File(url.toURI()))


    def test_mkdirs_on_dir_copy(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        eq_(os.path.exists(target.path), False)
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)
        eq_(os.path.exists(target.path + "/echo.sh"), True)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        eq_(log_info[0], "Creating path %s" % target.path)
        eq_(log_info[1], "Copying %s to %s" % (source.path, target.path))

    def test_mkdirs_on_file_copy(self):
        target = self._session.work_dir_file("some/path/some.txt")
        source = self._local_file("testfiles/echo.sh")
        eq_(os.path.exists(target.path), False)
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        eq_(log_info[0], "Creating path %s" % target.parentFile.path)
        eq_(log_info[1], "Copying %s to %s" % (source.path, target.path))

    def test_mkdirs_on_turned_off_on_copy(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        success = False
        try:
            self._session.copy_to(source, target, mkdirs=False)
        except:
            success = True
        eq_(success, True)

    def test_delete_from_when_target_does_not_exit(self):
        target = self._session.work_dir_file("some/path")
        source = None
        self._session.delete_from(source, target)
        log_info = self._session.logger.output_lines
        eq_(len(log_info), 1)
        eq_(log_info[0], "Target [%s] does not exist. No deletion to be performed" % target.path)

    def test_delete_from_file_target(self):
        target = self._session.work_dir_file("some/path/test.txt")
        self._session.copy_text_to_file("xxx", target)
        eq_(os.path.exists(target.path), True)

        source = None
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), False)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        self.assert_in_list(log_info, "Deleting [%s]" % target.path)

    def test_delete_from_folder_target(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)

        self._clear_logs()
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), False)
        log_info = self._session.logger.output_lines

        eq_(len(log_info), 5)
        self.assert_in_list(log_info, "Recursively deleting directory [%s/asubdir]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/echo.sh]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/multiline.txt]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/singleline.txt]" % target.path)
        self.assert_in_list(log_info, "Deleting directory [%s]" % target.path)

    def test_delete_from_with_external_resources(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)
        external_resource = self._session.work_dir_file("some/path/ext.txt")
        self._session.copy_text_to_file("xxx", external_resource)
        eq_(os.path.exists(external_resource.path), True)

        self._clear_logs()
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), True)
        log_info = self._session.logger.output_lines

        eq_(len(log_info), 5)
        self.assert_in_list(log_info, "Recursively deleting directory [%s/asubdir]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/echo.sh]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/multiline.txt]" % target.path)
        self.assert_in_list(log_info, "Deleting file [%s/singleline.txt]" % target.path)
        self.assert_in_list(log_info, "Target directory [%s] is not shared, but still has content from an external source. Will not delete" % target.path)

    def test_copy_diff(self):
        old = self._local_file("directorycompare/old")
        new = self._local_file("directorycompare/new")
        deployed_old = self._session.work_dir_file("olddeployed")
        self._session.copy_to(old, deployed_old)
        eq_(os.path.exists(deployed_old.path), True)
        self._clear_logs()
        diff = Diff.calculate_diff(old, new)
        self._session.copy_diff(deployed_old.path, diff)
        log_info = self._session.logger.output_lines
        eq_(len(log_info), 17)
        self.assert_in_list(log_info, "3 files to be removed.")
        self.assert_in_list(log_info, "3 new files to be copied.")
        self.assert_in_list(log_info, "2 modified files to be copied.")
        self.assert_in_list(log_info, "Start removal of files...")
        self.assert_in_list(log_info, "Removing file %s/removefile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Removing directory %s/subdirremove" % deployed_old.path)
        self.assert_in_list(log_info, "Removing file %s/subdirboth/removefile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Removal of files done.")
        self.assert_in_list(log_info, "Start copying of new files...")
        self.assert_in_list(log_info, "Copying directory %s/subdirnew" % deployed_old.path)
        self.assert_in_list(log_info, "Copying file %s/newfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Copying file %s/subdirboth/newfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Copying of new files done.")
        self.assert_in_list(log_info, "Start copying of modified files...")
        self.assert_in_list(log_info, "Updating file %s/changedfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Updating file %s/subdirboth/changedfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Copying of modified files done.")

    def test_execution_ctx_logging(self):
        class ExecutionContext(object):
            def __init__(self):
                self.output_success = False
                self.error_success = False
            def logOutput(self, msg):
                self.output_success = True
            def logError(self, msg):
                self.error_success = True
        exec_ctx = ExecutionContext()
        session = OverthereHostSession(self._linuxhost, execution_context=exec_ctx)
        session.logger.info("Check")
        eq_(exec_ctx.output_success, True)
        session.logger.error("Check")
        eq_(exec_ctx.error_success, True)
示例#9
0
class TestOverthereSession(object):

    # preparing to test
    def setUp(self):
        self._linuxhost = OverthereHost(
            LocalConnectionOptions(os=OperatingSystemFamily.UNIX))
        self._session = OverthereHostSession(self._linuxhost)
        self._session.logger = OverthereSessionLogger(capture=True)

    # ending the test
    def tearDown(self):
        self._session.close_conn()

    def _clear_logs(self):
        self._session.logger.output_lines = []
        self._session.logger.error_lines = []

    def assert_in_list(self, list, expect):
        r = [s for s in list if str(s) == str(expect)]
        eq_(len(r), 1, "expect [%s] to be in list [%s]" % (expect, str(list)))

    def test_not_windows_host(self):
        ok_(not self._session.is_windows())

    def test_work_dir_cleanup(self):
        workdir = self._session.work_dir()
        ok_(workdir.exists())
        workdir_path = workdir.path
        self._session.close_conn()
        ok_(not os.path.exists(workdir_path))

    def test_read_write_file(self):
        f = self._session.upload_text_content_to_work_dir(
            "some text", "my.txt")
        text = self._session.read_file(f.path)
        eq_("some text", text)

    def test_upload_executable_file(self):
        f = self._session.upload_text_content_to_work_dir(
            "#!/bin/sh\necho hello", "my.sh", executable=True)
        r = self._session.execute(f.path)
        self.assert_in_list(r.stdout, "hello")

    def test_upload_classpath_resource(self):
        f = self._session.upload_classpath_resource_to_work_dir(
            "testfiles/singleline.txt")
        text = self._session.read_file(f.path)
        eq_("some text 1", text)

    def test_read_lines(self):
        f = self._session.upload_classpath_resource_to_work_dir(
            "testfiles/multiline.txt")
        lines = self._session.read_file_lines(f.path)
        eq_(3, len(lines))

    def test_execute(self):
        f = self._session.upload_classpath_resource_to_work_dir(
            "testfiles/echo.sh", executable=True)
        response = self._session.execute([f.path, "ping"])
        eq_(response['rc'], 0)
        eq_(response['stdout'][0], "Hi ping")

    def test_execute_automatic_system_exit_on_failure(self):
        success = False
        try:
            f = self._session.upload_classpath_resource_to_work_dir(
                "testfiles/echo.sh", executable=True)
            self._session.execute([f.path, "ping", "1"])
        except SystemExit:
            success = True
            pass
        eq_(success, True)

    def test_execute_check_success_turned_off(self):
        f = self._session.upload_classpath_resource_to_work_dir(
            "testfiles/echo.sh", executable=True)
        response = self._session.execute("%s ping 1" % f.path,
                                         check_success=False)
        eq_(response.rc, 1)
        eq_(response['stdout'][0], "Hi ping")
        eq_(response['stdout'][1], "Exiting with 1")

    def test_with_support(self):
        s = OverthereHostSession(self._linuxhost)
        with s:
            work_dir = s.work_dir().path
            eq_(os.path.exists(work_dir), True)

        eq_(os.path.exists(work_dir), False)

    def _local_file(self, resource):
        url = Thread.currentThread().contextClassLoader.getResource(resource)
        return self._session.local_file(File(url.toURI()))

    def test_mkdirs_on_dir_copy(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        eq_(os.path.exists(target.path), False)
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)
        eq_(os.path.exists(target.path + "/echo.sh"), True)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        eq_(log_info[0], "Creating path %s" % target.path)
        eq_(log_info[1], "Copying %s to %s" % (source.path, target.path))

    def test_mkdirs_on_file_copy(self):
        target = self._session.work_dir_file("some/path/some.txt")
        source = self._local_file("testfiles/echo.sh")
        eq_(os.path.exists(target.path), False)
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        eq_(log_info[0], "Creating path %s" % target.parentFile.path)
        eq_(log_info[1], "Copying %s to %s" % (source.path, target.path))

    def test_mkdirs_on_turned_off_on_copy(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        success = False
        try:
            self._session.copy_to(source, target, mkdirs=False)
        except:
            success = True
        eq_(success, True)

    def test_delete_from_when_target_does_not_exit(self):
        target = self._session.work_dir_file("some/path")
        source = None
        self._session.delete_from(source, target)
        log_info = self._session.logger.output_lines
        eq_(len(log_info), 1)
        eq_(
            log_info[0],
            "Target [%s] does not exist. No deletion to be performed" %
            target.path)

    def test_delete_from_file_target(self):
        target = self._session.work_dir_file("some/path/test.txt")
        self._session.copy_text_to_file("xxx", target)
        eq_(os.path.exists(target.path), True)

        source = None
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), False)

        log_info = self._session.logger.output_lines
        eq_(len(log_info), 2)
        self.assert_in_list(log_info, "Deleting [%s]" % target.path)

    def test_delete_from_folder_target(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)

        self._clear_logs()
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), False)
        log_info = self._session.logger.output_lines

        eq_(len(log_info), 5)
        self.assert_in_list(
            log_info,
            "Recursively deleting directory [%s/asubdir]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/echo.sh]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/multiline.txt]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/singleline.txt]" % target.path)
        self.assert_in_list(log_info, "Deleting directory [%s]" % target.path)

    def test_delete_from_with_external_resources(self):
        target = self._session.work_dir_file("some/path")
        source = self._local_file("testfiles")
        self._session.copy_to(source, target)
        eq_(os.path.exists(target.path), True)
        external_resource = self._session.work_dir_file("some/path/ext.txt")
        self._session.copy_text_to_file("xxx", external_resource)
        eq_(os.path.exists(external_resource.path), True)

        self._clear_logs()
        self._session.delete_from(source, target)
        eq_(os.path.exists(target.path), True)
        log_info = self._session.logger.output_lines

        eq_(len(log_info), 5)
        self.assert_in_list(
            log_info,
            "Recursively deleting directory [%s/asubdir]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/echo.sh]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/multiline.txt]" % target.path)
        self.assert_in_list(log_info,
                            "Deleting file [%s/singleline.txt]" % target.path)
        self.assert_in_list(
            log_info,
            "Target directory [%s] is not shared, but still has content from an external source. Will not delete"
            % target.path)

    def test_copy_diff(self):
        old = self._local_file("directorycompare/old")
        new = self._local_file("directorycompare/new")
        deployed_old = self._session.work_dir_file("olddeployed")
        self._session.copy_to(old, deployed_old)
        eq_(os.path.exists(deployed_old.path), True)
        self._clear_logs()
        diff = Diff.calculate_diff(old, new)
        self._session.copy_diff(deployed_old.path, diff)
        log_info = self._session.logger.output_lines
        eq_(len(log_info), 17)
        self.assert_in_list(log_info, "3 files to be removed.")
        self.assert_in_list(log_info, "3 new files to be copied.")
        self.assert_in_list(log_info, "2 modified files to be copied.")
        self.assert_in_list(log_info, "Start removal of files...")
        self.assert_in_list(
            log_info, "Removing file %s/removefile.txt" % deployed_old.path)
        self.assert_in_list(
            log_info, "Removing directory %s/subdirremove" % deployed_old.path)
        self.assert_in_list(
            log_info,
            "Removing file %s/subdirboth/removefile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Removal of files done.")
        self.assert_in_list(log_info, "Start copying of new files...")
        self.assert_in_list(
            log_info, "Copying directory %s/subdirnew" % deployed_old.path)
        self.assert_in_list(log_info,
                            "Copying file %s/newfile.txt" % deployed_old.path)
        self.assert_in_list(
            log_info,
            "Copying file %s/subdirboth/newfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Copying of new files done.")
        self.assert_in_list(log_info, "Start copying of modified files...")
        self.assert_in_list(
            log_info, "Updating file %s/changedfile.txt" % deployed_old.path)
        self.assert_in_list(
            log_info,
            "Updating file %s/subdirboth/changedfile.txt" % deployed_old.path)
        self.assert_in_list(log_info, "Copying of modified files done.")

    def test_execution_ctx_logging(self):
        class ExecutionContext(object):
            def __init__(self):
                self.output_success = False
                self.error_success = False

            def logOutput(self, msg):
                self.output_success = True

            def logError(self, msg):
                self.error_success = True

        exec_ctx = ExecutionContext()
        session = OverthereHostSession(self._linuxhost,
                                       execution_context=exec_ctx)
        session.logger.info("Check")
        eq_(exec_ctx.output_success, True)
        session.logger.error("Check")
        eq_(exec_ctx.error_success, True)
class DarBuildServer(object):
    def __init__(self, server):

        self.retryCount = server['retryCount']
        if self.retryCount == 0:
            self.retryCount = 1

        self.retryBaseInterval = 60

        self.sshOpts = SshConnectionOptions(server['host'],
                                            username=server['username'],
                                            privateKeyFile=server['key_file'],
                                            password=server['password'],
                                            port=server['port'])
        self.host = OverthereHost(self.sshOpts)
        self.session = OverthereHostSession(self.host)

        tries = 0

        while tries < self.retryCount:
            tries += 1
            try:
                self.zipBinary = server['pathToZipExecutable']
                self.workingDirectory = server['workingDirectory']
                self.create_directory(self.workingDirectory)
                workDir = self.session.remote_file(self.workingDirectory)
                self.session.get_conn().setWorkingDirectory(workDir)
                break
            except:
                if tries > 3:
                    print sys.exc_info()[0]
                    print sys.exc_info()[1]

                if tries > self.retryCount:
                    print sys.exc_info()[2].format_stack()
                    print "we were unable to setup a connection to server: %s after %i retries" % (
                        server['host'], tries)
                    sys.exit(2)
                sleeptime = self.retryBaseInterval * tries
                print "retrying to setup a connection to server %s in %i seconds" % (
                    server['host'], sleeptime)
                time.sleep(sleeptime)

    def __del__(self):
        self.destroy_work_directory()
        self.session.close_conn()

    def closeConnection(self):
        print "closing ssh connection"
        self.session.close_conn()

    @staticmethod
    def createServer(server):
        return DarBuildServer(server)

    #

    def init_dar(self, appName, appVersion):
        workspace_root = self.create_dar_directory(appName, appVersion)
        manifest_filename = "%s/deployit-manifest.xml" % workspace_root
        self.write_dar_manifest(appName, appVersion, workspace_root)

    def delete_workspace(self, appName, appVersion):
        dirName = "%s/%s" % (appVersion, appName)

        response = self.execute_command("/bin/rm -rf %s" % (dirName))
        response = self.execute_command("/bin/rm -rf %s" % (appVersion))

    def import_ear(self, appName, appVersion, deployable, url):
        self.download_file_into_dar(appName, appVersion, deployable, str(url))

    def create_dar_directory(self, appName, appVersion):
        dirName = "%s/%s" % (appVersion, appName)

        # check if the directory exists .. if it does we should go do something else.
        # might want to do a better locking mechanism
        if self.dir_exists(dirName):
            print "unable to create dar directory: %s/%s/%s" % (
                self.workingDirectory, appVersion, appName)
            raise Exception('unable to create Dar Package Directory')
        else:
            self.create_directory(dirName)

        return dirName

    def download_file_into_dar(self, appName, appVersion, deployable, url):
        #filename = url.split('/')[-1]
        filename = os.path.basename(url)
        outfile = "%s/%s/%s/%s" % (appVersion, appName, deployable, filename)
        dirName = "%s/%s/%s" % (appVersion, appName, deployable)
        if self.dir_exists(dirName):
            print "output dir already exists: %s" % (dirName)
        else:
            self.create_directory(dirName)

        self.execute_command(
            "/usr/bin/curl --retry 5 --retry-delay 2 -k -L -o %s %s" %
            (outfile, url))

    def read_manifest(self, appName, appVersion):
        file_name = "%s/%s/%s/deployit-manifest.xml" % (self.workingDirectory,
                                                        appVersion, appName)
        return self.session.read_file(file_name, encoding="UTF-8")

    def write_manifest(self, appName, appVersion, content):

        file_name = "%s/%s/deployit-manifest.xml" % (appVersion, appName)
        self.write_to_file(file_name, content)

    def create_directory(self, dirName):
        self.execute_command("/bin/mkdir -p %s" % (dirName))

    def create_file(self, fileName, content=None):
        if content:
            self.write_to_file(fileName, str(content))
        else:
            self.execute_command("/bin/touch %s" % (fileName))

    def write_to_file(self, fileName, content):
        remoteFile = self.session.remote_file(
            "%s/%s" % (self.workingDirectory, fileName))
        self.session.copy_text_to_file(str(content), remoteFile)

    def dir_exists(self, dirName):
        command = "[ -d %s ]" % (dirName)
        response = self.session.execute(command,
                                        check_success=False,
                                        suppress_streaming_output=False)

        if response.rc == 0:
            return True
        else:
            return False

    def execute_command(self, command):
        print "executing command: %s " % (command)
        response = self.session.execute(command,
                                        check_success=False,
                                        suppress_streaming_output=False)

        if response.rc != 0:
            print response.stderr
            print response.stdout
            print "unable to execute command %s" % (command)
            raise Exception('unable to execute command ')
        else:
            print "Response:", str(response.stdout)
            print "Errors:", str(response.stderr)

    # self.switch_working_directory()
        return response

    def write_dar_manifest(self, appName, appVersion, workspace_root):
        filename = "./%s/deployit-manifest.xml" % (workspace_root)
        file_content = self.basic_dar_manifest_template().substitute(
            appVersion=appVersion, appName=appName)
        self.create_file(filename, file_content)

    def basic_dar_manifest_template(self):
        xml_template = '<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n'
        xml_template += ' <udm.DeploymentPackage version=\"$appVersion\" application=\"$appName\"> \n'
        xml_template += '   <orchestrator /> \n'
        xml_template += '   <deployables/> \n'
        xml_template += ' </udm.DeploymentPackage> \n'
        return Template(xml_template)

    def package_dar(self, appName, appVersion):
        command = "set -x \n"
        command += "if [ -f %s_%s.dar ] \n"
        command += " then rm -rf %s_%s.dar \n"
        command += "fi \n"
        command += "cd %s/%s \n" % (appVersion, appName)
        command += "/usr/bin/zip -r %s/%s_%s.dar *" % (
            self.workingDirectory, appName.replace(
                '/', '_'), appVersion.replace('.', '_'))
        self.execute_multiline_command(command)

    def remove_dar(self, appName, appVersion):
        command = "set -x \n"
        command += "cd %s \n" % self.workingDirectory
        command += "if [ -f %s_%s.dar ] \n" % (appName.replace(
            '/', '_'), appVersion.replace('.', '_'))
        command += " then rm -rf %s_%s.dar \n" % (appName.replace(
            '/', '_'), appVersion.replace('.', '_'))
        command += " fi \n"
        self.execute_multiline_command(command)

    def write_exec_script(self, commands, script):
        self.session.upload_text_content_to_work_dir(self,
                                                     commands,
                                                     script,
                                                     executable=False)

    def execute_multiline_command(self, command):

        tmp_filename = self.filename_generator()
        self.write_to_file(tmp_filename, command)
        self.execute_command("chmod +x %s" % (tmp_filename))
        self.execute_command("./%s" % (tmp_filename))

    def filename_generator(self,
                           size=9,
                           chars=string.ascii_uppercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    def upload_dar_package(self, appName, appVersion, xldeployServer):
        dar_file_name = "%s_%s.dar" % (appName.replace(
            '/', '_'), appVersion.replace('.', '_'))
        command = "/usr/bin/curl -k -u %s:%s -X POST -H \"content-type:multipart/form-data\" %s/package/upload/%s -F fileData=@./%s " % (
            xldeployServer['username'], xldeployServer['password'],
            xldeployServer['url'], dar_file_name, dar_file_name)
        self.execute_command(command)