Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
    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")
Exemplo n.º 3
0
    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))
Exemplo n.º 4
0
    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")
Exemplo n.º 5
0
 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()
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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()
Exemplo n.º 9
0
 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")
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
 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()
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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()
Exemplo n.º 14
0
    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()
Exemplo n.º 15
0
    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()
Exemplo n.º 16
0
    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)
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
    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()
Exemplo n.º 19
0
 def information_client(self, namespace, name):
     scf_client = ScfClient(region=self.region)
     result = scf_client.get_function(namespace=namespace,
                                      function_name=name)
     return result
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
    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()
Exemplo n.º 22
0
    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)
Exemplo n.º 23
0
 def get_information(self):
     scf_client = ScfClient(region=self.region)
     result = scf_client.get_function(namespace=self.namespace, function_name=self.function)
     return result
Exemplo n.º 24
0
 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))