def __init__(self, options, args): self.master_datadir = options.masterDataDirectory # TODO: AK: Program logic should not be dictating master, standby, and segment information # In other words, the fundamental Operations should have APIs that preclude the need for this. self.master_host = None self.standby_host = None self.segment_host_list = None self.query = options.query self.build = options.build self.install = options.install self.remove = options.remove self.update = options.update self.clean = options.clean self.migrate = options.migrate self.interactive = options.interactive self.filename = options.filename # only one of the following may be provided: --install, --remove, --update, --query, --build, --clean, --migrate count = sum([1 for opt in ['install', 'remove', 'update', 'query', 'build', 'clean', 'migrate'] if getattr(self, opt)]) if count != 1: raise ExceptionNoStackTraceNeeded('Exactly one of the following must be provided: --install, --remove, -update, --query, --clean, --migrate') if self.query: # gppkg -q can be supplemented with --info, --list, --all count = sum([1 for opt in ['info', 'list', 'all'] if options.__dict__[opt]]) if count > 1: raise ExceptionNoStackTraceNeeded('For --query, at most one of the following can be provided: --info, --list, --all') # for all query options other than --all, a package path must be provided if not options.all and len(args) != 1: raise ExceptionNoStackTraceNeeded('A package must be specified for -q, -q --info, and -q --list.') if options.info: self.query = (QueryPackage.INFO, args[0]) elif options.list: self.query = (QueryPackage.LIST, args[0]) elif options.all: self.query = (QueryPackage.ALL, None) else: self.query = (None, args[0]) elif self.migrate: if len(args) != 2: raise ExceptionNoStackTraceNeeded('Invalid syntax, expecting "gppkg --migrate <from_gphome> <to_gphome>".') self.migrate = (args[0], args[1]) # gppkg should check gpexpand status unless in build mode. # # Build mode does not use any information from the cluster and does not # affect its running status, in fact it does not require a cluster # exists at all. if not self.build: check_result, msg = gp.conflict_with_gpexpand("gppkg", refuse_phase1=True, refuse_phase2=False) if not check_result: raise ExceptionNoStackTraceNeeded(msg)