Exemple #1
0
	def default_dc_state(self, api):
		return api.getDataCenterState(self.default_dc);
	def run_command(self, cmd, args):
		if cmd == 'deletedatacenter':
			if self.default_dc is not None:
				self.out('Data center ' + self.default_dc + ' is in use. You may not perform any data center deletion operations. Type \'use\' to reset and try again\n')
				return
		args.insert(0, 'pbapi-internal-placeholder-text') # equivalent of argv[0]
		argsParser = pb.argsparser.ArgsParser()
		pb.errorhandler.initializing += 1
		argsParser.readUserArgs(sys.argv)
		pb.errorhandler.last_error()
		pb.errorhandler.initializing -= 1
		argsParser.readUserArgs(args)
		requestedOp = argsParser.getRequestedOperation()
		if requestedOp == '':
			# argsParser is telling us to ignore this command
			# this hack will be removed once we replace errorhandler with exceptions
			return
		if requestedOp is None:
			raise Exception('Invalid operation')
		if requestedOp[0] == '@':
			helper = pb.helper.Helper()
			pb.argsparser.ArgsParser.operations[requestedOp]['api'](helper)
			return
		if not argsParser.isAuthenticated():
			raise Exception('Authentication error: Missing authentication')
		formatter = pb.formatter.Formatter()
		if argsParser.baseArgs['s']:
			formatter.shortFormat()
		formatter.batch = argsParser.baseArgs["batch"]
		
		try:
			api = pb.api.API(argsParser.baseArgs['u'], argsParser.baseArgs['p'], debug = argsParser.baseArgs['debug'])
		except Exception as ex:
			self.out(str(ex));
			return
		
		if cmd == 'deletedatacenter':
			# check if datacenter is empty first (as per PB API 1.2 specs, clients should check if dc is empty before deleting)
			apiResult = pb.argsparser.ArgsParser.operations['getDataCenter']['api'](api, argsParser.opArgs)
			if ('servers' in apiResult and len(apiResult['servers']) > 0) or ('storages' in apiResult and len(apiResult['storages']) > 0) or ('loadBalancers' in apiResult and len(apiResult['loadBalancers']) > 0):
				ans = raw_input('The data center is not empty! Do you want to continue? [y/N] ')
				if ans[0:1].lower() != 'y':
					self.out('Operation cancelled')
					return
		
		apiResult = pb.argsparser.ArgsParser.operations[requestedOp]['api'](api, argsParser.opArgs)
		
		try:
			pb.argsparser.ArgsParser.operations[requestedOp]['out'](formatter, apiResult)
		except Exception as ex:
			raise Exception('Internal error while printing response: ' + str(ex))
			return
		
		self.waitOnce = argsParser.baseArgs["wait"] if ("wait" in argsParser.baseArgs and 'dcid' in argsParser.opArgs) else None
		while (self.wait and (self.default_dc is not None) and self.waitOnce is None) or (self.waitOnce is not None and self.waitOnce):
			try:
				if (self.waitOnce is not None) and self.waitOnce:
					try:
						if api.getDataCenterState(argsParser.opArgs['dcid']) == 'AVAILABLE':
							break
					except:
						# data center may no longer be available in case of deleteDataCenter command
						break
				else:
					if api.getDataCenterState(self.default_dc) == 'AVAILABLE':
						break
			except Exception as ex:
				self.out(str(ex))
				break
			sys.stdout.write('.')
			sys.stdout.flush()
			time.sleep(1)
		self.waitOnce = None
		if (self.wait):
			self.out('\n')
		
		# reload datacenters list
		if cmd in ['createdatacenter', 'deletedatacenter']:
			try:
				self.parse('get-all-datacenters')
			except Exception as ex:
				raise Exception('Failed to get list of data centers: ' + str(ex))