def save(self): """ Save the list of subusers to disk. """ serializedUnlockedSubusersDict = {} serializedLockedSubusersDict = {} for subuserName, subuser in self.items(): serializedSubuser = {} serializedSubuser["source-repo"] = subuser.getImageSource( ).getRepository().getName() serializedSubuser["image-source"] = subuser.getImageSource( ).getName() serializedSubuser[ "executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled( ) serializedSubuser["docker-image"] = subuser.getImageId() if subuser.locked(): serializedLockedSubusersDict[subuserName] = serializedSubuser else: serializedUnlockedSubusersDict[subuserName] = serializedSubuser with open( os.path.join(self.getUser().getConfig()["registry-dir"], "subusers.json"), 'w') as file_f: json.dump(serializedUnlockedSubusersDict, file_f, indent=1, separators=(',', ': ')) with open( os.path.join( self.getUser().getConfig()["locked-subusers-path"]), 'w') as file_f: json.dump(serializedLockedSubusersDict, file_f, indent=1, separators=(',', ': '))
def save(self): """ Save the list of subusers to disk. """ serializedSubusersDict = {} for subuserName, subuser in self.iteritems(): serializedSubusersDict[subuserName] = {} serializedSubusersDict[subuserName][ "source-repo"] = subuser.getImageSource().getRepository( ).getName() serializedSubusersDict[subuserName][ "image-source"] = subuser.getImageSource().getName() serializedSubusersDict[subuserName][ "executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled( ) serializedSubusersDict[subuserName][ "docker-image"] = subuser.getImageId() with open( os.path.join( self.getUser().getConfig().getSubusersDotJsonPath()), 'w') as file_f: json.dump(serializedSubusersDict, file_f, indent=1, separators=(',', ': '))
def verify(user,permissionsAccepter=None,checkForUpdatesExternally=False,subusers=[],prompt=False,useCache=False): """ Ensure that: - Registry is consistent; warns the user about subusers that point to non-existant source images. - For each subuser there is an up-to-date image installed. - No-longer-needed temporary repositories are removed. All temporary repositories have at least one subuser who's image is built from one of the repository's image sources. - No-longer-needed installed images are removed. """ user.getRegistry().log("Verifying subuser configuration.") user.getRegistry().log("Verifying registry consistency...") for _,subuser in user.getRegistry().getSubusers().items(): try: subuser.getImageSource() except subuserlib.classes.subuser.NoImageSourceException: user.getRegistry().log("WARNING: "+subuser.getName()+" is no longer present in it's source repository. Support for this progam may have been dropped.") try: subusers.remove(subuser) except ValueError: pass user.getRegistry().log("Unregistering any non-existant installed images.") user.getInstalledImages().unregisterNonExistantImages() if subusers: user.getRegistry().setChanged(True) user.getRegistry().log("Approving permissions...",verbosityLevel=3) (failedSubusers,permissionParsingExceptions) = approvePermissions(user,subusers,permissionsAccepter) user.getRegistry().log("Permissions approved...",verbosityLevel=3) subusers = [x for x in subusers if x not in failedSubusers] for failedSubuser in failedSubusers: try: failedSubuser.getPermissions() except subuserlib.classes.subuser.SubuserHasNoPermissionsException: del user.getRegistry().getSubusers()[failedSubuser.getName()] subusers += ensureServiceSubusersAreSetup(user,subusers) installationTask = InstallationTask(user,subusersToBeUpdatedOrInstalled=subusers,checkForUpdatesExternally=checkForUpdatesExternally) outOfDateSubusers = installationTask.getOutOfDateSubusers() if outOfDateSubusers: user.getRegistry().log("New images for the following subusers need to be installed:") for subuser in outOfDateSubusers: user.getRegistry().log(subuser.getName()) if (not prompt) or (prompt and (not input("Would you like to install those images now? [Y/n]") == "n")): installationTask.updateOutOfDateSubusers(useCache=useCache) for exception in permissionParsingExceptions: user.getRegistry().log(str(exception)) subusersWhosImagesFailedToBuild = installationTask.getSubusersWhosImagesFailedToBuild() if subusersWhosImagesFailedToBuild: user.getRegistry().log("Images for the following subusers failed to build:") for subuser in subusersWhosImagesFailedToBuild: user.getRegistry().log(subuser.getName()) for subuser in subusers: try: subuser.getRunReadyImage().setup() subuser.setupHomeDir() except subuserlib.classes.subuserSubmodules.run.runtimeCache.NoRuntimeCacheForSubusersWhichDontHaveExistantImagesException: pass user.getInstalledImages().save() trimUnneededTempRepos(user) rebuildBinDir(user) cleanupRuntimeDirs(user) cleanUpRuntimeCache(user) cleanUpAfterImproperlyTerminatedServices(user)
def save(self): """ Save the list of subusers to disk. """ serializedSubusersDict = {} for subuserName,subuser in self.iteritems(): serializedSubusersDict[subuserName] = {} serializedSubusersDict[subuserName]["source-repo"] = subuser.getImageSource().getRepository().getName() serializedSubusersDict[subuserName]["image-source"] = subuser.getImageSource().getName() serializedSubusersDict[subuserName]["executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled() serializedSubusersDict[subuserName]["docker-image"] = subuser.getImageId() with open(os.path.join(self.getUser().getConfig().getSubusersDotJsonPath()), 'w') as file_f: json.dump(serializedSubusersDict, file_f, indent=1, separators=(',', ': '))
def trimUnneededTempRepos(user): user.getRegistry().log( "Running garbage collector on temporary repositories...") reposToRemove = [] for repoId, repo in user.getRegistry().getRepositories( ).userRepositories.items(): keep = False if repo.isTemporary(): for _, installedImage in user.getInstalledImages().items(): if repoId == installedImage.getSourceRepoId(): keep = True for _, subuser in user.getRegistry().getSubusers().items(): try: if repoId == subuser.getImageSource().getRepository( ).getName(): keep = True except subuserlib.classes.subuser.NoImageSourceException: pass else: keep = True if not keep: user.getRegistry().logChange( "Removing uneeded temporary repository: " + repo.getDisplayName()) repo.removeGitRepo() reposToRemove.append(repoId) for repoId in reposToRemove: del user.getRegistry().getRepositories().userRepositories[repoId]
def approvePermissions(user,subuserNames,permissionsAccepter): subusersWhosPermissionsFailedToParse = [] exceptions = [] for subuserName in subuserNames: subuser = user.getRegistry().getSubusers()[subuserName] try: userApproved = subuser.getPermissions() except subuserlib.classes.subuser.SubuserHasNoPermissionsException: userApproved = None try: oldDefaults = subuser.getPermissionsTemplate() newDefaults = subuser.getImageSource().getPermissions() permissionsAccepter.accept(subuser=subuser,oldDefaults=oldDefaults,newDefaults=newDefaults,userApproved=userApproved) subuser.getPermissionsTemplate().update(subuser.getImageSource().getPermissions()) subuser.getPermissionsTemplate().save() except SyntaxError as e: subusersWhosPermissionsFailedToParse.append(subuserName) exceptions.append(e) return (subusersWhosPermissionsFailedToParse,exceptions)
def approvePermissions(user, subuserNames, permissionsAccepter): subusersWhosPermissionsFailedToParse = [] exceptions = [] for subuserName in subuserNames: subuser = user.getRegistry().getSubusers()[subuserName] try: userApproved = subuser.getPermissions() except subuserlib.classes.subuser.SubuserHasNoPermissionsException: userApproved = None try: oldDefaults = subuser.getPermissionsTemplate() newDefaults = subuser.getImageSource().getPermissions() permissionsAccepter.accept(subuser=subuser, oldDefaults=oldDefaults, newDefaults=newDefaults, userApproved=userApproved) subuser.getPermissionsTemplate().update( subuser.getImageSource().getPermissions()) subuser.getPermissionsTemplate().save() except SyntaxError as e: subusersWhosPermissionsFailedToParse.append(subuserName) exceptions.append(e) return (subusersWhosPermissionsFailedToParse, exceptions)
def approvePermissions(user,subusers,permissionsAccepter): subusersWhosPermissionsFailedToParse = [] exceptions = [] for subuser in subusers: if subuser.locked(): continue try: userApproved = subuser.getPermissions() except subuserlib.classes.subuser.SubuserHasNoPermissionsException: userApproved = None try: oldDefaults = subuser.getPermissionsTemplate() newDefaults = subuser.getImageSource().getPermissions() permissionsAccepter.accept(subuser=subuser,oldDefaults=oldDefaults,newDefaults=newDefaults,userApproved=userApproved) subuser.getPermissionsTemplate().update(subuser.getImageSource().getPermissions()) subuser.getPermissionsTemplate().save() except SyntaxError as e: subusersWhosPermissionsFailedToParse.append(subuser) exceptions.append(e) except subuserlib.classes.subuser.NoImageSourceException: subusersWhosPermissionsFailedToParse.append(subuser) user.getRegistry().log("Warning: The image source for subuser %s is no longer available."%subuser.getName()) return (subusersWhosPermissionsFailedToParse,exceptions)
def trimUnneededTempRepos(user): user.getRegistry().log("Running garbage collector on temporary repositories...") reposToRemove = [] for repoId,repo in user.getRegistry().getRepositories().userRepositories.items(): keep = False if repo.isTemporary(): for _,installedImage in user.getInstalledImages().items(): if repoId == installedImage.getSourceRepoId(): keep = True for _,subuser in user.getRegistry().getSubusers().items(): if repoId == subuser.getImageSource().getRepository().getName(): keep = True else: keep = True if not keep: user.getRegistry().logChange("Removing uneeded temporary repository: "+repo.getDisplayName()) repo.removeGitRepo() reposToRemove.append(repoId) for repoId in reposToRemove: del user.getRegistry().getRepositories().userRepositories[repoId]
def verify(user, permissionsAccepter=None, checkForUpdatesExternally=False, subuserNames=[], prompt=False): """ Ensure that: - Registry is consistent; warns the user about subusers that point to non-existant source images. - For each subuser there is an up-to-date image installed. - No-longer-needed temporary repositories are removed. All temporary repositories have at least one subuser who's image is built from one of the repository's image sources. - No-longer-needed installed images are removed. """ user.getRegistry().log("Verifying subuser configuration.") user.getRegistry().log("Verifying registry consistency...") for _, subuser in user.getRegistry().getSubusers().items(): try: subuser.getImageSource() except subuserlib.classes.subuser.NoImageSourceException: user.getRegistry().log( "WARNING: " + subuser.getName() + " is no longer present in it's source repository. Support for this progam may have been dropped." ) try: subuserNames.remove(subuser.getName()) except ValueError: pass user.getRegistry().log("Unregistering any non-existant installed images.") user.getInstalledImages().unregisterNonExistantImages() if subuserNames: user.getRegistry().setChanged(True) (failedSubuserNames, permissionParsingExceptions) = approvePermissions( user, subuserNames, permissionsAccepter) subuserNames = [x for x in subuserNames if x not in failedSubuserNames] subuserNames += ensureServiceSubusersAreSetup(user, subuserNames) subusers = [ user.getRegistry().getSubusers()[subuserName] for subuserName in subuserNames ] installationTask = InstallationTask( user, subusersToBeUpdatedOrInstalled=subusers, checkForUpdatesExternally=checkForUpdatesExternally) outOfDateSubusers = installationTask.getOutOfDateSubusers() if outOfDateSubusers: user.getRegistry().log( "New images for the following subusers need to be installed:") for subuser in outOfDateSubusers: user.getRegistry().log(subuser.getName()) if (not prompt) or (prompt and (not raw_input( "Would you like to install those images now? [Y/n]") == "n")): installationTask.updateOutOfDateSubusers() for exception in permissionParsingExceptions: user.getRegistry().log(str(exception)) subusersWhosImagesFailedToBuild = installationTask.getSubusersWhosImagesFailedToBuild( ) if subusersWhosImagesFailedToBuild: user.getRegistry().log( "Images for the following subusers failed to build:") for subuser in subusersWhosImagesFailedToBuild: user.getRegistry().log(subuser.getName()) for subuser in subusers: try: subuser.getRunReadyImage().setup() subuser.setupHomeDir() except subuserlib.classes.subuserSubmodules.run.runtimeCache.NoRuntimeCacheForSubusersWhichDontHaveExistantImagesException: pass user.getInstalledImages().save() trimUnneededTempRepos(user) rebuildBinDir(user) cleanupRuntimeDirs(user) cleanUpRuntimeCache(user) cleanUpAfterImproperlyTerminatedServices(user)