| @@ -0,0 +1,128 @@ | |||||
| package pod | |||||
| import ( | |||||
| "context" | |||||
| "sync" | |||||
| "gitlink.org.cn/JCCE/PCM/adaptor/pod_adaptor/service/poder" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| "github.com/golang/glog" | |||||
| "github.com/pkg/errors" | |||||
| ) | |||||
| //ListDetail returns the detail of pod instances | |||||
| func ListDetail(ctx context.Context, req *pbpod.ListDetailReq) (*pbpod.ListDetailResp, error) { | |||||
| var ( | |||||
| pod poder.Poder | |||||
| ) | |||||
| tenanters, err := tenanter.GetTenanters(req.Provider) | |||||
| if err != nil { | |||||
| return nil, errors.WithMessage(err, "getTenanters error") | |||||
| } | |||||
| region, err := tenanter.NewRegion(req.Provider, req.RegionId) | |||||
| if err != nil { | |||||
| return nil, errors.WithMessagef(err, "provider %v regionId %v", req.Provider, req.RegionId) | |||||
| } | |||||
| for _, tenanter := range tenanters { | |||||
| if req.AccountName == "" || tenanter.AccountName() == req.AccountName { | |||||
| if pod, err = poder.NewPodClient(req.Provider, region, tenanter); err != nil { | |||||
| return nil, errors.WithMessage(err, "NewPodClient error") | |||||
| } | |||||
| break | |||||
| } | |||||
| } | |||||
| return pod.ListDetail(ctx, req) | |||||
| } | |||||
| //List returns the list of pod instances | |||||
| func List(ctx context.Context, req *pbpod.ListReq) (*pbpod.ListResp, error) { | |||||
| var ( | |||||
| wg sync.WaitGroup | |||||
| mutex sync.Mutex | |||||
| podes []*pbpod.PodInstance | |||||
| ) | |||||
| tenanters, err := tenanter.GetTenanters(req.Provider) | |||||
| if err != nil { | |||||
| return nil, errors.WithMessage(err, "getTenanters error") | |||||
| } | |||||
| regions := tenanter.GetAllRegionIds(req.Provider) | |||||
| wg.Add(len(tenanters) * len(regions)) | |||||
| for _, t := range tenanters { | |||||
| for _, region := range regions { | |||||
| go func(tenant tenanter.Tenanter, region tenanter.Region) { | |||||
| defer wg.Done() | |||||
| pod, err := poder.NewPodClient(req.Provider, region, tenant) | |||||
| if err != nil { | |||||
| glog.Errorf("New Pod Client error %v", err) | |||||
| return | |||||
| } | |||||
| request := &pbpod.ListDetailReq{ | |||||
| Provider: req.Provider, | |||||
| AccountName: tenant.AccountName(), | |||||
| RegionId: region.GetId(), | |||||
| PageNumber: 1, | |||||
| PageSize: 20, | |||||
| NextToken: "", | |||||
| } | |||||
| for { | |||||
| resp, err := pod.ListDetail(ctx, request) | |||||
| if err != nil { | |||||
| glog.Errorf("ListDetail error %v", err) | |||||
| return | |||||
| } | |||||
| mutex.Lock() | |||||
| podes = append(podes, resp.Pods...) | |||||
| mutex.Unlock() | |||||
| if resp.Finished { | |||||
| break | |||||
| } | |||||
| request.PageNumber, request.PageSize, request.NextToken = resp.PageNumber, resp.PageSize, resp.NextToken | |||||
| } | |||||
| }(t, region) | |||||
| } | |||||
| } | |||||
| wg.Wait() | |||||
| return &pbpod.ListResp{Pods: podes}, nil | |||||
| } | |||||
| // ListAll returns all pod instances | |||||
| func ListAll(ctx context.Context) (*pbpod.ListResp, error) { | |||||
| var ( | |||||
| wg sync.WaitGroup | |||||
| mutex sync.Mutex | |||||
| podes []*pbpod.PodInstance | |||||
| ) | |||||
| wg.Add(len(pbtenant.CloudProvider_name)) | |||||
| for k := range pbtenant.CloudProvider_name { | |||||
| go func(provider int32) { | |||||
| defer wg.Done() | |||||
| resp, err := List(ctx, &pbpod.ListReq{Provider: pbtenant.CloudProvider(provider)}) | |||||
| if err != nil { | |||||
| glog.Errorf("List error %v", err) | |||||
| return | |||||
| } | |||||
| mutex.Lock() | |||||
| podes = append(podes, resp.Pods...) | |||||
| mutex.Unlock() | |||||
| }(k) | |||||
| } | |||||
| wg.Wait() | |||||
| return &pbpod.ListResp{Pods: podes}, nil | |||||
| } | |||||
| @@ -0,0 +1,83 @@ | |||||
| package pod | |||||
| import ( | |||||
| "context" | |||||
| "testing" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| ) | |||||
| func TestListDetail(t *testing.T) { | |||||
| type args struct { | |||||
| req *pbpod.ListDetailReq | |||||
| } | |||||
| tests := []struct { | |||||
| name string | |||||
| args args | |||||
| wantErr bool | |||||
| }{ | |||||
| {name: "ali", args: args{req: &pbpod.ListDetailReq{Provider: pbtenant.CloudProvider_ali, RegionId: int32(pbtenant.AliRegionId_ali_cn_hangzhou), PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| {name: "tencent", args: args{req: &pbpod.ListDetailReq{Provider: pbtenant.CloudProvider_tencent, RegionId: int32(pbtenant.TencentRegionId_tc_ap_beijing), PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| {name: "aws", args: args{req: &pbpod.ListDetailReq{Provider: pbtenant.CloudProvider_aws, RegionId: int32(pbtenant.AwsRegionId_aws_us_east_2), PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| } | |||||
| for _, tt := range tests { | |||||
| t.Run(tt.name, func(t *testing.T) { | |||||
| got, err := ListDetail(context.Background(), tt.args.req) | |||||
| if (err != nil) != tt.wantErr { | |||||
| t.Errorf("ListDetail() error = %+v, wantErr %v", err, tt.wantErr) | |||||
| return | |||||
| } | |||||
| t.Log(got) | |||||
| }) | |||||
| } | |||||
| } | |||||
| func TestList(t *testing.T) { | |||||
| type args struct { | |||||
| req *pbpod.ListReq | |||||
| } | |||||
| tests := []struct { | |||||
| name string | |||||
| args args | |||||
| wantErr bool | |||||
| }{ | |||||
| {name: "ali", args: args{req: &pbpod.ListReq{Provider: pbtenant.CloudProvider_ali}}, wantErr: false}, | |||||
| {name: "tencent", args: args{req: &pbpod.ListReq{Provider: pbtenant.CloudProvider_tencent}}, wantErr: false}, | |||||
| {name: "huawei", args: args{req: &pbpod.ListReq{Provider: pbtenant.CloudProvider_huawei}}, wantErr: false}, | |||||
| {name: "aws", args: args{req: &pbpod.ListReq{Provider: pbtenant.CloudProvider_aws}}, wantErr: false}, | |||||
| } | |||||
| for _, tt := range tests { | |||||
| t.Run(tt.name, func(t *testing.T) { | |||||
| got, err := List(context.Background(), tt.args.req) | |||||
| if (err != nil) != tt.wantErr { | |||||
| t.Errorf("List() error = %+v, wantErr %v", err, tt.wantErr) | |||||
| return | |||||
| } | |||||
| t.Log(got) | |||||
| }) | |||||
| } | |||||
| } | |||||
| func TestListAll(t *testing.T) { | |||||
| type args struct { | |||||
| req *pbpod.ListReq | |||||
| } | |||||
| tests := []struct { | |||||
| name string | |||||
| args args | |||||
| wantErr bool | |||||
| }{ | |||||
| {name: "all", args: args{req: &pbpod.ListReq{}}, wantErr: false}, | |||||
| } | |||||
| for _, tt := range tests { | |||||
| t.Run(tt.name, func(t *testing.T) { | |||||
| got, err := ListAll(context.Background()) | |||||
| if (err != nil) != tt.wantErr { | |||||
| t.Errorf("ListAll() error = %+v, wantErr %v", err, tt.wantErr) | |||||
| return | |||||
| } | |||||
| t.Log(got) | |||||
| }) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,33 @@ | |||||
| package pod | |||||
| import ( | |||||
| "os" | |||||
| "testing" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| ) | |||||
| var ( | |||||
| aliTenant, tcTenant, hwTenant, awsTenant []tenanter.Tenanter | |||||
| ) | |||||
| func TestMain(m *testing.M) { | |||||
| err := tenanter.LoadCloudConfigs("../../../../configs/config.yaml") | |||||
| if err != nil { | |||||
| panic(err) | |||||
| } | |||||
| if aliTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_ali); err != nil { | |||||
| panic("get aliTenant failed") | |||||
| } | |||||
| if tcTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_tencent); err != nil { | |||||
| panic("get tcTenant failed") | |||||
| } | |||||
| if hwTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_huawei); err != nil { | |||||
| panic("get hwTenant failed") | |||||
| } | |||||
| //if awsTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_aws); err != nil { | |||||
| // panic("get awsTenant failed") | |||||
| //} | |||||
| os.Exit(m.Run()) | |||||
| } | |||||
| @@ -0,0 +1,95 @@ | |||||
| package poder | |||||
| import ( | |||||
| "context" | |||||
| "sync" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" | |||||
| alipod "github.com/aliyun/alibaba-cloud-sdk-go/services/eci" | |||||
| "github.com/pkg/errors" | |||||
| ) | |||||
| var aliClientMutex sync.Mutex | |||||
| type AliPod struct { | |||||
| cli *alipod.Client | |||||
| region tenanter.Region | |||||
| tenanter tenanter.Tenanter | |||||
| } | |||||
| func newAliPodClient(region tenanter.Region, tenant tenanter.Tenanter) (Poder, error) { | |||||
| var ( | |||||
| client *alipod.Client | |||||
| err error | |||||
| ) | |||||
| switch t := tenant.(type) { | |||||
| case *tenanter.AccessKeyTenant: | |||||
| // 阿里云的sdk有一个 map 的并发问题,go test 加上-race 能检测出来,所以这里加一个锁 | |||||
| aliClientMutex.Lock() | |||||
| client, err = alipod.NewClientWithAccessKey(region.GetName(), t.GetId(), t.GetSecret()) | |||||
| aliClientMutex.Unlock() | |||||
| default: | |||||
| } | |||||
| if err != nil { | |||||
| return nil, errors.Wrap(err, "init ali pod client error") | |||||
| } | |||||
| return &AliPod{ | |||||
| cli: client, | |||||
| region: region, | |||||
| tenanter: tenant, | |||||
| }, nil | |||||
| } | |||||
| func (pod *AliPod) ListDetail(ctx context.Context, req *pbpod.ListDetailReq) (*pbpod.ListDetailResp, error) { | |||||
| request := alipod.CreateDescribeContainerGroupsRequest() | |||||
| request.Limit = requests.NewInteger(int(req.PageSize)) | |||||
| request.RegionId = pod.region.GetName() | |||||
| request.NextToken = req.NextToken | |||||
| resp, err := pod.cli.DescribeContainerGroups(request) | |||||
| if err != nil { | |||||
| return nil, errors.Wrap(err, "Aliyun ListDetail error") | |||||
| } | |||||
| var podes = make([]*pbpod.PodInstance, len(resp.ContainerGroups)) | |||||
| for k, v := range resp.ContainerGroups { | |||||
| podes[k] = &pbpod.PodInstance{ | |||||
| Provider: pbtenant.CloudProvider_ali, | |||||
| AccountName: pod.tenanter.AccountName(), | |||||
| InstanceId: v.ContainerGroupId, | |||||
| InstanceName: v.ContainerGroupName, | |||||
| RegionName: pod.region.GetName(), | |||||
| PublicIps: v.InternetIp, | |||||
| InstanceType: v.InstanceType, | |||||
| Cpu: int32(v.Cpu), | |||||
| Memory: int32(v.Memory), | |||||
| //Description: v.Description, | |||||
| Status: v.Status, | |||||
| CreationTime: v.CreationTime, | |||||
| ExpireTime: v.ExpiredTime, | |||||
| //InnerIps: v.IntranetIp, | |||||
| VpcId: v.VpcId, | |||||
| //SecurityGroupId: v.SecurityGroupId | |||||
| } | |||||
| } | |||||
| isFinished := false | |||||
| if len(podes) < int(req.PageSize) { | |||||
| isFinished = true | |||||
| } | |||||
| return &pbpod.ListDetailResp{ | |||||
| Pods: podes, | |||||
| Finished: isFinished, | |||||
| PageNumber: req.PageNumber + 1, | |||||
| PageSize: req.PageSize, | |||||
| NextToken: resp.NextToken, | |||||
| RequestId: resp.RequestId, | |||||
| }, nil | |||||
| } | |||||
| @@ -0,0 +1,33 @@ | |||||
| package poder | |||||
| import ( | |||||
| "os" | |||||
| "testing" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| ) | |||||
| var ( | |||||
| aliTenant, tcTenant, hwTenant, awsTenant []tenanter.Tenanter | |||||
| ) | |||||
| func TestMain(m *testing.M) { | |||||
| err := tenanter.LoadCloudConfigs("../../../config.yaml") | |||||
| if err != nil { | |||||
| panic(err) | |||||
| } | |||||
| if aliTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_ali); err != nil { | |||||
| panic("get aliTenant failed") | |||||
| } | |||||
| if tcTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_tencent); err != nil { | |||||
| panic("get tcTenant failed") | |||||
| } | |||||
| if hwTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_huawei); err != nil { | |||||
| panic("get hwTenant failed") | |||||
| } | |||||
| if awsTenant, err = tenanter.GetTenanters(pbtenant.CloudProvider_aws); err != nil { | |||||
| panic("get awsTenant failed") | |||||
| } | |||||
| os.Exit(m.Run()) | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package poder | |||||
| import ( | |||||
| "context" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| "github.com/golang/glog" | |||||
| "github.com/pkg/errors" | |||||
| ) | |||||
| var ( | |||||
| ErrPodListNotSupported = errors.New("cloud not supported pod list") | |||||
| ErrPoderPanic = errors.New("pod init panic") | |||||
| ) | |||||
| type Poder interface { | |||||
| ListDetail(ctx context.Context, req *pbpod.ListDetailReq) (resp *pbpod.ListDetailResp, err error) | |||||
| } | |||||
| func NewPodClient(provider pbtenant.CloudProvider, region tenanter.Region, tenant tenanter.Tenanter) (poder Poder, err error) { | |||||
| // 部分sdk会在内部panic | |||||
| defer func() { | |||||
| if err1 := recover(); err1 != nil { | |||||
| glog.Errorf("NewPodClient panic %v", err1) | |||||
| err = errors.WithMessagef(ErrPoderPanic, "%v", err1) | |||||
| } | |||||
| }() | |||||
| switch provider { | |||||
| case pbtenant.CloudProvider_ali: | |||||
| return newAliPodClient(region, tenant) | |||||
| //case pbtenant.CloudProvider_tencent: | |||||
| // return newTencentPodClient(region, tenant) | |||||
| //case pbtenant.CloudProvider_huawei: | |||||
| // return newHuaweiPodClient(region, tenant) | |||||
| //TODO aws | |||||
| //case pbtenant.CloudProvider_aws: | |||||
| // return newAwsPodClient(region, tenant) | |||||
| } | |||||
| err = errors.WithMessagef(ErrPodListNotSupported, "cloud provider %v region %v", provider, region) | |||||
| return | |||||
| } | |||||
| @@ -0,0 +1,70 @@ | |||||
| package poder | |||||
| import ( | |||||
| "context" | |||||
| "testing" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | |||||
| ) | |||||
| func TestEcser_ListDetail(t *testing.T) { | |||||
| region, _ := tenanter.NewRegion(pbtenant.CloudProvider_ali, int32(pbtenant.AliRegionId_ali_cn_hangzhou)) | |||||
| ali, _ := NewEcsClient(pbtenant.CloudProvider_ali, region, aliTenant[0]) | |||||
| aliFailed, _ := NewEcsClient(pbtenant.CloudProvider_ali, region, tenanter.NewTenantWithAccessKey("empty", "", "")) | |||||
| region, _ = tenanter.NewRegion(pbtenant.CloudProvider_tencent, int32(pbtenant.TencentRegionId_tc_ap_beijing)) | |||||
| tc, _ := NewEcsClient(pbtenant.CloudProvider_tencent, region, tcTenant[0]) | |||||
| tcFailed, _ := NewEcsClient(pbtenant.CloudProvider_tencent, region, tenanter.NewTenantWithAccessKey("empty", "", "")) | |||||
| region, _ = tenanter.NewRegion(pbtenant.CloudProvider_huawei, int32(pbtenant.HuaweiRegionId_hw_cn_southwest_2)) | |||||
| hw, _ := NewEcsClient(pbtenant.CloudProvider_huawei, region, hwTenant[0]) | |||||
| // hwFailed, _ := newHuaweiEcsClient(int32(pbtenant.HuaweiRegionId_hw_cn_north_1), tenanter.NewTenantWithAccessKey("empty", "", "", "")) | |||||
| region, _ = tenanter.NewRegion(pbtenant.CloudProvider_aws, int32(pbtenant.AwsRegionId_aws_us_east_2)) | |||||
| aws, _ := NewEcsClient(pbtenant.CloudProvider_aws, region, awsTenant[0]) | |||||
| // google, _ := NewGoogleEcsClient(tenanter.NewTenantWithAccessKey("", "")) | |||||
| type args struct { | |||||
| req *pbecs.ListDetailReq | |||||
| } | |||||
| tests := []struct { | |||||
| name string | |||||
| fields Ecser | |||||
| args args | |||||
| wantErr bool | |||||
| }{ | |||||
| {name: "ali wrong cli", fields: aliFailed, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 1}}, wantErr: true}, | |||||
| {name: "ali wrong page number", fields: ali, args: args{&pbecs.ListDetailReq{PageNumber: 0, PageSize: 1}}, wantErr: true}, | |||||
| {name: "ali wrong page size", fields: ali, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 0}}, wantErr: true}, | |||||
| {name: "ali right cli", fields: ali, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| {name: "tc wrong cli", fields: tcFailed, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 1}}, wantErr: true}, | |||||
| {name: "tc wrong page number", fields: tc, args: args{&pbecs.ListDetailReq{PageNumber: 0, PageSize: 1}}, wantErr: true}, | |||||
| {name: "tc wrong page size", fields: tc, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 0}}, wantErr: true}, | |||||
| {name: "tc right cli", fields: tc, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| // {name: "hw wrong cli", fields: hwFailed, args: args{pageNumber: 1, pageSize: 1}, wantErr: true}, | |||||
| {name: "hw right cli", fields: hw, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| {name: "aws right cli", fields: aws, args: args{&pbecs.ListDetailReq{PageNumber: 1, PageSize: 10}}, wantErr: false}, | |||||
| // {name: "right cli", fields: google, args: args{pageNumber: 1, pageSize: 10}, wantErr: false}, | |||||
| } | |||||
| for _, tt := range tests { | |||||
| t.Run(tt.name, func(t *testing.T) { | |||||
| resp, err := tt.fields.ListDetail(context.Background(), tt.args.req) | |||||
| if (err != nil) != tt.wantErr { | |||||
| t.Errorf("ListDetail() error = %+v, wantErr %v", err, tt.wantErr) | |||||
| return | |||||
| } | |||||
| t.Logf("%+v", err) | |||||
| if err == nil { | |||||
| t.Log(resp) | |||||
| } | |||||
| }) | |||||
| } | |||||
| } | |||||
| @@ -2,16 +2,18 @@ package ecs | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "sync" | |||||
| "gitlink.org.cn/JCCE/PCM/adaptor/vm_adaptor/service/ecser" | "gitlink.org.cn/JCCE/PCM/adaptor/vm_adaptor/service/ecser" | ||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | "gitlink.org.cn/JCCE/PCM/common/tenanter" | ||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | ||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbtenant" | ||||
| "sync" | |||||
| "github.com/golang/glog" | "github.com/golang/glog" | ||||
| "github.com/pkg/errors" | "github.com/pkg/errors" | ||||
| ) | ) | ||||
| //ListDetail returns the detail of ecs instances | |||||
| func ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) { | func ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) { | ||||
| var ( | var ( | ||||
| ecs ecser.Ecser | ecs ecser.Ecser | ||||
| @@ -39,6 +41,7 @@ func ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetai | |||||
| return ecs.ListDetail(ctx, req) | return ecs.ListDetail(ctx, req) | ||||
| } | } | ||||
| //List returns the list of ecs instances | |||||
| func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | ||||
| var ( | var ( | ||||
| wg sync.WaitGroup | wg sync.WaitGroup | ||||
| @@ -87,7 +90,6 @@ func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | |||||
| request.PageNumber, request.PageSize, request.NextToken = resp.PageNumber, resp.PageSize, resp.NextToken | request.PageNumber, request.PageSize, request.NextToken = resp.PageNumber, resp.PageSize, resp.NextToken | ||||
| } | } | ||||
| }(t, region) | }(t, region) | ||||
| } | } | ||||
| } | } | ||||
| wg.Wait() | wg.Wait() | ||||
| @@ -95,6 +97,7 @@ func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | |||||
| return &pbecs.ListResp{Ecses: ecses}, nil | return &pbecs.ListResp{Ecses: ecses}, nil | ||||
| } | } | ||||
| // ListAll returns all ecs instances | |||||
| func ListAll(ctx context.Context) (*pbecs.ListResp, error) { | func ListAll(ctx context.Context) (*pbecs.ListResp, error) { | ||||
| var ( | var ( | ||||
| wg sync.WaitGroup | wg sync.WaitGroup | ||||
| @@ -2,6 +2,9 @@ package server | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/demo" | "gitlink.org.cn/JCCE/PCM/lan_trans/idl/demo" | ||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | ||||
| ) | ) | ||||
| @@ -10,6 +13,7 @@ type Server struct { | |||||
| // 使用unsafe可以强制让编译器检查是否实现了相关方法 | // 使用unsafe可以强制让编译器检查是否实现了相关方法 | ||||
| demo.UnsafeDemoServiceServer | demo.UnsafeDemoServiceServer | ||||
| pbecs.UnsafeEcsServiceServer | pbecs.UnsafeEcsServiceServer | ||||
| pbpod.UnimplementedPodServiceServer | |||||
| } | } | ||||
| func (s *Server) Echo(ctx context.Context, req *demo.StringMessage) (*demo.StringMessage, error) { | func (s *Server) Echo(ctx context.Context, req *demo.StringMessage) (*demo.StringMessage, error) { | ||||
| @@ -2,6 +2,7 @@ package server | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "gitlink.org.cn/JCCE/PCM/adaptor/vm_adaptor/server/ecs" | "gitlink.org.cn/JCCE/PCM/adaptor/vm_adaptor/server/ecs" | ||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | ||||
| @@ -10,6 +11,7 @@ import ( | |||||
| "google.golang.org/grpc/status" | "google.golang.org/grpc/status" | ||||
| ) | ) | ||||
| // ListEcsDetail return ecs detail | |||||
| func (s *Server) ListEcsDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) { | func (s *Server) ListEcsDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) { | ||||
| resp, err := ecs.ListDetail(ctx, req) | resp, err := ecs.ListDetail(ctx, req) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -19,6 +21,7 @@ func (s *Server) ListEcsDetail(ctx context.Context, req *pbecs.ListDetailReq) (* | |||||
| return resp, nil | return resp, nil | ||||
| } | } | ||||
| //ListEcs return ecs list | |||||
| func (s *Server) ListEcs(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | func (s *Server) ListEcs(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) { | ||||
| resp, err := ecs.List(ctx, req) | resp, err := ecs.List(ctx, req) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -28,6 +31,7 @@ func (s *Server) ListEcs(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListRe | |||||
| return resp, nil | return resp, nil | ||||
| } | } | ||||
| // ListEcsAll return all ecs | |||||
| func (s *Server) ListEcsAll(ctx context.Context, req *pbecs.ListAllReq) (*pbecs.ListResp, error) { | func (s *Server) ListEcsAll(ctx context.Context, req *pbecs.ListAllReq) (*pbecs.ListResp, error) { | ||||
| resp, err := ecs.ListAll(ctx) | resp, err := ecs.ListAll(ctx) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -0,0 +1,32 @@ | |||||
| package server | |||||
| import ( | |||||
| "context" | |||||
| "gitlink.org.cn/JCCE/PCM/adaptor/pod_adaptor/server/pod" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "github.com/golang/glog" | |||||
| "google.golang.org/grpc/codes" | |||||
| "google.golang.org/grpc/status" | |||||
| ) | |||||
| // ListPodDetail return pod detail | |||||
| func (s *Server) ListPodDetail(ctx context.Context, req *pbpod.ListDetailReq) (*pbpod.ListDetailResp, error) { | |||||
| resp, err := pod.ListDetail(ctx, req) | |||||
| if err != nil { | |||||
| glog.Errorf("ListPodDetail error %+v", err) | |||||
| return nil, status.Errorf(codes.Internal, err.Error()) | |||||
| } | |||||
| return resp, nil | |||||
| } | |||||
| //ListPod return pod list | |||||
| func (s *Server) ListPod(ctx context.Context, req *pbpod.ListReq) (*pbpod.ListResp, error) { | |||||
| resp, err := pod.List(ctx, req) | |||||
| if err != nil { | |||||
| glog.Errorf("ListPod error %+v", err) | |||||
| return nil, status.Errorf(codes.Internal, err.Error()) | |||||
| } | |||||
| return resp, nil | |||||
| } | |||||
| @@ -28,11 +28,13 @@ require ( | |||||
| github.com/golang/protobuf v1.5.2 // indirect | github.com/golang/protobuf v1.5.2 // indirect | ||||
| github.com/google/gofuzz v1.0.0 // indirect | github.com/google/gofuzz v1.0.0 // indirect | ||||
| github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d // indirect | github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d // indirect | ||||
| github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect | |||||
| github.com/imdario/mergo v0.3.5 // indirect | github.com/imdario/mergo v0.3.5 // indirect | ||||
| github.com/jmespath/go-jmespath v0.4.0 // indirect | github.com/jmespath/go-jmespath v0.4.0 // indirect | ||||
| github.com/json-iterator/go v1.1.10 // indirect | github.com/json-iterator/go v1.1.10 // indirect | ||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| github.com/modern-go/reflect2 v1.0.1 // indirect | github.com/modern-go/reflect2 v1.0.1 // indirect | ||||
| github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect | |||||
| github.com/smartystreets/goconvey v1.7.2 // indirect | github.com/smartystreets/goconvey v1.7.2 // indirect | ||||
| github.com/spf13/pflag v1.0.1 // indirect | github.com/spf13/pflag v1.0.1 // indirect | ||||
| golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect | golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect | ||||
| @@ -43,6 +45,7 @@ require ( | |||||
| golang.org/x/text v0.3.7 // indirect | golang.org/x/text v0.3.7 // indirect | ||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect | golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect | ||||
| google.golang.org/appengine v1.6.6 // indirect | google.golang.org/appengine v1.6.6 // indirect | ||||
| gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect | |||||
| gopkg.in/inf.v0 v0.9.0 // indirect | gopkg.in/inf.v0 v0.9.0 // indirect | ||||
| gopkg.in/ini.v1 v1.66.2 // indirect | gopkg.in/ini.v1 v1.66.2 // indirect | ||||
| gopkg.in/yaml.v2 v2.4.0 // indirect | gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| @@ -35,7 +35,7 @@ message EcsInstance { | |||||
| string expire_time = 13; | string expire_time = 13; | ||||
| // 内网ip | // 内网ip | ||||
| repeated string inner_ips = 14; | repeated string inner_ips = 14; | ||||
| // vcp id | |||||
| // vpc id | |||||
| string vpc_id = 15; | string vpc_id = 15; | ||||
| // 资源组id | // 资源组id | ||||
| string resource_group_id = 16; | string resource_group_id = 16; | ||||
| @@ -0,0 +1,163 @@ | |||||
| syntax = "proto3"; | |||||
| package pbpod; | |||||
| option go_package = "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod"; | |||||
| import "idl/pbtenant/tenant.proto"; | |||||
| import "google/api/annotations.proto"; | |||||
| message PodInstance { | |||||
| // 云类型 | |||||
| pbtenant.CloudProvider provider = 1; | |||||
| // 账号名称 | |||||
| string account_name = 2; | |||||
| // 实例id | |||||
| string instance_id = 3; | |||||
| // 实例名称 | |||||
| string instance_name = 4; | |||||
| // 地域,数据中心 | |||||
| string region_name = 5; | |||||
| // 公网ip | |||||
| string public_ips = 6; | |||||
| // 实例类型 | |||||
| string instance_type = 7; | |||||
| // vcpu数 | |||||
| int32 cpu = 8; | |||||
| // 内存MB | |||||
| int32 memory = 9; | |||||
| // 实例描述 | |||||
| string description = 10; | |||||
| // 状态 | |||||
| string status = 11; | |||||
| // 创建时间,ISO8601 | |||||
| string creation_time = 12; | |||||
| // 过期时间 | |||||
| string expire_time = 13; | |||||
| // 内网ip | |||||
| repeated string inner_ips = 14; | |||||
| // vpc id | |||||
| string vpc_id = 15; | |||||
| // 安全组id | |||||
| string security_group_id = 16; | |||||
| // 子网Id | |||||
| string SubnetId = 17; | |||||
| // 容器实例 | |||||
| Container Container = 18; | |||||
| } | |||||
| message Container { | |||||
| // 容器镜像 | |||||
| string image = 1; | |||||
| // 容器名称 | |||||
| string name = 2; | |||||
| // vcpu数 | |||||
| int32 cpu = 3; | |||||
| // 内存MB | |||||
| int32 memory = 4; | |||||
| // 重启次数 | |||||
| int32 restart_count = 5; | |||||
| } | |||||
| message ListDetailReq { | |||||
| // 云名称 | |||||
| pbtenant.CloudProvider provider = 1; | |||||
| // 账户名称,根据config.yaml中的配置,默认为第一个配置的账户 | |||||
| string account_name = 2; | |||||
| // 区域Id,参考 tenant.proto 中的各个云的区域 | |||||
| int32 region_id = 3; | |||||
| // 分页相关参数,页码 | |||||
| int32 page_number = 4; | |||||
| // 分页相关参数,每页数量 | |||||
| int32 page_size = 5; | |||||
| // 分页相关参数,下一页的token | |||||
| string next_token = 6; | |||||
| } | |||||
| message ListDetailResp { | |||||
| // pod 容器组集合 | |||||
| repeated PodInstance pods = 1; | |||||
| // 查询是否完成,如果为否-false,则可以将下面三个分页参数填入到请求中,继续查询 | |||||
| bool finished = 2; | |||||
| // 分页相关参数,页码 | |||||
| int32 page_number = 3; | |||||
| // 分页相关参数,每页数量 | |||||
| int32 page_size = 4; | |||||
| // 分页相关参数,下一页的token | |||||
| string next_token = 5; | |||||
| // 请求id,出现问题后提供给云厂商,排查问题 | |||||
| string request_id = 6; | |||||
| } | |||||
| message ListReq { | |||||
| // 云名称 | |||||
| pbtenant.CloudProvider provider = 1; | |||||
| } | |||||
| message ListResp { | |||||
| // Pod 容器组集合 | |||||
| repeated PodInstance pods = 1; | |||||
| } | |||||
| message CreateReq { | |||||
| // 云名称 | |||||
| pbtenant.CloudProvider provider = 1; | |||||
| // 账户名称,根据config.yaml中的配置,默认为第一个配置的账户 | |||||
| string account_name = 2; | |||||
| // 区域Id,参考 tenant.proto 中的各个云的区域 | |||||
| int32 region_id = 3; | |||||
| // 镜像地址 | |||||
| string container_image = 4; | |||||
| // 容器名称 | |||||
| string container_name = 5; | |||||
| // 容器实例名称 | |||||
| string container_group_name = 6; | |||||
| // vcpu数 | |||||
| int32 cpu = 7; | |||||
| // 内存MB | |||||
| int32 memory = 8; | |||||
| // namespace (华为云cci必需) | |||||
| string namespace = 9; | |||||
| // 安全组id(腾讯云eks必需) | |||||
| repeated string security_group_id = 10; | |||||
| //subnet_id 子网id (腾讯云eks必需) | |||||
| repeated string subnet_id = 11; | |||||
| // vpc id (腾讯云eks必需) | |||||
| string vpc_id = 12; | |||||
| } | |||||
| message CreateRep { | |||||
| repeated string id = 1; | |||||
| string request_id = 2; | |||||
| } | |||||
| // 容器组类产品接口 | |||||
| // 阿里云 - ECI | |||||
| // 腾讯云 - EKS | |||||
| // 华为云 - CCI | |||||
| service PodService { | |||||
| // 创建pod - 支持云类型、区域 | |||||
| rpc CreatePod(CreateReq) returns (CreateRep) { | |||||
| option (google.api.http) = { | |||||
| post : "/apis/pod/create" | |||||
| body : "*" | |||||
| }; | |||||
| } | |||||
| // 查询Pod明细 - 支持云类型、区域、账户、分页等过滤条件 | |||||
| rpc ListPodDetail(ListDetailReq) returns (ListDetailResp) { | |||||
| option (google.api.http) = { | |||||
| post : "/apis/pod/detail" | |||||
| body : "*" | |||||
| }; | |||||
| } | |||||
| // 查询pod全量 - 根据云类型 | |||||
| rpc ListPod(ListReq) returns (ListResp) { | |||||
| option (google.api.http) = { | |||||
| post : "/apis/pod" | |||||
| body : "*" | |||||
| }; | |||||
| } | |||||
| } | |||||
| @@ -30,6 +30,8 @@ enum CloudProduct { | |||||
| product_domain = 3; | product_domain = 3; | ||||
| // 4 - OSS类产品:阿里云OSS | // 4 - OSS类产品:阿里云OSS | ||||
| product_oss = 4; | product_oss = 4; | ||||
| // 5 - POD类产品:阿里云ECI,华为云CCI,腾讯云EKS | |||||
| product_pod = 5; | |||||
| } | } | ||||
| // 云配置信息 | // 云配置信息 | ||||
| @@ -148,7 +150,7 @@ service TenantService { | |||||
| description : "所有云租户的认证服务" | description : "所有云租户的认证服务" | ||||
| external_docs : { | external_docs : { | ||||
| url : "https://gitlink.org.cn/JCCE/PCM" | url : "https://gitlink.org.cn/JCCE/PCM" | ||||
| description: "Find out more about CloudFitter" | |||||
| description: "Find out more about PCM" | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -55,7 +55,7 @@ type EcsInstance struct { | |||||
| ExpireTime string `protobuf:"bytes,13,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` | ExpireTime string `protobuf:"bytes,13,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` | ||||
| // 内网ip | // 内网ip | ||||
| InnerIps []string `protobuf:"bytes,14,rep,name=inner_ips,json=innerIps,proto3" json:"inner_ips,omitempty"` | InnerIps []string `protobuf:"bytes,14,rep,name=inner_ips,json=innerIps,proto3" json:"inner_ips,omitempty"` | ||||
| // vcp id | |||||
| // vpc id | |||||
| VpcId string `protobuf:"bytes,15,opt,name=vpc_id,json=vpcId,proto3" json:"vpc_id,omitempty"` | VpcId string `protobuf:"bytes,15,opt,name=vpc_id,json=vpcId,proto3" json:"vpc_id,omitempty"` | ||||
| // 资源组id | // 资源组id | ||||
| ResourceGroupId string `protobuf:"bytes,16,opt,name=resource_group_id,json=resourceGroupId,proto3" json:"resource_group_id,omitempty"` | ResourceGroupId string `protobuf:"bytes,16,opt,name=resource_group_id,json=resourceGroupId,proto3" json:"resource_group_id,omitempty"` | ||||
| @@ -0,0 +1,329 @@ | |||||
| // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. | |||||
| // source: idl/pbpod/pod.proto | |||||
| /* | |||||
| Package pbpod is a reverse proxy. | |||||
| It translates gRPC into RESTful JSON APIs. | |||||
| */ | |||||
| package pbpod | |||||
| import ( | |||||
| "context" | |||||
| "io" | |||||
| "net/http" | |||||
| "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" | |||||
| "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" | |||||
| "google.golang.org/grpc" | |||||
| "google.golang.org/grpc/codes" | |||||
| "google.golang.org/grpc/grpclog" | |||||
| "google.golang.org/grpc/metadata" | |||||
| "google.golang.org/grpc/status" | |||||
| "google.golang.org/protobuf/proto" | |||||
| ) | |||||
| // Suppress "imported and not used" errors | |||||
| var _ codes.Code | |||||
| var _ io.Reader | |||||
| var _ status.Status | |||||
| var _ = runtime.String | |||||
| var _ = utilities.NewDoubleArray | |||||
| var _ = metadata.Join | |||||
| func request_PodService_CreatePod_0(ctx context.Context, marshaler runtime.Marshaler, client PodServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq CreateReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := client.CreatePod(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | |||||
| return msg, metadata, err | |||||
| } | |||||
| func local_request_PodService_CreatePod_0(ctx context.Context, marshaler runtime.Marshaler, server PodServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq CreateReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := server.CreatePod(ctx, &protoReq) | |||||
| return msg, metadata, err | |||||
| } | |||||
| func request_PodService_ListPodDetail_0(ctx context.Context, marshaler runtime.Marshaler, client PodServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq ListDetailReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := client.ListPodDetail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | |||||
| return msg, metadata, err | |||||
| } | |||||
| func local_request_PodService_ListPodDetail_0(ctx context.Context, marshaler runtime.Marshaler, server PodServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq ListDetailReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := server.ListPodDetail(ctx, &protoReq) | |||||
| return msg, metadata, err | |||||
| } | |||||
| func request_PodService_ListPod_0(ctx context.Context, marshaler runtime.Marshaler, client PodServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq ListReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := client.ListPod(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | |||||
| return msg, metadata, err | |||||
| } | |||||
| func local_request_PodService_ListPod_0(ctx context.Context, marshaler runtime.Marshaler, server PodServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | |||||
| var protoReq ListReq | |||||
| var metadata runtime.ServerMetadata | |||||
| newReader, berr := utilities.IOReaderFactory(req.Body) | |||||
| if berr != nil { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | |||||
| } | |||||
| if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | |||||
| return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | |||||
| } | |||||
| msg, err := server.ListPod(ctx, &protoReq) | |||||
| return msg, metadata, err | |||||
| } | |||||
| // RegisterPodServiceHandlerServer registers the http handlers for service PodService to "mux". | |||||
| // UnaryRPC :call PodServiceServer directly. | |||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | |||||
| // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPodServiceHandlerFromEndpoint instead. | |||||
| func RegisterPodServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PodServiceServer) error { | |||||
| mux.Handle("POST", pattern_PodService_CreatePod_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| var stream runtime.ServerTransportStream | |||||
| ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/pbpod.PodService/CreatePod") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := local_request_PodService_CreatePod_0(rctx, inboundMarshaler, server, req, pathParams) | |||||
| md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_CreatePod_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| mux.Handle("POST", pattern_PodService_ListPodDetail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| var stream runtime.ServerTransportStream | |||||
| ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/pbpod.PodService/ListPodDetail") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := local_request_PodService_ListPodDetail_0(rctx, inboundMarshaler, server, req, pathParams) | |||||
| md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_ListPodDetail_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| mux.Handle("POST", pattern_PodService_ListPod_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| var stream runtime.ServerTransportStream | |||||
| ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/pbpod.PodService/ListPod") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := local_request_PodService_ListPod_0(rctx, inboundMarshaler, server, req, pathParams) | |||||
| md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_ListPod_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| return nil | |||||
| } | |||||
| // RegisterPodServiceHandlerFromEndpoint is same as RegisterPodServiceHandler but | |||||
| // automatically dials to "endpoint" and closes the connection when "ctx" gets done. | |||||
| func RegisterPodServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { | |||||
| conn, err := grpc.Dial(endpoint, opts...) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| defer func() { | |||||
| if err != nil { | |||||
| if cerr := conn.Close(); cerr != nil { | |||||
| grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | |||||
| } | |||||
| return | |||||
| } | |||||
| go func() { | |||||
| <-ctx.Done() | |||||
| if cerr := conn.Close(); cerr != nil { | |||||
| grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | |||||
| } | |||||
| }() | |||||
| }() | |||||
| return RegisterPodServiceHandler(ctx, mux, conn) | |||||
| } | |||||
| // RegisterPodServiceHandler registers the http handlers for service PodService to "mux". | |||||
| // The handlers forward requests to the grpc endpoint over "conn". | |||||
| func RegisterPodServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { | |||||
| return RegisterPodServiceHandlerClient(ctx, mux, NewPodServiceClient(conn)) | |||||
| } | |||||
| // RegisterPodServiceHandlerClient registers the http handlers for service PodService | |||||
| // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PodServiceClient". | |||||
| // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PodServiceClient" | |||||
| // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in | |||||
| // "PodServiceClient" to call the correct interceptors. | |||||
| func RegisterPodServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PodServiceClient) error { | |||||
| mux.Handle("POST", pattern_PodService_CreatePod_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateContext(ctx, mux, req, "/pbpod.PodService/CreatePod") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := request_PodService_CreatePod_0(rctx, inboundMarshaler, client, req, pathParams) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_CreatePod_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| mux.Handle("POST", pattern_PodService_ListPodDetail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateContext(ctx, mux, req, "/pbpod.PodService/ListPodDetail") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := request_PodService_ListPodDetail_0(rctx, inboundMarshaler, client, req, pathParams) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_ListPodDetail_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| mux.Handle("POST", pattern_PodService_ListPod_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | |||||
| ctx, cancel := context.WithCancel(req.Context()) | |||||
| defer cancel() | |||||
| inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | |||||
| rctx, err := runtime.AnnotateContext(ctx, mux, req, "/pbpod.PodService/ListPod") | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| resp, md, err := request_PodService_ListPod_0(rctx, inboundMarshaler, client, req, pathParams) | |||||
| ctx = runtime.NewServerMetadataContext(ctx, md) | |||||
| if err != nil { | |||||
| runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | |||||
| return | |||||
| } | |||||
| forward_PodService_ListPod_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | |||||
| }) | |||||
| return nil | |||||
| } | |||||
| var ( | |||||
| pattern_PodService_CreatePod_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"apis", "pod", "create"}, "")) | |||||
| pattern_PodService_ListPodDetail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"apis", "pod", "detail"}, "")) | |||||
| pattern_PodService_ListPod_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"apis", "pod"}, "")) | |||||
| ) | |||||
| var ( | |||||
| forward_PodService_CreatePod_0 = runtime.ForwardResponseMessage | |||||
| forward_PodService_ListPodDetail_0 = runtime.ForwardResponseMessage | |||||
| forward_PodService_ListPod_0 = runtime.ForwardResponseMessage | |||||
| ) | |||||
| @@ -0,0 +1,183 @@ | |||||
| // Code generated by protoc-gen-go-grpc. DO NOT EDIT. | |||||
| // versions: | |||||
| // - protoc-gen-go-grpc v1.2.0 | |||||
| // - protoc (unknown) | |||||
| // source: idl/pbpod/pod.proto | |||||
| package pbpod | |||||
| import ( | |||||
| context "context" | |||||
| grpc "google.golang.org/grpc" | |||||
| codes "google.golang.org/grpc/codes" | |||||
| status "google.golang.org/grpc/status" | |||||
| ) | |||||
| // This is a compile-time assertion to ensure that this generated file | |||||
| // is compatible with the grpc package it is being compiled against. | |||||
| // Requires gRPC-Go v1.32.0 or later. | |||||
| const _ = grpc.SupportPackageIsVersion7 | |||||
| // PodServiceClient is the client API for PodService service. | |||||
| // | |||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. | |||||
| type PodServiceClient interface { | |||||
| // 创建pod - 支持云类型、区域 | |||||
| CreatePod(ctx context.Context, in *CreateReq, opts ...grpc.CallOption) (*CreateRep, error) | |||||
| // 查询Pod明细 - 支持云类型、区域、账户、分页等过滤条件 | |||||
| ListPodDetail(ctx context.Context, in *ListDetailReq, opts ...grpc.CallOption) (*ListDetailResp, error) | |||||
| // 查询pod全量 - 根据云类型 | |||||
| ListPod(ctx context.Context, in *ListReq, opts ...grpc.CallOption) (*ListResp, error) | |||||
| } | |||||
| type podServiceClient struct { | |||||
| cc grpc.ClientConnInterface | |||||
| } | |||||
| func NewPodServiceClient(cc grpc.ClientConnInterface) PodServiceClient { | |||||
| return &podServiceClient{cc} | |||||
| } | |||||
| func (c *podServiceClient) CreatePod(ctx context.Context, in *CreateReq, opts ...grpc.CallOption) (*CreateRep, error) { | |||||
| out := new(CreateRep) | |||||
| err := c.cc.Invoke(ctx, "/pbpod.PodService/CreatePod", in, out, opts...) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return out, nil | |||||
| } | |||||
| func (c *podServiceClient) ListPodDetail(ctx context.Context, in *ListDetailReq, opts ...grpc.CallOption) (*ListDetailResp, error) { | |||||
| out := new(ListDetailResp) | |||||
| err := c.cc.Invoke(ctx, "/pbpod.PodService/ListPodDetail", in, out, opts...) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return out, nil | |||||
| } | |||||
| func (c *podServiceClient) ListPod(ctx context.Context, in *ListReq, opts ...grpc.CallOption) (*ListResp, error) { | |||||
| out := new(ListResp) | |||||
| err := c.cc.Invoke(ctx, "/pbpod.PodService/ListPod", in, out, opts...) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return out, nil | |||||
| } | |||||
| // PodServiceServer is the server API for PodService service. | |||||
| // All implementations must embed UnimplementedPodServiceServer | |||||
| // for forward compatibility | |||||
| type PodServiceServer interface { | |||||
| // 创建pod - 支持云类型、区域 | |||||
| CreatePod(context.Context, *CreateReq) (*CreateRep, error) | |||||
| // 查询Pod明细 - 支持云类型、区域、账户、分页等过滤条件 | |||||
| ListPodDetail(context.Context, *ListDetailReq) (*ListDetailResp, error) | |||||
| // 查询pod全量 - 根据云类型 | |||||
| ListPod(context.Context, *ListReq) (*ListResp, error) | |||||
| mustEmbedUnimplementedPodServiceServer() | |||||
| } | |||||
| // UnimplementedPodServiceServer must be embedded to have forward compatible implementations. | |||||
| type UnimplementedPodServiceServer struct { | |||||
| } | |||||
| func (UnimplementedPodServiceServer) CreatePod(context.Context, *CreateReq) (*CreateRep, error) { | |||||
| return nil, status.Errorf(codes.Unimplemented, "method CreatePod not implemented") | |||||
| } | |||||
| func (UnimplementedPodServiceServer) ListPodDetail(context.Context, *ListDetailReq) (*ListDetailResp, error) { | |||||
| return nil, status.Errorf(codes.Unimplemented, "method ListPodDetail not implemented") | |||||
| } | |||||
| func (UnimplementedPodServiceServer) ListPod(context.Context, *ListReq) (*ListResp, error) { | |||||
| return nil, status.Errorf(codes.Unimplemented, "method ListPod not implemented") | |||||
| } | |||||
| func (UnimplementedPodServiceServer) mustEmbedUnimplementedPodServiceServer() {} | |||||
| // UnsafePodServiceServer may be embedded to opt out of forward compatibility for this service. | |||||
| // Use of this interface is not recommended, as added methods to PodServiceServer will | |||||
| // result in compilation errors. | |||||
| type UnsafePodServiceServer interface { | |||||
| mustEmbedUnimplementedPodServiceServer() | |||||
| } | |||||
| func RegisterPodServiceServer(s grpc.ServiceRegistrar, srv PodServiceServer) { | |||||
| s.RegisterService(&PodService_ServiceDesc, srv) | |||||
| } | |||||
| func _PodService_CreatePod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | |||||
| in := new(CreateReq) | |||||
| if err := dec(in); err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if interceptor == nil { | |||||
| return srv.(PodServiceServer).CreatePod(ctx, in) | |||||
| } | |||||
| info := &grpc.UnaryServerInfo{ | |||||
| Server: srv, | |||||
| FullMethod: "/pbpod.PodService/CreatePod", | |||||
| } | |||||
| handler := func(ctx context.Context, req interface{}) (interface{}, error) { | |||||
| return srv.(PodServiceServer).CreatePod(ctx, req.(*CreateReq)) | |||||
| } | |||||
| return interceptor(ctx, in, info, handler) | |||||
| } | |||||
| func _PodService_ListPodDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | |||||
| in := new(ListDetailReq) | |||||
| if err := dec(in); err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if interceptor == nil { | |||||
| return srv.(PodServiceServer).ListPodDetail(ctx, in) | |||||
| } | |||||
| info := &grpc.UnaryServerInfo{ | |||||
| Server: srv, | |||||
| FullMethod: "/pbpod.PodService/ListPodDetail", | |||||
| } | |||||
| handler := func(ctx context.Context, req interface{}) (interface{}, error) { | |||||
| return srv.(PodServiceServer).ListPodDetail(ctx, req.(*ListDetailReq)) | |||||
| } | |||||
| return interceptor(ctx, in, info, handler) | |||||
| } | |||||
| func _PodService_ListPod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | |||||
| in := new(ListReq) | |||||
| if err := dec(in); err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if interceptor == nil { | |||||
| return srv.(PodServiceServer).ListPod(ctx, in) | |||||
| } | |||||
| info := &grpc.UnaryServerInfo{ | |||||
| Server: srv, | |||||
| FullMethod: "/pbpod.PodService/ListPod", | |||||
| } | |||||
| handler := func(ctx context.Context, req interface{}) (interface{}, error) { | |||||
| return srv.(PodServiceServer).ListPod(ctx, req.(*ListReq)) | |||||
| } | |||||
| return interceptor(ctx, in, info, handler) | |||||
| } | |||||
| // PodService_ServiceDesc is the grpc.ServiceDesc for PodService service. | |||||
| // It's only intended for direct use with grpc.RegisterService, | |||||
| // and not to be introspected or modified (even as a copy) | |||||
| var PodService_ServiceDesc = grpc.ServiceDesc{ | |||||
| ServiceName: "pbpod.PodService", | |||||
| HandlerType: (*PodServiceServer)(nil), | |||||
| Methods: []grpc.MethodDesc{ | |||||
| { | |||||
| MethodName: "CreatePod", | |||||
| Handler: _PodService_CreatePod_Handler, | |||||
| }, | |||||
| { | |||||
| MethodName: "ListPodDetail", | |||||
| Handler: _PodService_ListPodDetail_Handler, | |||||
| }, | |||||
| { | |||||
| MethodName: "ListPod", | |||||
| Handler: _PodService_ListPod_Handler, | |||||
| }, | |||||
| }, | |||||
| Streams: []grpc.StreamDesc{}, | |||||
| Metadata: "idl/pbpod/pod.proto", | |||||
| } | |||||
| @@ -93,6 +93,8 @@ const ( | |||||
| CloudProduct_product_domain CloudProduct = 3 | CloudProduct_product_domain CloudProduct = 3 | ||||
| // 4 - OSS类产品:阿里云OSS | // 4 - OSS类产品:阿里云OSS | ||||
| CloudProduct_product_oss CloudProduct = 4 | CloudProduct_product_oss CloudProduct = 4 | ||||
| // 5 - POD类产品:阿里云ECI,华为云CCI,腾讯云EKS | |||||
| CloudProduct_product_pod CloudProduct = 5 | |||||
| ) | ) | ||||
| // Enum value maps for CloudProduct. | // Enum value maps for CloudProduct. | ||||
| @@ -103,6 +105,7 @@ var ( | |||||
| 2: "product_rds", | 2: "product_rds", | ||||
| 3: "product_domain", | 3: "product_domain", | ||||
| 4: "product_oss", | 4: "product_oss", | ||||
| 5: "product_pod", | |||||
| } | } | ||||
| CloudProduct_value = map[string]int32{ | CloudProduct_value = map[string]int32{ | ||||
| "product_all": 0, | "product_all": 0, | ||||
| @@ -110,6 +113,7 @@ var ( | |||||
| "product_rds": 2, | "product_rds": 2, | ||||
| "product_domain": 3, | "product_domain": 3, | ||||
| "product_oss": 4, | "product_oss": 4, | ||||
| "product_pod": 5, | |||||
| } | } | ||||
| ) | ) | ||||
| @@ -686,127 +690,128 @@ var file_idl_pbtenant_tenant_proto_rawDesc = []byte{ | |||||
| 0x3a, 0x0a, 0x0d, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, | 0x3a, 0x0a, 0x0d, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, | ||||
| 0x12, 0x07, 0x0a, 0x03, 0x61, 0x6c, 0x69, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x74, 0x65, 0x6e, | 0x12, 0x07, 0x0a, 0x03, 0x61, 0x6c, 0x69, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x74, 0x65, 0x6e, | ||||
| 0x63, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x68, 0x75, 0x61, 0x77, 0x65, 0x69, | 0x63, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x68, 0x75, 0x61, 0x77, 0x65, 0x69, | ||||
| 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x10, 0x03, 0x2a, 0x66, 0x0a, 0x0c, 0x43, | |||||
| 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x10, 0x03, 0x2a, 0x77, 0x0a, 0x0c, 0x43, | |||||
| 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0f, 0x0a, 0x0b, 0x70, | 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x0f, 0x0a, 0x0b, 0x70, | ||||
| 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, | 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, | ||||
| 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x65, 0x63, 0x73, 0x10, 0x01, 0x12, 0x0f, 0x0a, | 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x65, 0x63, 0x73, 0x10, 0x01, 0x12, 0x0f, 0x0a, | ||||
| 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x72, 0x64, 0x73, 0x10, 0x02, 0x12, 0x12, | 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x72, 0x64, 0x73, 0x10, 0x02, 0x12, 0x12, | ||||
| 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, | 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, | ||||
| 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6f, 0x73, | 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x6f, 0x73, | ||||
| 0x73, 0x10, 0x04, 0x2a, 0x86, 0x04, 0x0a, 0x0b, 0x41, 0x6c, 0x69, 0x52, 0x65, 0x67, 0x69, 0x6f, | |||||
| 0x6e, 0x49, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, | |||||
| 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x71, 0x69, 0x6e, 0x67, 0x64, | |||||
| 0x61, 0x6f, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x62, | |||||
| 0x65, 0x69, 0x6a, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, | |||||
| 0x63, 0x6e, 0x5f, 0x7a, 0x68, 0x61, 0x6e, 0x67, 0x6a, 0x69, 0x61, 0x6b, 0x6f, 0x75, 0x10, 0x03, | |||||
| 0x12, 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x75, 0x68, 0x65, 0x68, | |||||
| 0x61, 0x6f, 0x74, 0x65, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, | |||||
| 0x5f, 0x77, 0x75, 0x6c, 0x61, 0x6e, 0x63, 0x68, 0x61, 0x62, 0x75, 0x10, 0x05, 0x12, 0x13, 0x0a, | |||||
| 0x0f, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x61, 0x6e, 0x67, 0x7a, 0x68, 0x6f, 0x75, | |||||
| 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x73, 0x68, 0x61, | |||||
| 0x6e, 0x67, 0x68, 0x61, 0x69, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, 0x69, 0x5f, 0x63, | |||||
| 0x6e, 0x5f, 0x73, 0x68, 0x65, 0x6e, 0x7a, 0x68, 0x65, 0x6e, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, | |||||
| 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x65, 0x79, 0x75, 0x61, 0x6e, 0x10, 0x09, 0x12, | |||||
| 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, 0x7a, | |||||
| 0x68, 0x6f, 0x75, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, | |||||
| 0x63, 0x68, 0x65, 0x6e, 0x67, 0x64, 0x75, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, 0x69, | |||||
| 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x10, 0x0c, 0x12, 0x16, | |||||
| 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, | |||||
| 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0d, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, | |||||
| 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x0e, 0x12, 0x16, | |||||
| 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, | |||||
| 0x73, 0x74, 0x5f, 0x33, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, | |||||
| 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x35, 0x10, 0x10, 0x12, 0x12, | |||||
| 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, | |||||
| 0x10, 0x11, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, | |||||
| 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x12, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, | |||||
| 0x69, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x13, 0x12, 0x11, 0x0a, | |||||
| 0x0d, 0x61, 0x6c, 0x69, 0x5f, 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x14, | |||||
| 0x12, 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x65, 0x75, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x72, | |||||
| 0x61, 0x6c, 0x5f, 0x31, 0x10, 0x15, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, 0x69, 0x5f, 0x65, 0x75, | |||||
| 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x16, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, 0x69, | |||||
| 0x5f, 0x6d, 0x65, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x17, 0x2a, 0xa1, 0x03, 0x0a, | |||||
| 0x0f, 0x54, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, | |||||
| 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, | |||||
| 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x10, 0x01, 0x12, | |||||
| 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x62, 0x65, 0x69, 0x6a, 0x69, 0x6e, 0x67, | |||||
| 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x6e, | |||||
| 0x67, 0x64, 0x75, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x63, | |||||
| 0x68, 0x6f, 0x6e, 0x67, 0x71, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, | |||||
| 0x5f, 0x61, 0x70, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, 0x7a, 0x68, 0x6f, 0x75, 0x10, 0x05, 0x12, | |||||
| 0x18, 0x0a, 0x14, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, 0x7a, 0x68, | |||||
| 0x6f, 0x75, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x74, 0x63, 0x5f, | |||||
| 0x61, 0x70, 0x5f, 0x68, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x10, 0x07, 0x12, 0x10, 0x0a, | |||||
| 0x0c, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x6d, 0x75, 0x6d, 0x62, 0x61, 0x69, 0x10, 0x08, 0x12, | |||||
| 0x0f, 0x0a, 0x0b, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x65, 0x6f, 0x75, 0x6c, 0x10, 0x09, | |||||
| 0x12, 0x12, 0x0a, 0x0e, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x68, 0x61, 0x6e, 0x67, 0x68, | |||||
| 0x61, 0x69, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x68, | |||||
| 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x5f, 0x66, 0x73, 0x69, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, | |||||
| 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x68, 0x65, 0x6e, 0x7a, 0x68, 0x65, 0x6e, 0x5f, 0x66, | |||||
| 0x73, 0x69, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x69, | |||||
| 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x10, 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x74, 0x63, 0x5f, | |||||
| 0x61, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x79, 0x6f, 0x10, 0x0e, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, | |||||
| 0x5f, 0x65, 0x75, 0x5f, 0x66, 0x72, 0x61, 0x6e, 0x6b, 0x66, 0x75, 0x72, 0x74, 0x10, 0x0f, 0x12, | |||||
| 0x10, 0x0a, 0x0c, 0x74, 0x63, 0x5f, 0x65, 0x75, 0x5f, 0x6d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x10, | |||||
| 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x61, 0x73, 0x68, 0x62, 0x75, | |||||
| 0x72, 0x6e, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x73, 0x69, | |||||
| 0x6c, 0x69, 0x63, 0x6f, 0x6e, 0x76, 0x61, 0x6c, 0x6c, 0x65, 0x79, 0x10, 0x12, 0x12, 0x11, 0x0a, | |||||
| 0x0d, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x74, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x10, 0x13, | |||||
| 0x2a, 0xe8, 0x01, 0x0a, 0x0e, 0x48, 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x67, 0x69, 0x6f, | |||||
| 0x6e, 0x49, 0x64, 0x12, 0x0a, 0x0a, 0x06, 0x68, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, | |||||
| 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x31, | |||||
| 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, 0x74, | |||||
| 0x68, 0x5f, 0x34, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x73, | |||||
| 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x68, 0x77, 0x5f, 0x63, | |||||
| 0x6e, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x68, 0x77, | |||||
| 0x5f, 0x63, 0x6e, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, | |||||
| 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x77, 0x65, 0x73, 0x74, 0x5f, | |||||
| 0x32, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x68, 0x77, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, | |||||
| 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x68, 0x77, | |||||
| 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, | |||||
| 0x08, 0x12, 0x15, 0x0a, 0x11, 0x68, 0x77, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, | |||||
| 0x65, 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x61, | |||||
| 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x0a, 0x2a, 0xcd, 0x03, 0x0a, 0x0b, | |||||
| 0x41, 0x77, 0x73, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x61, | |||||
| 0x77, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x61, | |||||
| 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x02, 0x12, 0x11, | |||||
| 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, | |||||
| 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, 0x74, | |||||
| 0x5f, 0x32, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x5f, 0x73, | |||||
| 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x61, 0x70, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x61, | |||||
| 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x07, 0x12, | |||||
| 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, | |||||
| 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, | |||||
| 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x09, 0x12, | |||||
| 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, | |||||
| 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, | |||||
| 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x0b, 0x12, | |||||
| 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, | |||||
| 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x61, 0x77, 0x73, 0x5f, 0x63, | |||||
| 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x5f, 0x31, 0x10, 0x0d, 0x12, 0x14, 0x0a, | |||||
| 0x10, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x5f, | |||||
| 0x31, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x77, 0x65, | |||||
| 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, | |||||
| 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x10, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, | |||||
| 0x5f, 0x65, 0x75, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x11, 0x12, 0x11, 0x0a, | |||||
| 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x12, | |||||
| 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, | |||||
| 0x5f, 0x31, 0x10, 0x13, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x6d, 0x65, 0x5f, 0x73, | |||||
| 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x73, 0x61, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x15, 0x32, 0x78, 0x0a, 0x0d, 0x54, | |||||
| 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x67, 0x92, 0x41, | |||||
| 0x64, 0x12, 0x1e, 0xe6, 0x89, 0x80, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0x91, 0xe7, 0xa7, 0x9f, 0xe6, | |||||
| 0x88, 0xb7, 0xe7, 0x9a, 0x84, 0xe8, 0xae, 0xa4, 0xe8, 0xaf, 0x81, 0xe6, 0x9c, 0x8d, 0xe5, 0x8a, | |||||
| 0xa1, 0x1a, 0x42, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x6f, | |||||
| 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x69, | |||||
| 0x74, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, | |||||
| 0x74, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x63, 0x6e, 0x2f, 0x4a, 0x43, 0x43, | |||||
| 0x45, 0x2f, 0x50, 0x43, 0x4d, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x6c, 0x69, 0x6e, 0x6b, | |||||
| 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x63, 0x6e, 0x2f, 0x4a, 0x43, 0x43, 0x45, 0x2f, 0x50, 0x43, 0x4d, | |||||
| 0x2f, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x2f, 0x69, 0x64, 0x6c, 0x2f, 0x70, | |||||
| 0x62, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | |||||
| 0x73, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x70, | |||||
| 0x6f, 0x64, 0x10, 0x05, 0x2a, 0x86, 0x04, 0x0a, 0x0b, 0x41, 0x6c, 0x69, 0x52, 0x65, 0x67, 0x69, | |||||
| 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x6c, 0x6c, 0x10, | |||||
| 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x71, 0x69, 0x6e, 0x67, | |||||
| 0x64, 0x61, 0x6f, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, | |||||
| 0x62, 0x65, 0x69, 0x6a, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, | |||||
| 0x5f, 0x63, 0x6e, 0x5f, 0x7a, 0x68, 0x61, 0x6e, 0x67, 0x6a, 0x69, 0x61, 0x6b, 0x6f, 0x75, 0x10, | |||||
| 0x03, 0x12, 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x75, 0x68, 0x65, | |||||
| 0x68, 0x61, 0x6f, 0x74, 0x65, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x61, 0x6c, 0x69, 0x5f, 0x63, | |||||
| 0x6e, 0x5f, 0x77, 0x75, 0x6c, 0x61, 0x6e, 0x63, 0x68, 0x61, 0x62, 0x75, 0x10, 0x05, 0x12, 0x13, | |||||
| 0x0a, 0x0f, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x61, 0x6e, 0x67, 0x7a, 0x68, 0x6f, | |||||
| 0x75, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x73, 0x68, | |||||
| 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, 0x69, 0x5f, | |||||
| 0x63, 0x6e, 0x5f, 0x73, 0x68, 0x65, 0x6e, 0x7a, 0x68, 0x65, 0x6e, 0x10, 0x08, 0x12, 0x11, 0x0a, | |||||
| 0x0d, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x65, 0x79, 0x75, 0x61, 0x6e, 0x10, 0x09, | |||||
| 0x12, 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, | |||||
| 0x7a, 0x68, 0x6f, 0x75, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x63, 0x6e, | |||||
| 0x5f, 0x63, 0x68, 0x65, 0x6e, 0x67, 0x64, 0x75, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x61, 0x6c, | |||||
| 0x69, 0x5f, 0x63, 0x6e, 0x5f, 0x68, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x10, 0x0c, 0x12, | |||||
| 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, | |||||
| 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0d, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, | |||||
| 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x0e, 0x12, | |||||
| 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, | |||||
| 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, | |||||
| 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x35, 0x10, 0x10, 0x12, | |||||
| 0x12, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, | |||||
| 0x31, 0x10, 0x11, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x6c, 0x69, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, | |||||
| 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x12, 0x12, 0x11, 0x0a, 0x0d, 0x61, | |||||
| 0x6c, 0x69, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x13, 0x12, 0x11, | |||||
| 0x0a, 0x0d, 0x61, 0x6c, 0x69, 0x5f, 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, | |||||
| 0x14, 0x12, 0x14, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x5f, 0x65, 0x75, 0x5f, 0x63, 0x65, 0x6e, 0x74, | |||||
| 0x72, 0x61, 0x6c, 0x5f, 0x31, 0x10, 0x15, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, 0x69, 0x5f, 0x65, | |||||
| 0x75, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x16, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, | |||||
| 0x69, 0x5f, 0x6d, 0x65, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x17, 0x2a, 0xa1, 0x03, | |||||
| 0x0a, 0x0f, 0x54, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, | |||||
| 0x64, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x11, 0x0a, | |||||
| 0x0d, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x10, 0x01, | |||||
| 0x12, 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x62, 0x65, 0x69, 0x6a, 0x69, 0x6e, | |||||
| 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x63, 0x68, 0x65, | |||||
| 0x6e, 0x67, 0x64, 0x75, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, | |||||
| 0x63, 0x68, 0x6f, 0x6e, 0x67, 0x71, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x74, | |||||
| 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, 0x7a, 0x68, 0x6f, 0x75, 0x10, 0x05, | |||||
| 0x12, 0x18, 0x0a, 0x14, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x67, 0x75, 0x61, 0x6e, 0x67, 0x7a, | |||||
| 0x68, 0x6f, 0x75, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x74, 0x63, | |||||
| 0x5f, 0x61, 0x70, 0x5f, 0x68, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x10, 0x07, 0x12, 0x10, | |||||
| 0x0a, 0x0c, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x6d, 0x75, 0x6d, 0x62, 0x61, 0x69, 0x10, 0x08, | |||||
| 0x12, 0x0f, 0x0a, 0x0b, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x65, 0x6f, 0x75, 0x6c, 0x10, | |||||
| 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x68, 0x61, 0x6e, 0x67, | |||||
| 0x68, 0x61, 0x69, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, | |||||
| 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x5f, 0x66, 0x73, 0x69, 0x10, 0x0b, 0x12, 0x16, 0x0a, | |||||
| 0x12, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x68, 0x65, 0x6e, 0x7a, 0x68, 0x65, 0x6e, 0x5f, | |||||
| 0x66, 0x73, 0x69, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x74, 0x63, 0x5f, 0x61, 0x70, 0x5f, 0x73, | |||||
| 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x10, 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x74, 0x63, | |||||
| 0x5f, 0x61, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x79, 0x6f, 0x10, 0x0e, 0x12, 0x13, 0x0a, 0x0f, 0x74, | |||||
| 0x63, 0x5f, 0x65, 0x75, 0x5f, 0x66, 0x72, 0x61, 0x6e, 0x6b, 0x66, 0x75, 0x72, 0x74, 0x10, 0x0f, | |||||
| 0x12, 0x10, 0x0a, 0x0c, 0x74, 0x63, 0x5f, 0x65, 0x75, 0x5f, 0x6d, 0x6f, 0x73, 0x63, 0x6f, 0x77, | |||||
| 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x61, 0x73, 0x68, 0x62, | |||||
| 0x75, 0x72, 0x6e, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x73, | |||||
| 0x69, 0x6c, 0x69, 0x63, 0x6f, 0x6e, 0x76, 0x61, 0x6c, 0x6c, 0x65, 0x79, 0x10, 0x12, 0x12, 0x11, | |||||
| 0x0a, 0x0d, 0x74, 0x63, 0x5f, 0x6e, 0x61, 0x5f, 0x74, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x10, | |||||
| 0x13, 0x2a, 0xe8, 0x01, 0x0a, 0x0e, 0x48, 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x67, 0x69, | |||||
| 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0a, 0x0a, 0x06, 0x68, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, | |||||
| 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x5f, | |||||
| 0x31, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, | |||||
| 0x74, 0x68, 0x5f, 0x34, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, | |||||
| 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x68, 0x77, 0x5f, | |||||
| 0x63, 0x6e, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x68, | |||||
| 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x05, 0x12, 0x15, 0x0a, | |||||
| 0x11, 0x68, 0x77, 0x5f, 0x63, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x77, 0x65, 0x73, 0x74, | |||||
| 0x5f, 0x32, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x68, 0x77, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, | |||||
| 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x68, | |||||
| 0x77, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, | |||||
| 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x68, 0x77, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, | |||||
| 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x68, 0x77, 0x5f, | |||||
| 0x61, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x0a, 0x2a, 0xcd, 0x03, 0x0a, | |||||
| 0x0b, 0x41, 0x77, 0x73, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0b, 0x0a, 0x07, | |||||
| 0x61, 0x77, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, | |||||
| 0x5f, 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, | |||||
| 0x61, 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x02, 0x12, | |||||
| 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x31, | |||||
| 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x75, 0x73, 0x5f, 0x77, 0x65, 0x73, | |||||
| 0x74, 0x5f, 0x32, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x5f, | |||||
| 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, | |||||
| 0x5f, 0x61, 0x70, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, | |||||
| 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x07, | |||||
| 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, | |||||
| 0x65, 0x61, 0x73, 0x74, 0x5f, 0x33, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x09, | |||||
| 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, | |||||
| 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x0b, | |||||
| 0x12, 0x16, 0x0a, 0x12, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x70, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, | |||||
| 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x61, 0x77, 0x73, 0x5f, | |||||
| 0x63, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x5f, 0x31, 0x10, 0x0d, 0x12, 0x14, | |||||
| 0x0a, 0x10, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, | |||||
| 0x5f, 0x31, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x77, | |||||
| 0x65, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, | |||||
| 0x75, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x32, 0x10, 0x10, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, | |||||
| 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x11, 0x12, 0x11, | |||||
| 0x0a, 0x0d, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x33, 0x10, | |||||
| 0x12, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x65, 0x75, 0x5f, 0x6e, 0x6f, 0x72, 0x74, | |||||
| 0x68, 0x5f, 0x31, 0x10, 0x13, 0x12, 0x12, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x6d, 0x65, 0x5f, | |||||
| 0x73, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x31, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x77, 0x73, | |||||
| 0x5f, 0x73, 0x61, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x10, 0x15, 0x32, 0x70, 0x0a, 0x0d, | |||||
| 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x5f, 0x92, | |||||
| 0x41, 0x5c, 0x12, 0x1e, 0xe6, 0x89, 0x80, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0x91, 0xe7, 0xa7, 0x9f, | |||||
| 0xe6, 0x88, 0xb7, 0xe7, 0x9a, 0x84, 0xe8, 0xae, 0xa4, 0xe8, 0xaf, 0x81, 0xe6, 0x9c, 0x8d, 0xe5, | |||||
| 0x8a, 0xa1, 0x1a, 0x3a, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6d, | |||||
| 0x6f, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x50, 0x43, 0x4d, 0x12, 0x1f, 0x68, | |||||
| 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6f, | |||||
| 0x72, 0x67, 0x2e, 0x63, 0x6e, 0x2f, 0x4a, 0x43, 0x43, 0x45, 0x2f, 0x50, 0x43, 0x4d, 0x42, 0x30, | |||||
| 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x63, 0x6e, | |||||
| 0x2f, 0x4a, 0x43, 0x43, 0x45, 0x2f, 0x50, 0x43, 0x4d, 0x2f, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x72, | |||||
| 0x61, 0x6e, 0x73, 0x2f, 0x69, 0x64, 0x6c, 0x2f, 0x70, 0x62, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, | |||||
| 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | |||||
| } | } | ||||
| var ( | var ( | ||||
| @@ -0,0 +1,99 @@ | |||||
| { | |||||
| "swagger": "2.0", | |||||
| "info": { | |||||
| "title": "idl/demo/demo.proto", | |||||
| "version": "version not set" | |||||
| }, | |||||
| "tags": [ | |||||
| { | |||||
| "name": "DemoService" | |||||
| } | |||||
| ], | |||||
| "consumes": [ | |||||
| "application/json" | |||||
| ], | |||||
| "produces": [ | |||||
| "application/json" | |||||
| ], | |||||
| "paths": { | |||||
| "/apis/demo": { | |||||
| "post": { | |||||
| "summary": "Echo 样例接口", | |||||
| "operationId": "DemoService_Echo", | |||||
| "responses": { | |||||
| "200": { | |||||
| "description": "A successful response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/demoStringMessage" | |||||
| } | |||||
| }, | |||||
| "default": { | |||||
| "description": "An unexpected error response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/rpcStatus" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "parameters": [ | |||||
| { | |||||
| "name": "body", | |||||
| "in": "body", | |||||
| "required": true, | |||||
| "schema": { | |||||
| "$ref": "#/definitions/demoStringMessage" | |||||
| } | |||||
| } | |||||
| ], | |||||
| "tags": [ | |||||
| "DemoService" | |||||
| ], | |||||
| "deprecated": true, | |||||
| "security": [], | |||||
| "externalDocs": { | |||||
| "description": "Find out more about the interface", | |||||
| "url": "https://github.com/grpc-ecosystem/grpc-gateway" | |||||
| } | |||||
| } | |||||
| } | |||||
| }, | |||||
| "definitions": { | |||||
| "demoStringMessage": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "value": { | |||||
| "type": "string" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "protobufAny": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "typeUrl": { | |||||
| "type": "string" | |||||
| }, | |||||
| "value": { | |||||
| "type": "string", | |||||
| "format": "byte" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "rpcStatus": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "code": { | |||||
| "type": "integer", | |||||
| "format": "int32" | |||||
| }, | |||||
| "message": { | |||||
| "type": "string" | |||||
| }, | |||||
| "details": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "$ref": "#/definitions/protobufAny" | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,44 +1,30 @@ | |||||
| { | { | ||||
| "swagger": "2.0", | |||||
| "info": { | |||||
| "title": "idl/pbecs/ecs.proto", | |||||
| "version": "version not set" | |||||
| }, | |||||
| "tags": [ | |||||
| { | |||||
| "name": "EcsService" | |||||
| } | |||||
| ], | |||||
| "consumes": [ | "consumes": [ | ||||
| "application/json" | "application/json" | ||||
| ], | ], | ||||
| "produces": [ | "produces": [ | ||||
| "application/json" | "application/json" | ||||
| ], | ], | ||||
| "swagger": "2.0", | |||||
| "info": { | |||||
| "title": "idl/demo/demo.proto", | |||||
| "version": "version not set" | |||||
| }, | |||||
| "paths": { | "paths": { | ||||
| "/apis/demo": { | |||||
| "/apis/ecs": { | |||||
| "post": { | "post": { | ||||
| "security": [], | |||||
| "tags": [ | |||||
| "DemoService" | |||||
| ], | |||||
| "summary": "Echo 样例接口", | |||||
| "externalDocs": { | |||||
| "description": "Find out more about the interface", | |||||
| "url": "https://github.com/grpc-ecosystem/grpc-gateway" | |||||
| }, | |||||
| "operationId": "DemoService_Echo", | |||||
| "deprecated": true, | |||||
| "parameters": [ | |||||
| { | |||||
| "name": "body", | |||||
| "in": "body", | |||||
| "required": true, | |||||
| "schema": { | |||||
| "$ref": "#/definitions/demoStringMessage" | |||||
| } | |||||
| } | |||||
| ], | |||||
| "summary": "查询ECS全量 - 根据云类型", | |||||
| "operationId": "EcsService_ListEcs", | |||||
| "responses": { | "responses": { | ||||
| "200": { | "200": { | ||||
| "description": "A successful response.", | "description": "A successful response.", | ||||
| "schema": { | "schema": { | ||||
| "$ref": "#/definitions/demoStringMessage" | |||||
| "$ref": "#/definitions/pbecsListResp" | |||||
| } | } | ||||
| }, | }, | ||||
| "default": { | "default": { | ||||
| @@ -47,16 +33,7 @@ | |||||
| "$ref": "#/definitions/rpcStatus" | "$ref": "#/definitions/rpcStatus" | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| }, | |||||
| "/apis/ecs": { | |||||
| "post": { | |||||
| "tags": [ | |||||
| "EcsService" | |||||
| ], | |||||
| "summary": "查询ECS全量 - 根据云类型", | |||||
| "operationId": "EcsService_ListEcs", | |||||
| }, | |||||
| "parameters": [ | "parameters": [ | ||||
| { | { | ||||
| "name": "body", | "name": "body", | ||||
| @@ -67,6 +44,15 @@ | |||||
| } | } | ||||
| } | } | ||||
| ], | ], | ||||
| "tags": [ | |||||
| "EcsService" | |||||
| ] | |||||
| } | |||||
| }, | |||||
| "/apis/ecs/all": { | |||||
| "post": { | |||||
| "summary": "查询所有云的ECS", | |||||
| "operationId": "EcsService_ListEcsAll", | |||||
| "responses": { | "responses": { | ||||
| "200": { | "200": { | ||||
| "description": "A successful response.", | "description": "A successful response.", | ||||
| @@ -80,16 +66,7 @@ | |||||
| "$ref": "#/definitions/rpcStatus" | "$ref": "#/definitions/rpcStatus" | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| }, | |||||
| "/apis/ecs/all": { | |||||
| "post": { | |||||
| "tags": [ | |||||
| "EcsService" | |||||
| ], | |||||
| "summary": "查询所有云的ECS", | |||||
| "operationId": "EcsService_ListEcsAll", | |||||
| }, | |||||
| "parameters": [ | "parameters": [ | ||||
| { | { | ||||
| "name": "body", | "name": "body", | ||||
| @@ -100,11 +77,20 @@ | |||||
| } | } | ||||
| } | } | ||||
| ], | ], | ||||
| "tags": [ | |||||
| "EcsService" | |||||
| ] | |||||
| } | |||||
| }, | |||||
| "/apis/ecs/detail": { | |||||
| "post": { | |||||
| "summary": "查询ECS明细 - 支持云类型、区域、账户、分页等过滤条件", | |||||
| "operationId": "EcsService_ListEcsDetail", | |||||
| "responses": { | "responses": { | ||||
| "200": { | "200": { | ||||
| "description": "A successful response.", | "description": "A successful response.", | ||||
| "schema": { | "schema": { | ||||
| "$ref": "#/definitions/pbecsListResp" | |||||
| "$ref": "#/definitions/pbecsListDetailResp" | |||||
| } | } | ||||
| }, | }, | ||||
| "default": { | "default": { | ||||
| @@ -113,16 +99,7 @@ | |||||
| "$ref": "#/definitions/rpcStatus" | "$ref": "#/definitions/rpcStatus" | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| }, | |||||
| "/apis/ecs/detail": { | |||||
| "post": { | |||||
| "tags": [ | |||||
| "EcsService" | |||||
| ], | |||||
| "summary": "查询ECS明细 - 支持云类型、区域、账户、分页等过滤条件", | |||||
| "operationId": "EcsService_ListEcsDetail", | |||||
| }, | |||||
| "parameters": [ | "parameters": [ | ||||
| { | { | ||||
| "name": "body", | "name": "body", | ||||
| @@ -133,110 +110,91 @@ | |||||
| } | } | ||||
| } | } | ||||
| ], | ], | ||||
| "responses": { | |||||
| "200": { | |||||
| "description": "A successful response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbecsListDetailResp" | |||||
| } | |||||
| }, | |||||
| "default": { | |||||
| "description": "An unexpected error response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/rpcStatus" | |||||
| } | |||||
| } | |||||
| } | |||||
| "tags": [ | |||||
| "EcsService" | |||||
| ] | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| "definitions": { | "definitions": { | ||||
| "demoStringMessage": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "value": { | |||||
| "type": "string" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbecsEcsInstance": { | "pbecsEcsInstance": { | ||||
| "type": "object", | "type": "object", | ||||
| "properties": { | "properties": { | ||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云类型" | |||||
| }, | |||||
| "accountName": { | "accountName": { | ||||
| "type": "string", | "type": "string", | ||||
| "title": "账号名称" | "title": "账号名称" | ||||
| }, | }, | ||||
| "chargeType": { | |||||
| "type": "string", | |||||
| "title": "收费类型" | |||||
| }, | |||||
| "cpu": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "vcpu数" | |||||
| }, | |||||
| "creationTime": { | |||||
| "instanceId": { | |||||
| "type": "string", | "type": "string", | ||||
| "title": "创建时间,ISO8601" | |||||
| "title": "实例id" | |||||
| }, | }, | ||||
| "description": { | |||||
| "instanceName": { | |||||
| "type": "string", | "type": "string", | ||||
| "title": "实例描述" | |||||
| "title": "实例名称" | |||||
| }, | }, | ||||
| "expireTime": { | |||||
| "regionName": { | |||||
| "type": "string", | "type": "string", | ||||
| "title": "过期时间" | |||||
| "title": "地域,数据中心" | |||||
| }, | }, | ||||
| "innerIps": { | |||||
| "publicIps": { | |||||
| "type": "array", | "type": "array", | ||||
| "title": "内网ip", | |||||
| "items": { | "items": { | ||||
| "type": "string" | "type": "string" | ||||
| } | |||||
| }, | |||||
| "instanceId": { | |||||
| "type": "string", | |||||
| "title": "实例id" | |||||
| }, | |||||
| "instanceName": { | |||||
| "type": "string", | |||||
| "title": "实例名称" | |||||
| }, | |||||
| "title": "公网ip" | |||||
| }, | }, | ||||
| "instanceType": { | "instanceType": { | ||||
| "type": "string", | "type": "string", | ||||
| "title": "实例类型" | "title": "实例类型" | ||||
| }, | }, | ||||
| "cpu": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "vcpu数" | |||||
| }, | |||||
| "memory": { | "memory": { | ||||
| "type": "integer", | "type": "integer", | ||||
| "format": "int32", | "format": "int32", | ||||
| "title": "内存MB" | "title": "内存MB" | ||||
| }, | }, | ||||
| "provider": { | |||||
| "title": "云类型", | |||||
| "$ref": "#/definitions/pbtenantCloudProvider" | |||||
| "description": { | |||||
| "type": "string", | |||||
| "title": "实例描述" | |||||
| }, | }, | ||||
| "publicIps": { | |||||
| "status": { | |||||
| "type": "string", | |||||
| "title": "状态" | |||||
| }, | |||||
| "creationTime": { | |||||
| "type": "string", | |||||
| "title": "创建时间,ISO8601" | |||||
| }, | |||||
| "expireTime": { | |||||
| "type": "string", | |||||
| "title": "过期时间" | |||||
| }, | |||||
| "innerIps": { | |||||
| "type": "array", | "type": "array", | ||||
| "title": "公网ip", | |||||
| "items": { | "items": { | ||||
| "type": "string" | "type": "string" | ||||
| } | |||||
| }, | |||||
| "title": "内网ip" | |||||
| }, | }, | ||||
| "regionName": { | |||||
| "vpcId": { | |||||
| "type": "string", | "type": "string", | ||||
| "title": "地域,数据中心" | |||||
| "title": "vpc id" | |||||
| }, | }, | ||||
| "resourceGroupId": { | "resourceGroupId": { | ||||
| "type": "string", | "type": "string", | ||||
| "title": "资源组id" | "title": "资源组id" | ||||
| }, | }, | ||||
| "status": { | |||||
| "type": "string", | |||||
| "title": "状态" | |||||
| }, | |||||
| "vpcId": { | |||||
| "chargeType": { | |||||
| "type": "string", | "type": "string", | ||||
| "title": "vcp id" | |||||
| "title": "收费类型" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -246,13 +204,18 @@ | |||||
| "pbecsListDetailReq": { | "pbecsListDetailReq": { | ||||
| "type": "object", | "type": "object", | ||||
| "properties": { | "properties": { | ||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云名称" | |||||
| }, | |||||
| "accountName": { | "accountName": { | ||||
| "type": "string", | "type": "string", | ||||
| "title": "账户名称,根据config.yaml中的配置,默认为第一个配置的账户" | "title": "账户名称,根据config.yaml中的配置,默认为第一个配置的账户" | ||||
| }, | }, | ||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| "regionId": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "区域Id,参考 tenant.proto 中的各个云的区域" | |||||
| }, | }, | ||||
| "pageNumber": { | "pageNumber": { | ||||
| "type": "integer", | "type": "integer", | ||||
| @@ -264,14 +227,9 @@ | |||||
| "format": "int32", | "format": "int32", | ||||
| "title": "分页相关参数,每页数量" | "title": "分页相关参数,每页数量" | ||||
| }, | }, | ||||
| "provider": { | |||||
| "title": "云名称", | |||||
| "$ref": "#/definitions/pbtenantCloudProvider" | |||||
| }, | |||||
| "regionId": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "区域Id,参考 tenant.proto 中的各个云的区域" | |||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -280,19 +238,15 @@ | |||||
| "properties": { | "properties": { | ||||
| "ecses": { | "ecses": { | ||||
| "type": "array", | "type": "array", | ||||
| "title": "Ecs 机器集合", | |||||
| "items": { | "items": { | ||||
| "$ref": "#/definitions/pbecsEcsInstance" | "$ref": "#/definitions/pbecsEcsInstance" | ||||
| } | |||||
| }, | |||||
| "title": "Ecs 机器集合" | |||||
| }, | }, | ||||
| "finished": { | "finished": { | ||||
| "type": "boolean", | "type": "boolean", | ||||
| "title": "查询是否完成,如果为否-false,则可以将下面三个分页参数填入到请求中,继续查询" | "title": "查询是否完成,如果为否-false,则可以将下面三个分页参数填入到请求中,继续查询" | ||||
| }, | }, | ||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| }, | |||||
| "pageNumber": { | "pageNumber": { | ||||
| "type": "integer", | "type": "integer", | ||||
| "format": "int32", | "format": "int32", | ||||
| @@ -303,6 +257,10 @@ | |||||
| "format": "int32", | "format": "int32", | ||||
| "title": "分页相关参数,每页数量" | "title": "分页相关参数,每页数量" | ||||
| }, | }, | ||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| }, | |||||
| "requestId": { | "requestId": { | ||||
| "type": "string", | "type": "string", | ||||
| "title": "请求id,出现问题后提供给云厂商,排查问题" | "title": "请求id,出现问题后提供给云厂商,排查问题" | ||||
| @@ -313,8 +271,8 @@ | |||||
| "type": "object", | "type": "object", | ||||
| "properties": { | "properties": { | ||||
| "provider": { | "provider": { | ||||
| "title": "云名称", | |||||
| "$ref": "#/definitions/pbtenantCloudProvider" | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云名称" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -323,24 +281,24 @@ | |||||
| "properties": { | "properties": { | ||||
| "ecses": { | "ecses": { | ||||
| "type": "array", | "type": "array", | ||||
| "title": "Ecs 机器集合", | |||||
| "items": { | "items": { | ||||
| "$ref": "#/definitions/pbecsEcsInstance" | "$ref": "#/definitions/pbecsEcsInstance" | ||||
| } | |||||
| }, | |||||
| "title": "Ecs 机器集合" | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| "pbtenantCloudProvider": { | "pbtenantCloudProvider": { | ||||
| "description": "- ali: 0 - 阿里云\n - tencent: 1 - 腾讯云\n - huawei: 2 - 华为云\n - aws: 3 - 亚马逊云", | |||||
| "type": "string", | "type": "string", | ||||
| "title": "云提供商", | |||||
| "default": "ali", | |||||
| "enum": [ | "enum": [ | ||||
| "ali", | "ali", | ||||
| "tencent", | "tencent", | ||||
| "huawei", | "huawei", | ||||
| "aws" | "aws" | ||||
| ] | |||||
| ], | |||||
| "default": "ali", | |||||
| "description": "- ali: 0 - 阿里云\n - tencent: 1 - 腾讯云\n - huawei: 2 - 华为云\n - aws: 3 - 亚马逊云", | |||||
| "title": "云提供商" | |||||
| }, | }, | ||||
| "protobufAny": { | "protobufAny": { | ||||
| "type": "object", | "type": "object", | ||||
| @@ -361,24 +319,16 @@ | |||||
| "type": "integer", | "type": "integer", | ||||
| "format": "int32" | "format": "int32" | ||||
| }, | }, | ||||
| "message": { | |||||
| "type": "string" | |||||
| }, | |||||
| "details": { | "details": { | ||||
| "type": "array", | "type": "array", | ||||
| "items": { | "items": { | ||||
| "$ref": "#/definitions/protobufAny" | "$ref": "#/definitions/protobufAny" | ||||
| } | } | ||||
| }, | |||||
| "message": { | |||||
| "type": "string" | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| }, | |||||
| "tags": [ | |||||
| { | |||||
| "name": "DemoService" | |||||
| }, | |||||
| { | |||||
| "name": "EcsService" | |||||
| } | |||||
| ] | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,436 @@ | |||||
| { | |||||
| "swagger": "2.0", | |||||
| "info": { | |||||
| "title": "idl/pbpod/pod.proto", | |||||
| "version": "version not set" | |||||
| }, | |||||
| "tags": [ | |||||
| { | |||||
| "name": "PodService" | |||||
| } | |||||
| ], | |||||
| "consumes": [ | |||||
| "application/json" | |||||
| ], | |||||
| "produces": [ | |||||
| "application/json" | |||||
| ], | |||||
| "paths": { | |||||
| "/apis/pod": { | |||||
| "post": { | |||||
| "summary": "查询pod全量 - 根据云类型", | |||||
| "operationId": "PodService_ListPod", | |||||
| "responses": { | |||||
| "200": { | |||||
| "description": "A successful response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodListResp" | |||||
| } | |||||
| }, | |||||
| "default": { | |||||
| "description": "An unexpected error response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/rpcStatus" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "parameters": [ | |||||
| { | |||||
| "name": "body", | |||||
| "in": "body", | |||||
| "required": true, | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodListReq" | |||||
| } | |||||
| } | |||||
| ], | |||||
| "tags": [ | |||||
| "PodService" | |||||
| ] | |||||
| } | |||||
| }, | |||||
| "/apis/pod/create": { | |||||
| "post": { | |||||
| "summary": "创建pod - 支持云类型、区域", | |||||
| "operationId": "PodService_CreatePod", | |||||
| "responses": { | |||||
| "200": { | |||||
| "description": "A successful response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodCreateRep" | |||||
| } | |||||
| }, | |||||
| "default": { | |||||
| "description": "An unexpected error response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/rpcStatus" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "parameters": [ | |||||
| { | |||||
| "name": "body", | |||||
| "in": "body", | |||||
| "required": true, | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodCreateReq" | |||||
| } | |||||
| } | |||||
| ], | |||||
| "tags": [ | |||||
| "PodService" | |||||
| ] | |||||
| } | |||||
| }, | |||||
| "/apis/pod/detail": { | |||||
| "post": { | |||||
| "summary": "查询Pod明细 - 支持云类型、区域、账户、分页等过滤条件", | |||||
| "operationId": "PodService_ListPodDetail", | |||||
| "responses": { | |||||
| "200": { | |||||
| "description": "A successful response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodListDetailResp" | |||||
| } | |||||
| }, | |||||
| "default": { | |||||
| "description": "An unexpected error response.", | |||||
| "schema": { | |||||
| "$ref": "#/definitions/rpcStatus" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "parameters": [ | |||||
| { | |||||
| "name": "body", | |||||
| "in": "body", | |||||
| "required": true, | |||||
| "schema": { | |||||
| "$ref": "#/definitions/pbpodListDetailReq" | |||||
| } | |||||
| } | |||||
| ], | |||||
| "tags": [ | |||||
| "PodService" | |||||
| ] | |||||
| } | |||||
| } | |||||
| }, | |||||
| "definitions": { | |||||
| "pbpodContainer": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "image": { | |||||
| "type": "string", | |||||
| "title": "容器镜像" | |||||
| }, | |||||
| "name": { | |||||
| "type": "string", | |||||
| "title": "容器名称" | |||||
| }, | |||||
| "cpu": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "vcpu数" | |||||
| }, | |||||
| "memory": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "内存MB" | |||||
| }, | |||||
| "restartCount": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "重启次数" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodCreateRep": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "id": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "type": "string" | |||||
| } | |||||
| }, | |||||
| "requestId": { | |||||
| "type": "string" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodCreateReq": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云名称" | |||||
| }, | |||||
| "accountName": { | |||||
| "type": "string", | |||||
| "title": "账户名称,根据config.yaml中的配置,默认为第一个配置的账户" | |||||
| }, | |||||
| "regionId": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "区域Id,参考 tenant.proto 中的各个云的区域" | |||||
| }, | |||||
| "containerImage": { | |||||
| "type": "string", | |||||
| "title": "镜像地址" | |||||
| }, | |||||
| "containerName": { | |||||
| "type": "string", | |||||
| "title": "容器名称" | |||||
| }, | |||||
| "containerGroupName": { | |||||
| "type": "string", | |||||
| "title": "容器实例名称" | |||||
| }, | |||||
| "cpu": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "vcpu数" | |||||
| }, | |||||
| "memory": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "内存MB" | |||||
| }, | |||||
| "namespace": { | |||||
| "type": "string", | |||||
| "title": "namespace (华为云cci必需)" | |||||
| }, | |||||
| "securityGroupId": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "type": "string" | |||||
| }, | |||||
| "title": "安全组id(腾讯云eks必需)" | |||||
| }, | |||||
| "subnetId": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "type": "string" | |||||
| }, | |||||
| "title": "subnet_id 子网id (腾讯云eks必需)" | |||||
| }, | |||||
| "vpcId": { | |||||
| "type": "string", | |||||
| "title": "vpc id (腾讯云eks必需)" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodListDetailReq": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云名称" | |||||
| }, | |||||
| "accountName": { | |||||
| "type": "string", | |||||
| "title": "账户名称,根据config.yaml中的配置,默认为第一个配置的账户" | |||||
| }, | |||||
| "regionId": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "区域Id,参考 tenant.proto 中的各个云的区域" | |||||
| }, | |||||
| "pageNumber": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "分页相关参数,页码" | |||||
| }, | |||||
| "pageSize": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "分页相关参数,每页数量" | |||||
| }, | |||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodListDetailResp": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "pods": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "$ref": "#/definitions/pbpodPodInstance" | |||||
| }, | |||||
| "title": "pod 容器组集合" | |||||
| }, | |||||
| "finished": { | |||||
| "type": "boolean", | |||||
| "title": "查询是否完成,如果为否-false,则可以将下面三个分页参数填入到请求中,继续查询" | |||||
| }, | |||||
| "pageNumber": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "分页相关参数,页码" | |||||
| }, | |||||
| "pageSize": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "分页相关参数,每页数量" | |||||
| }, | |||||
| "nextToken": { | |||||
| "type": "string", | |||||
| "title": "分页相关参数,下一页的token" | |||||
| }, | |||||
| "requestId": { | |||||
| "type": "string", | |||||
| "title": "请求id,出现问题后提供给云厂商,排查问题" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodListReq": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云名称" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodListResp": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "pods": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "$ref": "#/definitions/pbpodPodInstance" | |||||
| }, | |||||
| "title": "Pod 容器组集合" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbpodPodInstance": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "provider": { | |||||
| "$ref": "#/definitions/pbtenantCloudProvider", | |||||
| "title": "云类型" | |||||
| }, | |||||
| "accountName": { | |||||
| "type": "string", | |||||
| "title": "账号名称" | |||||
| }, | |||||
| "instanceId": { | |||||
| "type": "string", | |||||
| "title": "实例id" | |||||
| }, | |||||
| "instanceName": { | |||||
| "type": "string", | |||||
| "title": "实例名称" | |||||
| }, | |||||
| "regionName": { | |||||
| "type": "string", | |||||
| "title": "地域,数据中心" | |||||
| }, | |||||
| "publicIps": { | |||||
| "type": "string", | |||||
| "title": "公网ip" | |||||
| }, | |||||
| "instanceType": { | |||||
| "type": "string", | |||||
| "title": "实例类型" | |||||
| }, | |||||
| "cpu": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "vcpu数" | |||||
| }, | |||||
| "memory": { | |||||
| "type": "integer", | |||||
| "format": "int32", | |||||
| "title": "内存MB" | |||||
| }, | |||||
| "description": { | |||||
| "type": "string", | |||||
| "title": "实例描述" | |||||
| }, | |||||
| "status": { | |||||
| "type": "string", | |||||
| "title": "状态" | |||||
| }, | |||||
| "creationTime": { | |||||
| "type": "string", | |||||
| "title": "创建时间,ISO8601" | |||||
| }, | |||||
| "expireTime": { | |||||
| "type": "string", | |||||
| "title": "过期时间" | |||||
| }, | |||||
| "innerIps": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "type": "string" | |||||
| }, | |||||
| "title": "内网ip" | |||||
| }, | |||||
| "vpcId": { | |||||
| "type": "string", | |||||
| "title": "vpc id" | |||||
| }, | |||||
| "securityGroupId": { | |||||
| "type": "string", | |||||
| "title": "安全组id" | |||||
| }, | |||||
| "SubnetId": { | |||||
| "type": "string", | |||||
| "title": "子网Id" | |||||
| }, | |||||
| "Container": { | |||||
| "$ref": "#/definitions/pbpodContainer", | |||||
| "title": "容器实例" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "pbtenantCloudProvider": { | |||||
| "type": "string", | |||||
| "enum": [ | |||||
| "ali", | |||||
| "tencent", | |||||
| "huawei", | |||||
| "aws" | |||||
| ], | |||||
| "default": "ali", | |||||
| "description": "- ali: 0 - 阿里云\n - tencent: 1 - 腾讯云\n - huawei: 2 - 华为云\n - aws: 3 - 亚马逊云", | |||||
| "title": "云提供商" | |||||
| }, | |||||
| "protobufAny": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "typeUrl": { | |||||
| "type": "string" | |||||
| }, | |||||
| "value": { | |||||
| "type": "string", | |||||
| "format": "byte" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "rpcStatus": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "code": { | |||||
| "type": "integer", | |||||
| "format": "int32" | |||||
| }, | |||||
| "message": { | |||||
| "type": "string" | |||||
| }, | |||||
| "details": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "$ref": "#/definitions/protobufAny" | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| { | |||||
| "swagger": "2.0", | |||||
| "info": { | |||||
| "title": "idl/pbtenant/tenant.proto", | |||||
| "version": "version not set" | |||||
| }, | |||||
| "consumes": [ | |||||
| "application/json" | |||||
| ], | |||||
| "produces": [ | |||||
| "application/json" | |||||
| ], | |||||
| "paths": {}, | |||||
| "definitions": { | |||||
| "protobufAny": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "typeUrl": { | |||||
| "type": "string" | |||||
| }, | |||||
| "value": { | |||||
| "type": "string", | |||||
| "format": "byte" | |||||
| } | |||||
| } | |||||
| }, | |||||
| "rpcStatus": { | |||||
| "type": "object", | |||||
| "properties": { | |||||
| "code": { | |||||
| "type": "integer", | |||||
| "format": "int32" | |||||
| }, | |||||
| "message": { | |||||
| "type": "string" | |||||
| }, | |||||
| "details": { | |||||
| "type": "array", | |||||
| "items": { | |||||
| "$ref": "#/definitions/protobufAny" | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -3,16 +3,17 @@ package main | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "flag" | "flag" | ||||
| "gitlink.org.cn/JCCE/PCM/common/server" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/demo" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | |||||
| "net" | "net" | ||||
| "net/http" | "net/http" | ||||
| "github.com/golang/glog" | "github.com/golang/glog" | ||||
| "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" | "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" | ||||
| "github.com/pkg/errors" | "github.com/pkg/errors" | ||||
| "gitlink.org.cn/JCCE/PCM/common/server" | |||||
| "gitlink.org.cn/JCCE/PCM/common/tenanter" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/demo" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbecs" | |||||
| "gitlink.org.cn/JCCE/PCM/lan_trans/idl/pbpod" | |||||
| "google.golang.org/grpc" | "google.golang.org/grpc" | ||||
| ) | ) | ||||
| @@ -35,6 +36,8 @@ func run() error { | |||||
| return errors.Wrap(err, "RegisterDemoServiceHandlerFromEndpoint error") | return errors.Wrap(err, "RegisterDemoServiceHandlerFromEndpoint error") | ||||
| } else if err = pbecs.RegisterEcsServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts); err != nil { | } else if err = pbecs.RegisterEcsServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts); err != nil { | ||||
| return errors.Wrap(err, "RegisterEcsServiceHandlerFromEndpoint error") | return errors.Wrap(err, "RegisterEcsServiceHandlerFromEndpoint error") | ||||
| } else if err = pbpod.RegisterPodServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts); err != nil { | |||||
| return errors.Wrap(err, "RegisterPoderviceHandlerFromEndpoint error") | |||||
| } | } | ||||
| // Start HTTP server (and proxy calls to gRPC server endpoint) | // Start HTTP server (and proxy calls to gRPC server endpoint) | ||||
| @@ -65,6 +68,7 @@ func main() { | |||||
| s := grpc.NewServer() | s := grpc.NewServer() | ||||
| demo.RegisterDemoServiceServer(s, &server.Server{}) | demo.RegisterDemoServiceServer(s, &server.Server{}) | ||||
| pbecs.RegisterEcsServiceServer(s, &server.Server{}) | pbecs.RegisterEcsServiceServer(s, &server.Server{}) | ||||
| pbpod.RegisterPodServiceServer(s, &server.Server{}) | |||||
| if err = s.Serve(lis); err != nil { | if err = s.Serve(lis); err != nil { | ||||
| glog.Fatalf("failed to serve: %v", err) | glog.Fatalf("failed to serve: %v", err) | ||||