示例#1
0
 def test_parsing_bad_name(self):
     # test bad name
     try:
         PackageUtil.parseUri('http://foo.com/repo/a?gent-0.1.1.unix.cronus', PackageMgr.packagePath())
         assert False, 'bad name'
     except AgentException:
         pass
示例#2
0
 def test_parsing_bad_extension(self):
     # test bad extension
     try:
         PackageUtil.parseUri('http://foo.com/repo/agent-0.1.1a.cronus2', PackageMgr.packagePath())
         assert False, 'bad extension'
     except AgentException:
         pass
示例#3
0
    def test_parsing_garbage(self):
        # test the url parsing

        try:
            PackageUtil.parseUri('asdfawert892375[jrgjhnjbuy43w5897t^!R$#W_R(@$^(_#$(', PackageMgr.packagePath())
            assert False, 'parse garbage'
        except AgentException:
            pass
示例#4
0
 def test_parsing_bad_extension(self):
     # test bad extension
     try:
         PackageUtil.parseUri('http://foo.com/repo/agent-0.1.1a.cronus2',
                              PackageMgr.packagePath())
         assert False, 'bad extension'
     except AgentException:
         pass
示例#5
0
 def test_parsing_bad_name(self):
     # test bad name
     try:
         PackageUtil.parseUri(
             'http://foo.com/repo/a?gent-0.1.1.unix.cronus',
             PackageMgr.packagePath())
         assert False, 'bad name'
     except AgentException:
         pass
示例#6
0
    def test_parsing_garbage(self):
        # test the url parsing

        try:
            PackageUtil.parseUri(
                'asdfawert892375[jrgjhnjbuy43w5897t^!R$#W_R(@$^(_#$(',
                PackageMgr.packagePath())
            assert False, 'parse garbage'
        except AgentException:
            pass
示例#7
0
    def getPackageDownloadThread(self, packageUri, skipProp=True):
        """
        getPackage(package)
        @params package - URI (e.g. http://repo/repo/package-0.1.4.cronus)
        in case of bittorrent - http://repo/repo/package-0.1.4.cronus.torrent
        get the DownloadThread object for a particular package URI
        If a DownloadThread does not exist, create one
        """

        # try to get create the package
        uriDict = PackageUtil.parseUri(packageUri)

        with self.__inProgressLock:
            # if the package is already in progress, just return that object
            if (uriDict['package'] in self.__inProgressPackages):
                thread = self.__inProgressPackages[uriDict['package']]
                if thread.isAlive():
                    return thread

            # start package download - either it is a new download, or a prev thread errored-out
            appGlobal = pylons.config['pylons.app_globals']
            downloadThread = DownloadThread(appGlobal.threadMgr,
                                            packageUri,
                                            packageloc=None,
                                            skipProp=skipProp)
            downloadThread.start()

            # add to the list
            self.__inProgressPackages[uriDict['package']] = downloadThread

        return downloadThread
示例#8
0
def mockDownloadPkg(pkgUri):
    """ mock download a cronus package """
    pkgDict = PackageUtil.parseUri(pkgUri)
    pkgName = pkgDict['package']
    localPkgRoot = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'packages')
    src = os.path.join(localPkgRoot, pkgName)
    shutil.copy(src, pkgDict['packagePath'])
示例#9
0
    def __init__(self,
                 threadMgr,
                 packageUri,
                 packageloc,
                 path=None,
                 category=None,
                 skipProp=True):
        #        cat = 'DC_DowloadThread' + str(datetime.now())
        AgentThread.__init__(self,
                             threadMgr,
                             cat=category,
                             name='download_thread')
        self.__path = pylons.config['repo_root']
        if path is not None:
            self.__path = path
        # check to see if the package path exists
        if (not os.path.isdir(self.__path)):
            msg = 'Package path(%s) does not exist' % self.__path
            LOG.error(msg)
            raise AgentException(Errors.PACKAGE_PATH_ERROR, msg)

        self.__uriDict = PackageUtil.parseUri(packageUri, self.__path,
                                              packageloc)
        self.__prop = {}
        self.__error = None
        self.__progress = 0.0
        self.__timeouts = None
        self.__skipProp = skipProp
示例#10
0
 def test_parsing_good_url(self):
     # test good url
     uri = 'http://*****:*****@foo.com:8080/repo/agent-0.1.2.unix.cronus?query=blah#foo'
     uriDict = PackageUtil.parseUri(uri, PackageMgr.packagePath())
     assert uriDict['uri'] == uri
     assert uriDict['scheme'] == 'http'
     assert uriDict['uripath'] == '/repo/agent-0.1.2.unix.cronus'
     assert uriDict['package'] == 'agent-0.1.2.unix.cronus'
     assert uriDict['packageNameVersion'] == 'agent-0.1.2.unix'
     assert uriDict['packageName'] == 'agent'
     assert uriDict['packageVersion'] == '0.1.2.unix'
     assert uriDict['packageVersionMajor'] == '0'
     assert uriDict['packageVersionMinor'] == '1'
     assert uriDict['packageVersionBuild'] == '2'
     assert uriDict['packagePlat'] == 'unix'
     assert uriDict['propName'] == 'agent-0.1.2.unix.cronus.prop'
     assert uriDict[
         'propUri'] == 'http://*****:*****@foo.com:8080/repo/agent-0.1.2.unix.cronus.prop?query=blah#foo'
     assert uriDict['packagePath'] == os.path.join(
         PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus')
     assert uriDict['inProgressPackagePath'] == os.path.join(
         PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus.inprogress')
     assert uriDict['propPath'] == os.path.join(
         PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus.prop')
     assert uriDict[
         'torrentUri'] == 'http://*****:*****@foo.com:8080/repo/agent-0.1.2.unix.cronus.torrent?query=blah#foo'
     assert uriDict['torrentPath'] == os.path.join(
         PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus.torrent')
     assert uriDict['torrentName'] == 'agent-0.1.2.unix.cronus.torrent'
示例#11
0
    def getPackageDownloadThread(self, packageUri, skipProp = True):
        """
        getPackage(package)
        @params package - URI (e.g. http://repo/repo/package-0.1.4.cronus)
        in case of bittorrent - http://repo/repo/package-0.1.4.cronus.torrent
        get the DownloadThread object for a particular package URI
        If a DownloadThread does not exist, create one
        """

        # try to get create the package
        uriDict = PackageUtil.parseUri(packageUri)

        with self.__inProgressLock:
            # if the package is already in progress, just return that object
            if (uriDict['package'] in self.__inProgressPackages):
                thread = self.__inProgressPackages[uriDict['package']]
                if thread.isAlive():
                    return thread

            # start package download - either it is a new download, or a prev thread errored-out
            appGlobal = pylons.config['pylons.app_globals']
            downloadThread = DownloadThread(appGlobal.threadMgr, packageUri, packageloc=None, skipProp = skipProp)
            downloadThread.start()

            # add to the list
            self.__inProgressPackages[uriDict['package']] = downloadThread

        return downloadThread
示例#12
0
def createManifest(testController,
                   packages = ['http://github.com/yubin154/cronusagent/blob/master/agent/agent/tests/unit/packages/perlserver-1.0.0.unix.cronus'],
                   manifest = 'bar', service = 'foo', createDirs = True):
    try:
        path = ServiceController.servicePath(service)
        os.makedirs(os.path.join(path, 'manifests'))
        os.makedirs(os.path.join(path, 'modules'))
        os.makedirs(os.path.join(path, '.appdata'))
        os.makedirs(os.path.join(path, '.data'))
        
        path = ServiceController.installedPkgPath(service)
        os.makedirs(path)
    except Exception as excep:
        LOG.warning('got an OS Exception - %s' % str(excep))


    try:
        for pkgUri in packages:
            pkgDict = PackageUtil.parseUri(pkgUri)
            pkgName = pkgDict['package']
            localPkgRoot = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'packages')
            src = os.path.join(localPkgRoot, pkgName)
            shutil.copy(src, pkgDict['packagePath'])
            propPkgName = pkgDict['propName']
            propSrc = os.path.join(localPkgRoot, propPkgName)
            shutil.copy(propSrc, pkgDict['propPath'])
    except Exception as excep:
        LOG.warning('got an OS Exception - %s' % str(excep))
        
    body = json.dumps({'package' : packages})
    response = testController.app.post(url(controller = 'manifest', action = 'post', service = service, manifest = manifest),
                             headers = {'Content-Type' : 'application/json'},
                             params = body)
    assert response.status_int == 200, 'Manifest Post assert'

    LOG.debug('response body = %s' % response.body)

    body = json.loads(response.body)

    # wait until the status is done
    tm = time.time()
    now = tm
    while (tm + 120 > now):
        response = testController.app.get(body['status'])
        body = json.loads(response.body)

        LOG.debug("createManifest  ********** progress = %s" % body['progress'])
        if (int(body['progress']) == 100):
            break
        time.sleep(0.1)
        now = time.time()

    assert tm + 120 >= now, 'Create manifest timed out'
    LOG.debug('status = ' + str(response.status_int))
    assert response.status_int == 200, "HTTP response != 200"
    LOG.debug ('Status response body = %s' % str(body))
    assert int(body['progress']) == 100
示例#13
0
 def _findPackagesToDownload(self, packages, packageRootPath):
     ''' check which packages exist and which need to be downloaded '''
     # figure out which of the packages are already there
     remainingPackages = {}
     for one_package in packages:
         one_package_dict = PackageUtil.parseUri(one_package)
         one_package_path = os.path.join(packageRootPath, one_package_dict['packageName'], one_package_dict['packageVersion'])
         if (not os.path.exists(one_package_path)):
             remainingPackages[one_package] = one_package_dict
     return remainingPackages
示例#14
0
 def _findPackagesToDownload(self, packages, packageRootPath):
     ''' check which packages exist and which need to be downloaded '''
     # figure out which of the packages are already there
     remainingPackages = {}
     for one_package in packages:
         one_package_dict = PackageUtil.parseUri(one_package)
         one_package_path = os.path.join(packageRootPath, one_package_dict['packageName'], one_package_dict['packageVersion'])
         if (not os.path.exists(one_package_path)):
             remainingPackages[one_package] = one_package_dict
     return remainingPackages
示例#15
0
    def __init__(self, threadMgr, packageUri, packageloc, path = None, category = None, skipProp = True):
#        cat = 'DC_DowloadThread' + str(datetime.now())
        AgentThread.__init__(self, threadMgr, cat = category, name = 'download_thread')
        self.__path = pylons.config['repo_root']
        if path is not None:
            self.__path = path
        # check to see if the package path exists
        if (not os.path.isdir(self.__path)):
            msg = 'Package path(%s) does not exist' % self.__path
            LOG.error(msg)
            raise AgentException(Errors.PACKAGE_PATH_ERROR, msg)
        
        self.__uriDict = PackageUtil.parseUri(packageUri, self.__path, packageloc)
        self.__prop = {}
        self.__error = None
        self.__progress = 0.0
        self.__timeouts = None
        self.__skipProp = skipProp
示例#16
0
 def __init__(self, threadMgr, packageUri, packageloc, path = None, category = None, parentId = None):
     AgentThread.__init__(self, threadMgr, cat = category, name = 'download_thread', parentId = parentId)
     
     self._mergeOnFound = True
     self.__path = pylons.config['repo_root']
     if path is not None:
         self.__path = path
     # check to see if the package path exists
     if (not os.path.isdir(self.__path)):
         msg = 'Package path(%s) does not exist' % self.__path
         LOG.error(msg)
         raise AgentException(Errors.PACKAGE_PATH_ERROR, msg)
     
     self.__uriDict = PackageUtil.parseUri(packageUri, self.__path, packageloc)
     self.__prop = {}
     self.__error = None
     self.__progress = 0.0
     self.__timeouts = None
     self.__skipProp = configutil.getConfigAsBool('download_skip_prop')
示例#17
0
 def test_parsing_good_url(self):
     # test good url
     uri = 'http://*****:*****@foo.com:8080/repo/agent-0.1.2.unix.cronus?query=blah#foo'
     uriDict = PackageUtil.parseUri(uri, PackageMgr.packagePath())
     assert uriDict['uri'] == uri
     assert uriDict['scheme'] == 'http'
     assert uriDict['uripath'] == '/repo/agent-0.1.2.unix.cronus'
     assert uriDict['package'] == 'agent-0.1.2.unix.cronus'
     assert uriDict['packageNameVersion'] == 'agent-0.1.2.unix'
     assert uriDict['packageName'] == 'agent'
     assert uriDict['packageVersion'] == '0.1.2.unix'
     assert uriDict['packageVersionMajor'] == '0'
     assert uriDict['packageVersionMinor'] == '1'
     assert uriDict['packageVersionBuild'] == '2'
     assert uriDict['packagePlat'] == 'unix'
     assert uriDict['propName'] == 'agent-0.1.2.unix.cronus.prop'
     assert uriDict['propUri'] == 'http://*****:*****@foo.com:8080/repo/agent-0.1.2.unix.cronus.prop?query=blah#foo'
     assert uriDict['packagePath'] == os.path.join(PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus')
     assert uriDict['inProgressPackagePath'] == os.path.join(PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus.inprogress')
     assert uriDict['propPath'] == os.path.join(PackageMgr.packagePath(), 'agent-0.1.2.unix.cronus.prop')
示例#18
0
    def getPackages(service, manifest):
        """ return the list of packages in the manifest.  The list is just the names not paths in the order specified during manifest creation.
        @param service:    name of the service
        @param manifest:   name of the manifest
        @return: list with names of packages in it.  If none, returns an empty list []
        """
        mfContentPath = ManifestController.manifestContentPath(service, manifest)
        if (os.path.exists(mfContentPath)):
            packages = []
            mfContentFile = file(mfContentPath, 'r')
            for packageUri in mfContentFile:
                pkgObj = PackageUtil.parseUri(packageUri.rstrip())
                packages.append(pkgObj['packageName'])
            return packages
        else:
            #Defaulting to list directory when manifest contents are not found.
            path = ManifestController.manifestPath(service, manifest)
            packages = os.listdir(path)

            return sorted(packages)
示例#19
0
    def getPackages(service, manifest):
        """ return the list of packages in the manifest.  The list is just the names not paths in the order specified during manifest creation.
        @param service:    name of the service
        @param manifest:   name of the manifest
        @return: list with names of packages in it.  If none, returns an empty list []
        """
        mfContentPath = ManifestController.manifestContentPath(
            service, manifest)
        if (os.path.exists(mfContentPath)):
            packages = []
            mfContentFile = file(mfContentPath, 'r')
            for packageUri in mfContentFile:
                pkgObj = PackageUtil.parseUri(packageUri.rstrip())
                packages.append(pkgObj['packageName'])
            return packages
        else:
            #Defaulting to list directory when manifest contents are not found.
            path = ManifestController.manifestPath(service, manifest)
            packages = os.listdir(path)

            return sorted(packages)
示例#20
0
def packagesInManifest(service, manifest=ACTIVE_MANIFEST):
    """ return the list of packages in the manifest.  The list is just the names not paths in the order specified during manifest creation.
    @param __service:    name of the __service
    @param manifest:   name of the manifest
    @return: list with names of packages in it.  If none, returns an empty list []
    """
    #Defaulting to list directory when manifest contents are not found.
    mfContentPath = manifestContentPath(service, manifest)
    if (os.path.exists(mfContentPath)):
        packages = []
        mfContentFile = file(mfContentPath, 'r')
        for packageUri in mfContentFile:
            from agent.lib.package import PackageUtil
            pkgObj = PackageUtil.parseUri(packageUri.rstrip())
            packages.append(pkgObj['packageName'])
        return packages
    else:
        path = manifestPath(service, manifest)
        dirs = []
        for fileName in os.listdir(path):
            if os.path.isdir(os.path.join(path, fileName)):
                dirs.append(fileName)
        dirs.sort()
        return dirs
示例#21
0
    def doRun(self):
        """ Main body of the thread

        Progress Info:
        Look at the list of packages this manifest has and figure out the progress of this manifest
        Progress 1 = manifest directory created
        Progress 2-80 = all packages downloaded
        Progress 81-99 = all packages untarred
        Progress 100 = all links done
        """
        inProgressPath = ManifestCreate.inProgress(ManifestController.manifestPath(self.__service, self.__manifest))
        try:
            if self.__service != 'agent':
                utils.checkDiskFull()

            installedPkgPath = ServiceController.installedPkgPath(self.__service)

            # This shouldn'trn happen but make sure there isn'trn already a manifest directory in progress
            if (os.path.isdir(inProgressPath)):
                # probably another manifest create thread died out half way.
                # Cleanup and reattempt manifest creation
                LOG.debug('Manifest inprogress found for service/manifest (%s/%s). Will cleanup and retry' % (self.__service, self.__manifest))
                shutil.rmtree(inProgressPath)

            # make sure that the service path and installed package path exists
            if (not os.path.isdir(ServiceController.manifestPath(self.__service)) or
                not os.path.isdir(ServiceController.installedPkgPath(self.__service))):
                errCode = Errors.SERVICE_NOT_FOUND
                msg = 'Service (%s) for manifest (%s) not found' % (self.__service, self.__manifest)
                self._updateStatus(httpStatus = 500, error = errCode, errorMsg = msg)
                return

            # ok create the manifest path
            os.mkdir(inProgressPath)

            self._updateProgress(1)

            # figure out which of the packages are already there
            remainingPackages = {}
            for pkgUri in self.__packages:
                pkgDict = PackageUtil.parseUri(pkgUri)
                pkgPath = os.path.join(installedPkgPath, pkgDict['packageName'], pkgDict['packageVersion'])
                pkgName = pkgDict['packageName']
                if (not os.path.exists(pkgPath)) or ((self.__forcePackages is not None) and pkgName in self.__forcePackages):
                    remainingPackages[pkgUri] = pkgDict
                else:
                    symlink(pkgPath, os.path.join(inProgressPath, pkgDict['packageName']))

            if self.__attemptDownload:
                # now make sure all the packages are downloaded
                try:
                    self._downloadPackages(remainingPackages.keys(), skipProp = self.__skipProp)
                except AgentException as exc:
                    # check if it is download error, then modify exception appropriately
                    if exc.getCode() == Errors.DC_FAILED_DOWNLOAD:
                        exc = AgentException(Errors.MANIFEST_PACKAGE_DOWNLOAD_FAILED,
                                            'Manifest (%s/%s) failed downloading package - %s'
                                            % (self.__service, self.__manifest, exc.getMsg()))
                    raise exc
            else:
                if len(remainingPackages) > 0:
                    raise AgentException(Errors.MANIFEST_PACKAGE_DOES_NOT_EXIST,
                                          'Create Manifest (%s/%s) failed since package is not present and download has been disabled'
                                          % (self.__service, self.__manifest))

            LOG.info('Completed download all packages for (%s/%s)' % (self.__service, self.__manifest))

            # now untar the packages
            import re
            pkgSuffix = '.%s' % re.sub(r"\W", "", self.__manifest)
            self._untarPackages(remainingPackages, self.__service, ServiceController.installedPkgPath(self.__service), 0, self.__forcePackages, pkgSuffix)
            LOG.info('Completed untar all packages for (%s/%s)' % (self.__service, self.__manifest))

            # now create the links
            for pkgDict in remainingPackages.itervalues():
                pkgPath = os.path.join(installedPkgPath, pkgDict['packageName'], pkgDict['packageVersion'])
                linkPath = os.path.join(inProgressPath, pkgDict['packageName'])
                # validate target folder does exist
                if not os.path.exists(pkgPath):
                    raise AgentException(Errors.PACKAGE_PATH_ERROR, 'invalid untarred package at %s' % pkgPath)
                symlink(pkgPath, linkPath)

            # now move the inProgressPath to the final path
            manifestContentPath = ManifestController.manifestContentPath(self.__service, self.__manifest)

            os.rename(inProgressPath, ManifestController.manifestPath(self.__service, self.__manifest))

            mfContentsFile = file(manifestContentPath, 'w')
            for pkgUri in self.__packages:
                mfContentsFile.write(('%s%s') % (pkgUri, os.linesep))
            mfContentsFile.close()
            LOG.info('Completed create manifest directories for (%s/%s)' % (self.__service, self.__manifest))

            LOG.info('Completed create manifest for (%s/%s)' % (self.__service, self.__manifest))
            self._updateStatus(progress = 100)

        except AgentException as exc:
            LOG.info(exc.getMsg())
            self._updateStatus(httpStatus = 500, error = exc.getCode(), errorMsg = exc.getMsg())
            
        except Exception as exc:
            errCode = Errors.UNKNOWN_ERROR
            msg = 'Unknown error for (%s/%s) - %s - %s' % (self.__service, self.__manifest,
                                                           str(exc), traceback.format_exc(2))
            LOG.info(msg)
            self._updateStatus(httpStatus = 500, error = errCode, errorMsg = msg)
        finally:
            # clean up intermediate progress
            try:
                shutil.rmtree(inProgressPath)
            except OSError:
                pass
示例#22
0
    def doRun(self):
        """ Main body of the thread

        Progress Info:
        Look at the list of packages this manifest has and figure out the progress of this manifest
        Progress 1 = manifest directory created
        Progress 2-80 = all packages downloaded
        Progress 81-99 = all packages untarred
        Progress 100 = all links done
        """
        try:
            if self.__service != 'agent':
                utils.checkDiskFull()

            installedPkgPath = manifestutil.installedPkgRootPath(self.__service)

            # figure out which of the packages are already there
            remainingPackages = {}
            pkgDict = PackageUtil.parseUri(self.__package)
            pkgPath = os.path.join(installedPkgPath, pkgDict['packageName'], pkgDict['packageVersion'])
            remainingPackages[self.__package] = pkgDict

            if (not os.path.exists(pkgPath)):
                # now make sure all the packages are downloaded
                try:
                    self._downloadPackages([self.__package])
                except AgentException as exc:
                    # check if it is download error, then modify exception appropriately
                    if exc.getCode() == Errors.DC_FAILED_DOWNLOAD:
                        exc = AgentException(Errors.MANIFEST_PACKAGE_DOWNLOAD_FAILED,
                                            'Manifest (%s/%s) failed downloading package - %s'
                                            % (self.__service, self.__module, exc.getMsg()))
                    raise exc

                LOG.info('Completed download packages for (%s/%s)' % (self.__service, self.__module))

                # now untar the packages
                self._untarPackages(remainingPackages, self.__service, ServiceController.installedPkgPath(self.__service))
                LOG.info('Completed untar all packages for (%s/%s)' % (self.__service, self.__module))

            # now create the links
            for pkgDict in remainingPackages.itervalues():
                pkgPath = os.path.join(installedPkgPath, pkgDict['packageName'], pkgDict['packageVersion'])
                modulePath = os.path.join(manifestutil.moduleRootPath(self.__service), self.__module)
                    
                # validate target folder does exist
                if not os.path.exists(pkgPath):
                    raise AgentException(Errors.PACKAGE_PATH_ERROR, 'invalid untarred package at %s' % pkgPath)
                    
                # remove existing module 
                isExistingModule = os.path.exists(modulePath) 
                if isExistingModule:
                    execThread = self._getBuiltThread('deactivate')
                    if execThread:
                        super(ModuleCreate, self)._runExeThread(execThread)
                    rmlink(modulePath)
                    
                execThread = self._getBuiltThread('activate')
                if execThread:
                    super(ModuleCreate, self)._runExeThread(execThread)
                symlink(pkgPath, modulePath)
                
                # load controllers from package
                manifestutil.processModule(self.__service, self.__module, not isExistingModule)
                

            LOG.info('Completed create module for (%s/%s)' % (self.__service, self.__module))
            self._updateStatus(progress = 100)

        except AgentException as exc:
            LOG.info(exc.getMsg())
            self._updateStatus(httpStatus = 500, error = exc.getCode(), errorMsg = exc.getMsg())
            
        except Exception as exc:
            errCode = Errors.UNKNOWN_ERROR
            msg = 'Unknown error for (%s/%s) - %s - %s' % (self.__service, self.__module,
                                                           str(exc), traceback.format_exc(2))
            LOG.info(msg)
            self._updateStatus(httpStatus = 500, error = errCode, errorMsg = msg)
示例#23
0
    def doRun(self):
        """ Main body of the thread

        Progress Info:
        Look at the list of packages this manifest has and figure out the progress of this manifest
        Progress 1 = manifest directory created
        Progress 2-80 = all packages downloaded
        Progress 81-99 = all packages untarred
        Progress 100 = all links done
        """
        try:
            if self.__service != 'agent':
                utils.checkDiskFull()

            installedPkgPath = manifestutil.installedPkgRootPath(
                self.__service)

            # figure out which of the packages are already there
            remainingPackages = {}
            pkgDict = PackageUtil.parseUri(self.__package)
            pkgPath = os.path.join(installedPkgPath, pkgDict['packageName'],
                                   pkgDict['packageVersion'])
            remainingPackages[self.__package] = pkgDict

            if (not os.path.exists(pkgPath)):
                # now make sure all the packages are downloaded
                try:
                    self._downloadPackages([self.__package])
                except AgentException as exc:
                    # check if it is download error, then modify exception appropriately
                    if exc.getCode() == Errors.DC_FAILED_DOWNLOAD:
                        exc = AgentException(
                            Errors.MANIFEST_PACKAGE_DOWNLOAD_FAILED,
                            'Manifest (%s/%s) failed downloading package - %s'
                            % (self.__service, self.__module, exc.getMsg()))
                    raise exc

                LOG.info('Completed download packages for (%s/%s)' %
                         (self.__service, self.__module))

                # now untar the packages
                self._untarPackages(
                    remainingPackages, self.__service,
                    ServiceController.installedPkgPath(self.__service))
                LOG.info('Completed untar all packages for (%s/%s)' %
                         (self.__service, self.__module))

            # now create the links
            for pkgDict in remainingPackages.itervalues():
                pkgPath = os.path.join(installedPkgPath,
                                       pkgDict['packageName'],
                                       pkgDict['packageVersion'])
                modulePath = os.path.join(
                    manifestutil.moduleRootPath(self.__service), self.__module)

                # validate target folder does exist
                if not os.path.exists(pkgPath):
                    raise AgentException(
                        Errors.PACKAGE_PATH_ERROR,
                        'invalid untarred package at %s' % pkgPath)

                # remove existing module
                isExistingModule = os.path.exists(modulePath)
                if isExistingModule:
                    execThreadTuple = self._getBuiltThread('deactivate')
                    super(ModuleCreate,
                          self)._runExeThread(self, execThreadTuple)
                    rmlink(modulePath)

                execThreadTuple = self._getBuiltThread('activate')
                super(ModuleCreate, self)._runExeThread(execThreadTuple)
                symlink(pkgPath, modulePath)

                # load controllers from package
                manifestutil.processModule(self.__service, self.__module,
                                           not isExistingModule)

            LOG.info('Completed create module for (%s/%s)' %
                     (self.__service, self.__module))
            self._updateStatus(progress=100)

        except AgentException as exc:
            LOG.info(exc.getMsg())
            self._updateStatus(httpStatus=500,
                               error=exc.getCode(),
                               errorMsg=exc.getMsg())

        except Exception as exc:
            errCode = Errors.UNKNOWN_ERROR
            msg = 'Unknown error for (%s/%s) - %s - %s' % (
                self.__service, self.__manifest, str(exc),
                traceback.format_exc(2))
            LOG.info(msg)
            self._updateStatus(httpStatus=500, error=errCode, errorMsg=msg)
示例#24
0
def createManifest(
        testController,
        packages=[
            'http://github.com/yubin154/cronusagent/blob/master/agent/agent/tests/unit/packages/perlserver-1.0.0.unix.cronus'
        ],
        manifest='bar',
        service='foo',
        createDirs=True):
    try:
        path = ServiceController.servicePath(service)
        os.makedirs(os.path.join(path, 'manifests'))
        os.makedirs(os.path.join(path, 'modules'))
        os.makedirs(os.path.join(path, '.appdata'))
        os.makedirs(os.path.join(path, '.data'))

        path = ServiceController.installedPkgPath(service)
        os.makedirs(path)
    except Exception as excep:
        LOG.warning('got an OS Exception - %s' % str(excep))

    try:
        for pkgUri in packages:
            pkgDict = PackageUtil.parseUri(pkgUri)
            pkgName = pkgDict['package']
            localPkgRoot = os.path.join(
                os.path.dirname(os.path.realpath(__file__)), 'packages')
            src = os.path.join(localPkgRoot, pkgName)
            shutil.copy(src, pkgDict['packagePath'])
            propPkgName = pkgDict['propName']
            propSrc = os.path.join(localPkgRoot, propPkgName)
            shutil.copy(propSrc, pkgDict['propPath'])
    except Exception as excep:
        LOG.warning('got an OS Exception - %s' % str(excep))

    body = json.dumps({'package': packages})
    response = testController.app.post(
        url(controller='manifest',
            action='post',
            service=service,
            manifest=manifest),
        headers={'Content-Type': 'application/json'},
        params=body)
    assert response.status_int == 200, 'Manifest Post assert'

    LOG.debug('response body = %s' % response.body)

    body = json.loads(response.body)

    # wait until the status is done
    tm = time.time()
    now = tm
    while (tm + 120 > now):
        response = testController.app.get(body['status'])
        body = json.loads(response.body)

        LOG.debug("createManifest  ********** progress = %s" %
                  body['progress'])
        if (int(body['progress']) == 100):
            break
        time.sleep(0.1)
        now = time.time()

    assert tm + 120 >= now, 'Create manifest timed out'
    LOG.debug('status = ' + str(response.status_int))
    assert response.status_int == 200, "HTTP response != 200"
    LOG.debug('Status response body = %s' % str(body))
    assert int(body['progress']) == 100