UNPKG

yinxing

Version:
547 lines (467 loc) 13.3 kB
//https://cloud.tencent.com/document/api/583/17235 const tencentcloud=require('tencentcloud-sdk-nodejs') const R=require('ramda') const fs=require('mz/fs') const moment=require('moment') const path=require('path') const {read_base64}=require('../io') const cos=require("../cos") const now=()=>Math.round(moment.now()/1000) const { AccessInfo, Code, CopyFunctionRequest, CopyFunctionResponse, CreateFunctionRequest, CreateFunctionResponse, CreateNamespaceRequest, CreateNamespaceResponse, CreateTriggerRequest, CreateTriggerResponse, DeleteFunctionRequest, DeleteFunctionResponse, DeleteNamespaceRequest, DeleteNamespaceResponse, DeleteTriggerRequest, DeleteTriggerResponse, EipOutConfig, Environment, Filter, //Function, FunctionLog, FunctionVersion, GetFunctionAddressRequest, GetFunctionAddressResponse, GetFunctionLogsRequest, GetFunctionLogsResponse, GetFunctionRequest, GetFunctionResponse, InvokeRequest, InvokeResponse, ListFunctionsRequest, ListFunctionsResponse, ListNamespacesRequest, ListNamespacesResponse, ListVersionByFunctionRequest, ListVersionByFunctionResponse, LogFilter, LogSearchContext, Namespace, PublishVersionRequest, PublishVersionResponse, Result, Tag, Trigger, UpdateFunctionCodeRequest, UpdateFunctionCodeResponse, UpdateFunctionConfigurationRequest, UpdateFunctionConfigurationResponse, UpdateNamespaceRequest, UpdateNamespaceResponse, Variable, VpcConfig }=tencentcloud.scf.v20180416.Models const { CONFIG_FILE="../config.toml", SecretId, SecretKey, Region='ap-hongkong', Bucket, Prefix, maxFileSize, CodeSource, //cos... COS_HOST="https://ttt-1252957949.cos.ap-hongkong.myqcloud.com", CosBucketName="ttt-1252957949", CosBucketRegion="ap-hongkong", CosObjectName="", TempCosObjectName="", version="", }=process.env const { para, format_kv, }=require('../fp') const { json2env, add_vars, }=require('../fp/scf') const { conn, create_req, }=require("../qcloud/v3") const { read_toml, read_toml1, }=require("../io/toml") const { parse_toml_configs, }=require("./read_config") //https://github.com/tc39/proposal-top-level-await //(async (CONFIG_FILE="/tmp/config.toml")=>{ // let configs=await read_toml(CONFIG_FILE) // let t=parse_toml_configs(configs) // NS=t.NS // FN_CONFIG=t.FN_CONFIG // GIT=t.FN_CONFIG //})() const configs=read_toml1(CONFIG_FILE) const configs_parsed=parse_toml_configs(configs) const verify_size=(z="")=>{ if (z.length > 20*Math.pow(1024,2)){ throw "<20m" } } const { FN, TMP_DIR, FN_ENV, NS, FN_CONFIG, GIT, fn_zip, fn_detail, }=configs_parsed //------------------------------------------------------------------------------------ //https://cloud.tencent.com/document/api/583/18580 //'{"Variables":[{"Key":"k1","Value":"v1"},{"Key":"k2","Value":"v2"}]}' // {RequestId: '1856d711-26b9-4166-94dd-744cdf3434d3'} //-------------------------------------------env-------------------------------------------------------- const set_env=async (c,config={FunctionName:"hello"},d={})=>{ let env=add_vars(d,FN_CONFIG.Environment) let d1={ ...FN_CONFIG, Environment:env, ...config, } let req=create_req(UpdateFunctionConfigurationRequest,d1) let r=await c._UpdateFunctionConfiguration(req) let {FunctionName}=config let r1=await c._GetFunction({FunctionName}) console.log(r) console.log(r1) return r1 } const set_env_yaml=(c,file_name='template.yaml')=>{ const {read_env}=require("./env") let {name,props,Timeout}=read_env(file_name) let vars=props.Environment.Variables let e=add_vars(vars,FN_CONFIG.Environment) let d1={ ...FN_CONFIG, ...props, FunctionName:name, Timeout, Environment:e, } let req=create_req(UpdateFunctionConfigurationRequest,d1) console.log(req) return c._UpdateFunctionConfiguration(req) } //-------------------------------------------fn-------------------------------------------------------- const list_fn=async (d={})=>{ let c=conn() return c._ListFunctions(d) } const copy_fn=async (d={})=>{ let c=conn() let req=create_req(CopyFunctionRequest,d) return c._CopyFunction(req) } const publish_fn=(config={FunctionName:"hello",Description:""})=>{ let c=conn() let req=create_req(PublishVersionRequest,FN_CONFIG,config) return c._PublishVersion(req) } const del_fn=(config={FunctionName:"hello",Namespace:"test"})=>{ let c=conn() let req=create_req(DeleteFunctionRequest,config) return c._DeleteFunction(req) } //--------------------------------------ns------------------------------------------------ const init_ns=async (ns=[])=>{ if (R.isEmpty(ns)){ return [] } let c=conn() //let req=await para(c._DeleteNamespace,ns) let req=await para(c._CreateNamespace,ns) let ns_list1=await c._ListNamespaces() console.log(req) console.log(ns_list1) return ns_list1 } const check_ns=async (c,ns1,ns2)=>{ let {Namespaces,TotalCount}=await c._ListNamespaces({}) if (TotalCount<1||Namespaces.filter(x=>x.Namespace==ns1)==0 ){ throw "no source ns" }else if(Namespaces.filter(x=>x.Namespace==ns2)==0){ return c._CreateNamespace({ "Namespace": ns2, "Description":ns2, }) } } const copy_ns=async (ns1,ns2,{Region}=process.env)=>{ let c=conn() await check_ns(c,ns1,ns2) let r=await c._ListFunctions({"Namespace":ns1}) let d=r.Functions.map(x=>({ "FunctionName": x.FunctionName, "NewFunctionName": x.FunctionName, "Namespace": ns1, "TargetNamespace": ns2, "Description": x.Description, "TargetRegion": Region, "Override": "TRUE", "CopyConfiguration": "TRUE", })) return para(copy_fn,d) } const test_copy_fn=()=>{ let cfg={ "FunctionName": "pan-php", "NewFunctionName": "pan-php-tttt", "Namespace": "default", "TargetNamespace": "test1", "Description": "ddd", "TargetRegion": Region, "Override": "TRUE", "CopyConfiguration": "TRUE", } return copy_fn(cfg) } //--------------------------------------ns------------------------------------------------ //"/tmp/user.zip" -> https://....com/server/user_123.zip const upload=async (file="/tmp/user.zip")=>{ const file_name=path.basename(file) let {name,ext}=path.parse(file) let file_name1=[name,version].join("_")+ext let Key=path.resolve("/server/",file_name1) console.log('--------------begin upload zip-------------\n') const t0=now() let up=await cos.slice_upload(file,Key) const t1=now() console.log('----------------------------------\n') console.log(up) console.log(t1-t0) console.log('--------------finish upload zip-------------\n') return up } const cos_create_fn=async ({ FunctionName,ZipFile,env={}, ...config})=>{ if(!FunctionName) { throw "no fn name" } let c=conn() let k=path.resolve("/server/",FunctionName+"_"+version+".zip") // http://ttt-1252957949.cos.ap-hongkong.myqcloud.com/server/user_1581043843.zip let code=create_req(Code,{ CosBucketName, CosBucketRegion, CosObjectName:k, }) let d={ ...FN_CONFIG, CodeSource:'Cos', //Type:"HTTP", //Event Code:code, ...config, FunctionName, } console.log(d) let d1= R.pickAll(["FunctionName","Description","Namespace"])(d) let r=await c._CreateFunction(create_req(CreateFunctionRequest,d)) let r1=await set_env(c,d,env) let r3=await c._PublishVersion(create_req(PublishVersionRequest,d1)) let r2=await c._GetFunction({FunctionName}) console.log('----------create fn------------------------\n') console.log(r) console.log('----------set env------------------------\n') console.log(r1) console.log('----------get fn------------------------\n') console.log(r2) console.log('----------publish------------------------\n') console.log(r3) console.log('-----------------------------------------\n') return r2 } //ZipFile 包含函数代码文件及其依赖项的 zip 格式文件, //使用该接口时要求将 zip 文件的内容转成 base64 编码 //最大支持20M!!! //https://cloud.tencent.com/document/api/583/18586 const zip_create_fn=async ({ FunctionName, ZipFile , env={}, ...config})=>{ if(!FunctionName) { throw "no fn name" } let c=conn() let z=await read_base64(ZipFile) verify_size(z) let code=create_req(Code,{ZipFile:z}) let d={ ...FN_CONFIG, CodeSource:"ZipFile", //Type:"HTTP", //Event Code:code, ...config, FunctionName, } console.log(d) let d1= R.pickAll(["FunctionName","Description","Namespace"])(d) let req=create_req(CreateFunctionRequest,d) let r=await c._CreateFunction(req) let r1=await set_env(c,d,env) let r2=await c._GetFunction({FunctionName}) let r3=await c._PublishVersion(create_req(PublishVersionRequest,d1)) console.log(r) console.log(r1) console.log(r2) console.log(r3) return r2 } const git_create_fn=async ({FunctionName,env={},git=GIT,...config})=>{ if(!FunctionName) { throw "no fn name" } let c=conn() let code=create_req(Code,git) let d={ ...FN_CONFIG, CodeSource:"Git", //Type:"HTTP", //Event Code:code, ...config, FunctionName, } let d1= R.pickAll(["FunctionName","Description","Namespace"])(d) let req=create_req(CreateFunctionRequest,d) let r=await c._CreateFunction(req) let r1=await set_env(c,d,env) let r2=await c._GetFunction({FunctionName}) let r3=await c._PublishVersion(create_req(PublishVersionRequest,d1)) console.log(r) console.log(r1) console.log(r2) console.log(r3) return r2 } const cos_update_fn=async ({ FunctionName, Description="", Namespace="test", ZipFile, ...config })=>{ let c=conn() let k=path.resolve("/server/",FunctionName+"_"+version+".zip") let code=create_req(Code,{ CosBucketName, CosObjectName:k, CosBucketRegion, }) let d={ ...FN_CONFIG, FunctionName, Description, Namespace, // CosBucketName: null, // CosObjectName: null, // CosBucketRegion: null, // EnvId: null, // Publish: "TRUE", ZipFile, Code: code, CodeSource:'ZipFile', ...config, } console.log('----------update fn------------------------\n') let r1=await c._UpdateFunctionCode(create_req(PublishVersionRequest,d)) console.log('----------finish update fn------------------\n') //let d1= R.pickAll(["FunctionName","Description","Namespace"])(d) return r1 } //ZipFile 包含函数代码文件及其依赖项的 zip 格式文件, //使用该接口时要求将 zip 文件的内容转成 base64 编码 //最大支持20M!!! //https://cloud.tencent.com/document/api/583/18581 const zip_update_fn=async ({ FunctionName, Description="", Namespace="test", ZipFile, ...config })=>{ let c=conn() let z=await read_base64(ZipFile) verify_size(z) let code=create_req(Code,{ZipFile:z}) let d={ ...FN_CONFIG, FunctionName, Description, Namespace, // CosBucketName: null, // CosObjectName: null, // CosBucketRegion: null, // EnvId: null, // Publish: "TRUE", ZipFile , Code: code, CodeSource:'ZipFile', ...config, } let req=create_req(PublishVersionRequest,d) return c._UpdateFunctionCode(req) } const git_update_fn=({FunctionName,...config})=>{ let c=conn() let code=create_req(Code,{ ...GIT, ...config, // GitUrl, // GitUserName, // GitPassword, // GitPasswordSecret, // GitBranch, // GitDirectory, // GitCommitId, // GitUserNameSecret }) let {Namespace}=FN_CONFIG let d={ Namespace, FunctionName, Description, // ...FN_CONFIG, // Namespace: null, // CosBucketName: null, // CosObjectName: null, // CosBucketRegion: null, // EnvId: null, // Publish: "TRUE", // ZipFile: file_name, // Code: code, // CodeSource:"Git", } let req=create_req(PublishVersionRequest,d) return c._UpdateFunctionCode(req) } module.exports={ now, set_env, set_env_yaml, list_fn, del_fn, copy_fn, publish_fn, zip_create_fn, zip_update_fn, upload, cos_create_fn, cos_update_fn, git_create_fn, git_update_fn, init_ns, copy_ns, configs, configs_parsed, }