def show(region, namespace): status = False if region and region not in REGIONS: raise ArgsException( "region {r} not exists ,please select from{R}".format( r=region, R=REGIONS)) if not region: region = UserConfig().region status = True rep = ScfClient(region).get_ns(namespace) if not rep: raise NamespaceException( "Region {r} not exist namespace {n}".format(r=region, n=namespace)) functions = ScfClient(region).list_function(namespace) if not functions: Operation("Region {r} namespace {n} not exist function".format( r=region, n=namespace)).warning() return Operation("Region:%s" % (region)).process() Operation("Namespace:%s " % (namespace)).process() Operation("%-20s %-15s %-20s %-20s %-60s" % ("Runtime", "Status", "AddTime", "ModTime", "FunctionName")).echo() for function in functions: Operation("%-20s %-24s %-20s %-20s %-60s" % (function.Runtime, List.status( function.Status), function.AddTime, function.ModTime, function.FunctionName)).echo() if status: msg = "If you want to get a list of more functions, you can specify the region and namespace. Like: scf function list --region ap-shanghai --namespace default" Operation(msg).information()
def show(region, namespace, name): if region and region not in REGIONS: raise ArgsException("region {r} not exists ,please select from{R}".format(r=region, R=REGIONS)) if not region: region = UserConfig().region rep = ScfClient(region).get_ns(namespace) if not rep: raise NamespaceException("Region {r} not exist namespace {n}".format(r=region, n=namespace)) functions = ScfClient(region).get_function(function_name=name, namespace=namespace) if not functions: raise FunctionNotFound("Region {r} namespace {n} not exist function {f}".format(r=region, n=namespace, f=name)) return Operation("Region:%s" % (region)).process() Operation("Namespace:%s " % (namespace)).process() Operation("Function:%s " % (name)).process() testmodels = ScfClient(region).list_func_testmodel(functionName=name, namespace=namespace) if not testmodels: raise NamespaceException("This function not exist event".format(f=name)) click.secho("%-20s %-20s %-20s" % ("TestmodelsName", "AddTime", "ModTime")) for testmodel in testmodels: res = ScfClient(region).get_func_testmodel(functionName=name, namespace=namespace, testModelName=testmodel) click.secho("%-20s %-20s %-20s" % (testmodel, res['CreatedTime'], res['ModifiedTime'])) click.secho("\n")
def do_cli(region, namespace): if region != 'all' and region not in REGIONS: raise ArgsException("! The region must in all, %s." % (", ".join(REGIONS))) if region == 'all' and namespace == 'all': for region in REGIONS: namespaces = ScfClient(region).list_ns() for namespace in namespaces: List.show(region, namespace['Name']) elif region == 'all' and namespace != 'all': tag = False for region in REGIONS: if List.show(region, namespace) is not False: tag = True if tag is False: raise NamespaceException( "namespace {ns} not exists in all region".format( ns=namespace)) elif region != 'all' and namespace == 'all': namespaces = ScfClient(region).list_ns() for namespace in namespaces: List.show(region, namespace['Name']) elif region != 'all' and namespace != 'all': if List.show(region, namespace) == False: raise NamespaceException( "namespace {ns} not exists".format(ns=namespace))
def show(region, namespace): if region and region not in REGIONS: raise ArgsException( "region {r} not exists ,please select from{R}".format( r=region, R=REGIONS)) # return rep = ScfClient(region).get_ns(namespace) if not rep: return False functions = ScfClient(region).list_function(namespace) if not functions: # click.secho("Region:%s \nNamespace:%s " % (region, namespace), fg="green") # click.secho("no function exists\n", fg="red") return Operation("Region:%s" % (region)).process() Operation("Namespace:%s " % (namespace)).process() click.secho( "%-20s %-15s %-20s %-20s %-60s" % ("Runtime", "Status", "AddTime", "ModTime", "FunctionName")) for function in functions: click.secho( "%-20s %-24s %-20s %-20s %-60s" % (function.Runtime, List.status(function.Status), function.AddTime, function.ModTime, function.FunctionName)) click.secho("\n")
def do_deploy_testmodel(functionName, namespace, region, forced, event, event_name): # 获取失败抛出异常会直接创建新模版 # 获取成功代表已有模版,根据force是否覆盖 try: ScfClient(region).get_func_testmodel(functionName=functionName, testModelName=event_name, namespace=namespace) if not forced: Operation("Eventdata {%s} exist in remote" % event_name).exception() return True else: Operation("Eventdata {%s} exist in remote,updating event..." % event_name).process() ScfClient(region).update_func_testmodel( functionName=functionName, testModelValue=event, testModelName=event_name, namespace=namespace) Operation("Eventdata {%s} update success!" % event_name).success() except: Operation("Updateing eventdata {%s}..." % event_name).process() ScfClient(region).create_func_testmodel(functionName=functionName, testModelValue=event, testModelName=event_name, namespace=namespace) Operation("Eventdata {%s} update success!" % event_name).success()
def do_cli(name, region, namespace, eventdata, logtype, invocationtype): if region and region not in REGIONS: raise ArgsException( "region {r} not exists ,please select from{R}".format( r=region, R=REGIONS)) if not region: region = UserConfig().region rep = ScfClient(region).get_ns(namespace) if not rep: raise NamespaceException( "Region {r} not exist namespace {n}".format(r=region, n=namespace)) functions = ScfClient(region).get_function(name, namespace) if not functions: Operation("Could not found this funtion").warning() Operation( "You could get function name by: scf function list").warning() Operation( "This command requires the --name option / -n shortcut. Usage: The function name" ).warning() return rep, invokeres = ScfClient(region).invoke_func(name, namespace, eventdata, invocationtype, logtype) if not rep: Operation("Invoke failed").warning() Operation(invokeres).exception() return else: invokeres = json.loads(invokeres) # print(invokeres) Operation('Invoke success\n\n' 'Response:%s\n\n' 'Output:\n%s\n\n' 'Summary:\n' 'FunctionRequestId:%s\n' 'Run Duration:%sms\n' 'Bill Duration:%sms\n' 'Usage memory:%sB\n\n' % ( invokeres['Result']['RetMsg'], invokeres['Result']['Log'], invokeres['Result']['FunctionRequestId'], invokeres['Result']['Duration'], invokeres['Result']['BillDuration'], invokeres['Result']['MemUsage'], )).success() if len(invokeres['Result']['Log']) > 4000: Operation( 'You could get more logs by: `scf logs -r %s -ns %s -n %s`' % (region, namespace, name)).information()
def _do_deploy_core(self, func, func_name, func_ns, forced): err = ScfClient().deploy_func(func, func_name, func_ns, forced) if err is not None: click.secho("Deploy function '{name}' failure. Error: {e}.".format( name=func_name, e=err.get_message().encode("UTF-8")), fg="red") if err.get_request_id(): click.secho("RequestId: {}".format( err.get_request_id().encode("UTF-8")), fg="red") return click.secho("Deploy function '{name}' success".format(name=func_name), fg="green") self._do_deploy_trigger(func, func_name, func_ns)
def do_cli(region, namespace, name): rep = ScfClient(region).get_ns(namespace) if not rep: raise DeleteException("Namespace {ns} not exists".format(ns=namespace)) # return rep = ScfClient(region).get_function(function_name=name, namespace=namespace) if not rep: raise DeleteException("Function {function} not exists".format(function=name)) # return rep = ScfClient(region).delete_function(function_name=name, namespace=namespace) if not rep: raise DeleteException("Function {function} delete failed".format(function=name)) # return Operation("Function {function} delete success".format(function=name)).success()
def _do_deploy_trigger(self, func, func_name, func_ns): events = getattr(func, "Events", None) if events is None: return for name, trigger in vars(events).items(): err = ScfClient().deploy_trigger(trigger, name, func_name, func_ns) if err is not None: click.secho( "Deploy trigger '{name}' failure. Error: {e}.".format( name=name, e=err.get_message().encode("UTF-8")), fg="red") if err.get_request_id(): click.secho("RequestId: {}".format( err.get_request_id().encode("UTF-8")), fg="red") continue click.secho("Deploy trigger '{name}' success".format(name=name), fg="green")
def _do_deploy_core(self, func, func_name, func_ns, region, forced, skip_event=False): # check namespace exit, create namespace if self.namespace and self.namespace != func_ns: func_ns = self.namespace rep = ScfClient(region).get_ns(func_ns) if not rep: Operation( "{ns} not exists, create it now".format(ns=func_ns)).process() err = ScfClient(region).create_ns(func_ns) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") raise NamespaceException( "Create namespace '{name}' failure. Error: {e}.".format( name=func_ns, e=s)) err = ScfClient(region).deploy_func(func, func_name, func_ns, forced) if err is not None: # if sys.version_info[0] == 3: s = err.get_message() # else: # s = err.get_message().encode("UTF-8") if sys.version_info[0] == 2 and isinstance(s, str): s = s.encode("utf8") err_msg = u"Deploy function '{name}' failure, {e}.".format( name=func_name, e=s) if err.get_request_id(): err_msg += (u" RequestId: {}".format(err.get_request_id())) raise CloudAPIException(err_msg) Operation("Deploy function '{name}' success".format( name=func_name)).success() if not skip_event: self._do_deploy_trigger(func, func_name, func_ns, region)
def _do_deploy_trigger(self, func, func_name, func_ns, region=None): proper = func.get(tsmacro.Properties, {}) events = proper.get(tsmacro.Events, {}) hasError = None for trigger in events: err = ScfClient(region).deploy_trigger(events[trigger], trigger, func_name, func_ns) if err is not None: hasError = err if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") if "Param error The path+method already exists under the service" not in str( s): if err.get_request_id(): Operation( "Deploy trigger '{name}' failure. Error: {e}. RequestId: {id}" .format(name=trigger, e=s, id=err.get_request_id())).warning() else: Operation( "Deploy trigger '{name}' failure. Error: {e}.". format( name=trigger, e=s, )).warning() continue Operation("Deploy trigger '{name}' success".format( name=trigger)).success()
def _do_deploy_trigger(self, func, func_name, func_ns, region=None): proper = func.get(tsmacro.Properties, {}) events = proper.get(tsmacro.Events, {}) hasError = None for trigger in events: err = ScfClient(region).deploy_trigger(events[trigger], trigger, func_name, func_ns) if err is not None: hasError = err if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") click.secho( "Deploy trigger '{name}' failure. Error: {e}.".format( name=trigger, e=s), fg="red") if err.get_request_id(): click.secho("RequestId: {}".format( err.get_request_id().encode("UTF-8")), fg="red") continue click.secho("Deploy trigger '{name}' success".format(name=trigger), fg="green") if hasError is not None: sys.exit(1)
def update_event_data(region, namespace, name, eventdatalist, forced): region = region if region else UserConfig().region if region not in REGIONS: raise ArgsException( "region {r} not exists ,please select from{R}".format( r=region, R=REGIONS)) if not ScfClient(region).get_ns(namespace): raise NamespaceException( "Region {r} not exist namespace {n}".format(r=region, n=namespace)) if not ScfClient(region).get_function(function_name=name, namespace=namespace): raise FunctionNotFound( "Region {r} namespace {n} not exists function {f}".format( r=region, n=namespace, f=name)) Operation("Region:%s" % (region)).process() Operation("Namespace:%s " % (namespace)).process() Operation("Function:%s " % (name)).process() flag = False for eventdata in eventdatalist: if Update.do_deploy_testmodel(functionName=name, namespace=namespace, region=region, forced=forced, event=list(eventdata.values())[0], event_name=list( eventdata.keys())[0]): flag = True if flag: Operation( "If you want to cover remote eventdata.You can use command with option -f" ).exception()
def do_eve_trigger(self, region, events, trigger, func_name, func_ns): err = ScfClient(region).deploy_trigger(events[trigger], trigger, func_name, func_ns) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") if err.get_request_id(): Operation("Deploy {namespace} {function} trigger '{name}' failure. Error: {e}. RequestId: {id}". format(namespace=func_ns, function=func_name, name=trigger, e=s, id=err.get_request_id())).warning() else: msg = "Deploy {namespace} {function} trigger '{name}' failure. Error: {e}.".format(namespace=func_ns, function=func_name, name=trigger, e=s, ) Operation(msg).warning() else: Operation( "Deploy {namespace} {function} trigger '{name}' success".format(namespace=func_ns, function=func_name, name=trigger)).success()
def do_cli(region, namespace, name, event, output_dir, forced): Get.checkpath(output_dir) if region and region not in REGIONS: raise ArgsException( "region {r} not exists ,please select from{R}".format( r=region, R=REGIONS)) if not region: region = UserConfig().region rep = ScfClient(region).get_ns(namespace) if not rep: raise NamespaceException( "Region {r} not exist namespace {n}".format(r=region, n=namespace)) functions = ScfClient(region).get_function(function_name=name, namespace=namespace) if not functions: raise FunctionNotFound( "Region {r} namespace {n} not exist function {f}".format( r=region, n=namespace, f=name)) testmodelvaluelist = {} if event: testmodelvalue = ScfClient(region).get_func_testmodel( functionName=name, namespace=namespace, testModelName=event) if not testmodelvalue: raise NamespaceException( "This function {f} not exist event {e} ".format(f=name, e=event)) testmodelvaluelist[event] = testmodelvalue else: for testmodel in ScfClient(region).list_func_testmodel( functionName=name, namespace=namespace): testmodelvalue = ScfClient(region).get_func_testmodel( functionName=name, namespace=namespace, testModelName=testmodel) testmodelvaluelist[testmodel] = testmodelvalue flag = False for testmodel in testmodelvaluelist: testmodelfilename = testmodel + '.json' testmodelfilepath = os.path.join(output_dir, testmodelfilename) if os.path.exists(testmodelfilepath) and os.path.isfile( testmodelfilepath) and not forced: Operation('Event-data: {%s} exists in local.' % (testmodelfilepath)).exception() flag = True continue try: with open(testmodelfilepath, 'w') as f: Operation('Downloading event-data: {%s} ...' % (testmodel)).process() f.write(testmodelvaluelist[testmodel]['TestModelValue']) Operation('Download event-data: {%s} success' % (testmodel)).success() except: Operation('Download event-data: {%s} failed' % (testmodel)).exception() if flag: Operation( 'If you want to cover local eventdata.You can use commond with option -f' ).exception()
def _do_deploy_core(self, func, func_name, func_ns, region, forced, skip_event=False): # check namespace exit, create namespace if self.namespace and self.namespace != func_ns: func_ns = self.namespace function_data = Function(region, func_ns, func_name, self.resources).get_function_trigger() trigger_release = None if function_data: now_runtime = function_data[0] trigger_release = function_data[1] if func['Properties']['Runtime'] != now_runtime: err_msg = "RUNTIME in YAML does not match RUNTIME on the RELEASE (release: %s)" % now_runtime raise DeployException(err_msg) rep = ScfClient(region).get_ns(func_ns) if not rep: Operation( "{ns} not exists, create it now".format(ns=func_ns)).process() err = ScfClient(region).create_ns(func_ns) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") raise NamespaceException( "Create namespace '{name}' failure. Error: {e}.".format( name=func_ns, e=s)) deploy_result = ScfClient(region).deploy_func(func, func_name, func_ns, forced) if deploy_result == 1: Operation("{ns} {name} already exists, update it now".format( ns=func_ns, name=func_name)).process() deploy_result = ScfClient(region).update_config( func, func_name, func_ns) if deploy_result == True: deploy_result = ScfClient(region).update_code( func, func_name, func_ns) deploy_result = 0 if deploy_result == True else deploy_result if deploy_result == 0: Operation("Deploy function '{name}' success".format( name=func_name)).success() if not skip_event: self._do_deploy_trigger(func, func_name, func_ns, region, trigger_release) return elif deploy_result == 2: Operation( "You can add -f to update the function when it already exists. Example : scf deploy -f" ).warning() raise CloudAPIException("The function already exists.") if deploy_result != None: err = deploy_result s = err.get_message() if sys.version_info[0] == 2 and isinstance(s, str): s = s.encode("utf8") err_msg = u"Deploy function '{name}' failure, {e}.".format( name=func_name, e=s) if err.get_request_id(): err_msg += (u" RequestId: {}".format(err.get_request_id())) raise CloudAPIException(err_msg)
def _do_deploy_core(self, func, func_name, func_ns, region, forced, skip_event=False): # check namespace exit, create namespace if self.namespace and self.namespace != func_ns: func_ns = self.namespace rep = ScfClient(region).get_ns(func_ns) if not rep: click.secho("{ns} not exists, create it now".format(ns=func_ns), fg="red") err = ScfClient(region).create_ns(func_ns) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") click.secho("Create namespace '{name}' failure. Error: {e}.".format( name=func_ns, e=s), fg="red") sys.exit(1) err = ScfClient(region).deploy_func(func, func_name, func_ns, forced) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") err_msg = "Deploy function '{name}' failure, {e}.".format(name=func_name, e=s) if err.get_request_id(): err_msg += ("\nRequestId: {}" .format(err.get_request_id().encode("UTF-8"))) raise CloudAPIException(err_msg.decode("UTF-8")) click.secho("Deploy function '{name}' success".format(name=func_name), fg="green") if not skip_event: self._do_deploy_trigger(func, func_name, func_ns, region)
def _do_deploy_trigger(self, func, func_name, func_ns, region=None, trigger_release=None): proper = func.get(tsmacro.Properties, {}) events = proper.get(tsmacro.Events, {}) hasError = None for trigger in events: trigger_status = True msg = "Deploy %s trigger '%s' failure, this trigger has been created." % ( events[trigger]['Type'], trigger) if trigger_release: try: event_type = str(events[trigger]['Type']).lower() temp_trigger = events[trigger].copy() if event_type == "timer": temp_trigger['TriggerName'] = trigger for eve_event in trigger_release[str( events[trigger]['Type']).lower()]: eve_event_infor = eve_event.copy() eve_event_infor.pop("TriggerDesc", eve_event_infor) change_infor = False tproperty = temp_trigger['Properties'] eproperty = eve_event['Properties'] if event_type == "timer": if temp_trigger['TriggerName'] == eve_event[ 'TriggerName']: change_infor = True elif event_type == "apigw": if tproperty['ServiceId'] == eproperty[ 'ServiceId'] and tproperty[ 'StageName'] == eproperty[ 'StageName'] and tproperty[ 'HttpMethod'] == eproperty[ 'HttpMethod']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "ckafka": if tproperty['Name'] + "-" + eproperty[ 'Topic'] == tproperty[ 'Name'] + "-" + eproperty['Topic']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "cmq": if tproperty['Name'] == eproperty['Name']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "cos": if tproperty['Bucket'] == eproperty[ 'Bucket'] and tproperty[ 'Events'] == eproperty[ 'Events'] and tproperty[ 'Filter'] == eproperty[ 'Filter']: eve_event_infor.pop("TriggerName") change_infor = True if change_infor: if temp_trigger == eve_event_infor: trigger_status = False Operation(msg).warning() else: if self.update_event: self.trigger_upgrade_message( temp_trigger, eve_event_infor) eve_event["Properties"].pop( "Enable", eve_event["Properties"]) err = ScfClient(region).remove_trigger( eve_event, func_name, func_ns) if not err: Operation( "The trigger is being redeployed." ).warning() else: trigger_status = False err_msg = "The redeployment trigger failed. Please manually delete the trigger and redeploy." Operation(err_msg).warning() else: trigger_status = False self.trigger_upgrade_message( temp_trigger, eve_event_infor) break except Exception as e: print(e) pass # if temp_trigger in trigger_release[str(events[trigger]['Type']).lower()]: # trigger_status = False # Operation(msg).warning() if trigger_status == True: err = ScfClient(region).deploy_trigger(events[trigger], trigger, func_name, func_ns) if err is not None: hasError = err if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") if err.get_request_id(): Operation( "Deploy trigger '{name}' failure. Error: {e}. RequestId: {id}" .format(name=trigger, e=s, id=err.get_request_id())).warning() else: msg = "Deploy trigger '{name}' failure. Error: {e}.".format( name=trigger, e=s, ) Operation(msg).warning() Operation("Deploy trigger '{name}' success".format( name=trigger)).success()
def information_client(self, namespace, name): scf_client = ScfClient(region=self.region) result = scf_client.get_function(namespace=namespace, function_name=name) return result
def stat(period, name, region, starttime, endtime, metric): if name is None: raise InvalidEnvParameters("function name is unspecif") startTime = None endTime = None defaultMetrics = [ 'Invocation', 'Duration', 'Mem', 'Error', 'FunctionErrorPercentage', ] if not (period == 60 or period == 300): raise InvalidEnvParameters('period %s invalid. value is 60 or 300' % period) if region and region not in infor.REGIONS: raise ArgsException("The region must in %s." % (", ".join(infor.REGIONS))) namespaces = ScfClient(region).list_ns() if not namespaces: Operation("Region {r} not exist namespace".format(r=region)).warning() return flag = True for key, namespace in enumerate(namespaces): if flag == False: break functions = ScfClient(region).list_function(namespace['Name']) if functions: for k, func in enumerate(functions): if name == func.FunctionName: flag = False break if flag: raise InvalidEnvParameters('function %s not exist' % name) if starttime: try: startTime = datetime.datetime.strptime(starttime,'%Y-%m-%d %H:%M:%S') except Exception as e: raise InvalidEnvParameters(e) if endtime: if startTime == None: raise InvalidEnvParameters('starttime value unspecif') try: endTime = datetime.datetime.strptime(endtime,'%Y-%m-%d %H:%M:%S') except Exception as e: raise InvalidEnvParameters(e) if not startTime: startTime = datetime.datetime.now() + datetime.timedelta(hours=-1) if not endTime: endTime = datetime.datetime.now() if endTime <= startTime: raise InvalidEnvParameters('endtime cannot lt starttime') nowUnixTime = int(time.mktime(startTime.timetuple())) secDiff = nowUnixTime % period startTime = startTime + datetime.timedelta(seconds=-secDiff) metrics = [] if not metric: metrics = defaultMetrics else: tmpArr = metric.split(',') for k, m in enumerate(tmpArr): try: if metricTables[m]: metrics.append(m) except Exception as e: Operation("metric name '{name}' invalid.".format(name=m)).warning() if not len(metrics): return strStarTime = datetime.datetime.strftime(startTime, '%Y-%m-%d %H:%M:%S') strEndTime = datetime.datetime.strftime(endTime, '%Y-%m-%d %H:%M:%S') metricResp = [] columnsFmt = [] padding = [] monitorCli = MonitorClient(region, period) for k, val in enumerate(metrics): resp = monitorCli.get_data(name, strStarTime, strEndTime, val) if resp and resp.DataPoints: metricResp.append(resp) paddnum = len(metricTables[val]) + 4 padding.append(paddnum) fmt = ('{:>%d}') % (paddnum) columnsFmt.append(fmt.format(metricTables[val])) # reduce server concurrency time.sleep(0.1) columnsFmt = ['{: ^17}'.format('Time')] + columnsFmt print(' '.join(columnsFmt)) while (startTime <= endTime): strTime = datetime.datetime.strftime(startTime, '%y%m%d %H:%M:%S') timestamp = int(time.mktime(startTime.timetuple())) values = ['{: ^17}'.format(strTime)] for k, metric in enumerate(metricResp): length = len(metric.DataPoints[0].Timestamps) v = None paddingRight = '' for i in range(length): if timestamp == metric.DataPoints[0].Timestamps[i]: v = str(metric.DataPoints[0].Values[i]) break paddingFmt = ('{:>%d}') % (padding[k]) if not v: values.append(paddingFmt.format('0')) else: values.append(paddingFmt.format(v)) print(' '.join(values)) sys.stdout.flush() startTime = startTime + datetime.timedelta(seconds=period)
def _do_deploy_trigger(self, func, func_name, func_ns, region=None, trigger_release=None): proper = func.get(tsmacro.Properties, {}) events = proper.get(tsmacro.Events, {}) trigger_threads = [] for trigger in events: trigger_status = True msg = "Deploy %s trigger '%s' failure, this trigger has been created." % (events[trigger]['Type'], trigger) if trigger_release: try: event_type = str(events[trigger]['Type']).lower() temp_trigger = events[trigger].copy() if event_type == "timer": temp_trigger['TriggerName'] = trigger for eve_event in trigger_release[str(events[trigger]['Type']).lower()]: eve_event_infor = eve_event.copy() eve_event_infor.pop("TriggerDesc", eve_event_infor) change_infor = False tproperty = temp_trigger['Properties'] eproperty = eve_event['Properties'] if event_type == "timer": if temp_trigger['TriggerName'] == eve_event['TriggerName']: change_infor = True elif event_type == "apigw": if tproperty['ServiceId'] == eproperty['ServiceId'] and tproperty['StageName'] == eproperty[ 'StageName'] and tproperty['HttpMethod'] == eproperty['HttpMethod']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "ckafka": if tproperty['Name'] + "-" + eproperty['Topic'] == tproperty['Name'] + "-" + eproperty[ 'Topic']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "cmq": if tproperty['Name'] == eproperty['Name']: eve_event_infor.pop("TriggerName") change_infor = True elif event_type == "cos": if tproperty['Bucket'] == eproperty['Bucket'] and tproperty['Events'] == eproperty[ 'Events'] and tproperty['Filter'] == eproperty['Filter']: eve_event_infor.pop("TriggerName") change_infor = True if change_infor: if temp_trigger == eve_event_infor: trigger_status = False Operation(msg).warning() else: if self.update_event: self.trigger_upgrade_message(temp_trigger, eve_event_infor) eve_event["Properties"].pop("Enable", eve_event["Properties"]) err = ScfClient(region).remove_trigger(eve_event, func_name, func_ns) if not err: Operation("The trigger is being redeployed.").warning() else: trigger_status = False err_msg = "The redeployment trigger failed. Please manually delete the trigger and redeploy." Operation(err_msg).warning() else: trigger_status = False self.trigger_upgrade_message(temp_trigger, eve_event_infor) break except Exception as e: pass if trigger_status == True: # self.do_eve_trigger(region, events, trigger, func_name, func_ns, ) t = threading.Thread(target=self.do_eve_trigger, args=(region, events, trigger, func_name, func_ns,)) trigger_threads.append(t) t.start() for t in trigger_threads: t.join()
def _do_deploy_core(self, func, func_name, func_ns, region, forced, success_list, faild_list, skip_event=False): # check role exit try: role = func.get(tsmacro.Properties, {}).get(tsmacro.Role) if role: rolelist = list_scf_role(region) if rolelist == None: Operation("Get Role list error").warning() func[tsmacro.Properties][tsmacro.Role] = None elif role not in rolelist: Operation("%s not exists in remote scf role list" % (role)).warning() if len(rolelist): Operation("You can choose from %s " % (str(rolelist))).warning() func[tsmacro.Properties][tsmacro.Role] = None # check namespace exit, create namespace if self.namespace and self.namespace != func_ns: func_ns = self.namespace function_data = Function(region, func_ns, func_name, self.resources).get_function_trigger() trigger_release = None if function_data: now_runtime = function_data[0] trigger_release = function_data[1] if func['Properties']['Runtime'] != now_runtime: err_msg = "RUNTIME in YAML does not match RUNTIME on the RELEASE (release: %s)" % now_runtime echo( Operation("[x]", bg="red").style() + Operation(u' %s' % text(err_msg), fg="red").style(), file=get_text_stderr() ) exit(1) # raise DeployException(err_msg) rep = ScfClient(region).get_ns(func_ns) if not rep: Operation("{ns} not exists, create it now".format(ns=func_ns)).process() err = ScfClient(region).create_ns(func_ns) if err is not None: if sys.version_info[0] == 3: s = err.get_message() else: s = err.get_message().encode("UTF-8") err_msg = "Create namespace '{name}' failure. Error: {e}.".format(name=func_ns, e=s) echo( Operation("[x]", bg="red").style() + Operation(u' %s' % text(err_msg), fg="red").style(), file=get_text_stderr() ) exit(1) # raise NamespaceException() deploy_result = ScfClient(region).deploy_func(func, func_name, func_ns, forced) if deploy_result == 1: Operation("{ns} {name} already exists, update it now".format(ns=func_ns, name=func_name)).process() deploy_result = ScfClient(region).update_config(func, func_name, func_ns) if deploy_result == True: deploy_result = ScfClient(region).update_code(func, func_name, func_ns) deploy_result = 0 if deploy_result == True else deploy_result if deploy_result == 0: Operation("Deploy function '{name}' success".format(name=func_name)).success() if not skip_event: self._do_deploy_trigger(func, func_name, func_ns, region, trigger_release) success_list.append(func_name) return elif deploy_result == 2: faild_list.append(func_name) Operation( "%s %s: You can add -f to update the function when it already exists. Example : scf deploy -f" % ( func_ns, func_name)).warning() err_msg = "%s %s: The function already exists." % (func_ns, func_name) echo( Operation("[x]", bg="red").style() + Operation(u' %s' % text(err_msg), fg="red").style(), file=get_text_stderr() ) exit(1) # raise CloudAPIException("The function already exists.") if deploy_result != None: faild_list.append(func_name) err = deploy_result s = err.get_message() if sys.version_info[0] == 2 and isinstance(s, str): s = s.encode("utf8") err_msg = u"Deploy function '{name}' failure, {e}.".format(name=func_name, e=s) if err.get_request_id(): err_msg += (u" RequestId: {}".format(err.get_request_id())) echo( Operation("[x]", bg="red").style() + Operation(u' %s' % text(err_msg), fg="red").style(), file=get_text_stderr() ) exit(1) # raise CloudAPIException(err_msg) except Exception as e: faild_list.append(func_name) echo( Operation("[x]", bg="red").style() + Operation(u' %s' % text(str(e)), fg="red").style(), file=get_text_stderr() ) exit(1)
def get_information(self): scf_client = ScfClient(region=self.region) result = scf_client.get_function(namespace=self.namespace, function_name=self.function) return result
def get_information(self): scf_client = ScfClient(region=self.region) result = scf_client.get_function(namespace=self.namespace, function_name=self.function) if result: self.format_information(json.loads(result))