helm app lister

This commit is contained in:
GLYASAI 2021-04-19 17:34:56 +08:00
parent 0c23b0ba30
commit 4c6b153b11
12 changed files with 581 additions and 356 deletions

View File

@ -186,7 +186,7 @@ func (a *ApplicationController) BatchUpdateComponentPorts(w http.ResponseWriter,
func (a *ApplicationController) GetAppStatus(w http.ResponseWriter, r *http.Request) {
app := r.Context().Value(middleware.ContextKey("application")).(*dbmodel.Application)
res, err := handler.GetApplicationHandler().GetStatus(app)
res, err := handler.GetApplicationHandler().GetStatus(r.Context(), app)
if err != nil {
httputil.ReturnBcodeError(r, w, err)
return

View File

@ -22,7 +22,6 @@ import (
"github.com/jinzhu/gorm"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
corev1 "k8s.io/api/core/v1"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
@ -51,7 +50,7 @@ type ApplicationHandler interface {
UpdateConfigGroup(appID, configGroupName string, req *model.UpdateAppConfigGroupReq) (*model.ApplicationConfigGroupResp, error)
BatchUpdateComponentPorts(appID string, ports []*model.AppPort) error
GetStatus(app *dbmodel.Application) (*model.AppStatus, error)
GetStatus(ctx context.Context, app *dbmodel.Application) (*model.AppStatus, error)
GetDetectProcess(ctx context.Context, app *dbmodel.Application) ([]*model.AppDetectProcess, error)
Install(ctx context.Context, app *dbmodel.Application, values string) error
ListServices(ctx context.Context, app *dbmodel.Application) ([]*model.AppService, error)
@ -284,72 +283,21 @@ func (a *ApplicationAction) checkPorts(appID string, ports []*model.AppPort) err
}
// GetStatus -
func (a *ApplicationAction) GetStatus(app *dbmodel.Application) (*model.AppStatus, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
func (a *ApplicationAction) GetStatus(ctx context.Context, app *dbmodel.Application) (*model.AppStatus, error) {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
if app.AppType == "helm" {
return a.getHelmAppStatus(ctx, app)
}
return a.getRainbondAppStatus(ctx, app)
}
func (a *ApplicationAction) getHelmAppStatus(ctx context.Context, app *dbmodel.Application) (*model.AppStatus, error) {
helmApp, err := a.rainbondClient.RainbondV1alpha1().HelmApps(app.TenantID).Get(ctx, app.AppName, metav1.GetOptions{})
if err != nil {
if k8sErrors.IsNotFound(err) {
return nil, errors.WithStack(bcode.ErrApplicationNotFound)
}
return nil, errors.WithStack(err)
}
phase := string(v1alpha1.HelmAppStatusPhaseDetecting)
if string(helmApp.Status.Phase) != "" {
phase = string(helmApp.Status.Phase)
}
labelSelector := labels.FormatLabels(map[string]string{
"app.kubernetes.io/instance": app.AppName,
"app.kubernetes.io/managed-by": "Helm",
})
podList, err := a.kubeClient.CoreV1().Pods(app.TenantID).List(ctx, metav1.ListOptions{
LabelSelector: labelSelector,
})
if err != nil {
return nil, err
}
var cpu, memory int64
for _, pod := range podList.Items {
for _, c := range pod.Spec.Containers {
cpu += c.Resources.Requests.Cpu().MilliValue()
memory += c.Resources.Limits.Memory().Value() / 1024 / 1024
}
}
return &model.AppStatus{
Status: string(helmApp.Status.Status),
Phase: phase,
ValuesTemplate: helmApp.Status.ValuesTemplate,
Cpu: cpu,
Memory: memory,
Readme: helmApp.Status.Readme,
}, nil
}
func (a *ApplicationAction) getRainbondAppStatus(ctx context.Context, app *dbmodel.Application) (*model.AppStatus, error) {
status, err := a.statusCli.GetAppStatus(ctx, &pb.AppStatusReq{
AppId: app.AppID,
})
if err != nil {
return nil, err
return nil, errors.Wrap(err, "get app status")
}
diskUsage := a.getDiskUsage(app.AppID)
res := &model.AppStatus{
Status: status.Status.String(),
Status: status.Status,
Cpu: status.Cpu,
Memory: status.Memory,
Disk: int64(diskUsage),
@ -361,27 +309,23 @@ func (a *ApplicationAction) GetDetectProcess(ctx context.Context, app *dbmodel.A
nctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
helmApp, err := a.rainbondClient.RainbondV1alpha1().HelmApps(app.TenantID).Get(nctx, app.AppName, metav1.GetOptions{})
res, err := a.statusCli.ListHelmAppDetectConditions(nctx, &pb.AppReq{
AppId: app.AppID,
})
if err != nil {
if k8sErrors.IsNotFound(err) {
return nil, errors.WithStack(bcode.ErrApplicationNotFound)
}
return nil, errors.WithStack(err)
return nil, err
}
var processes []*model.AppDetectProcess
for _, condition := range helmApp.Status.Conditions {
if condition.Type == v1alpha1.HelmAppInstalled {
continue
}
processes = append(processes, &model.AppDetectProcess{
Type: string(condition.Type),
Ready: condition.Status == corev1.ConditionTrue,
Error: condition.Message,
var conditions []*model.AppDetectProcess
for _, condition := range res.Conditions {
conditions = append(conditions, &model.AppDetectProcess{
Type: condition.Type,
Ready: condition.Ready,
Error: condition.Error,
})
}
return processes, nil
return conditions, nil
}
func (a *ApplicationAction) Install(ctx context.Context, app *dbmodel.Application, values string) error {

View File

@ -24,11 +24,13 @@ import (
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/db/config"
"github.com/goodrain/rainbond/event"
"github.com/goodrain/rainbond/pkg/generated/clientset/versioned"
etcdutil "github.com/goodrain/rainbond/util/etcd"
k8sutil "github.com/goodrain/rainbond/util/k8s"
"github.com/goodrain/rainbond/worker/appm"
"github.com/goodrain/rainbond/worker/appm/controller"
"github.com/goodrain/rainbond/worker/appm/store"
"github.com/goodrain/rainbond/worker/controllers/helmapp"
"github.com/goodrain/rainbond/worker/discover"
"github.com/goodrain/rainbond/worker/gc"
"github.com/goodrain/rainbond/worker/master"
@ -39,6 +41,7 @@ import (
"os"
"os/signal"
"syscall"
"time"
)
//Run start run
@ -82,11 +85,13 @@ func Run(s *option.Worker) error {
}
s.Config.KubeClient = clientset
rainbondClient := versioned.NewForConfigOrDie(restConfig)
//step 3: create resource store
startCh := channels.NewRingChannel(1024)
updateCh := channels.NewRingChannel(1024)
probeCh := channels.NewRingChannel(1024)
cachestore := store.NewStore(restConfig, clientset, db.GetManager(), s.Config, startCh, probeCh)
cachestore := store.NewStore(restConfig, clientset, rainbondClient, db.GetManager(), s.Config, startCh, probeCh)
appmController := appm.NewAPPMController(clientset, cachestore, startCh, updateCh, probeCh)
if err := appmController.Start(); err != nil {
logrus.Errorf("error starting appm controller: %v", err)
@ -129,10 +134,10 @@ func Run(s *option.Worker) error {
}
defer exporterManager.Stop()
//stopCh := make(chan struct{})
//ctrl := helmapp.NewController(stopCh, restConfig, 5*time.Second, "/tmp/helm/repo/repositories.yaml", "/tmp/helm/cache")
//go ctrl.Start()
//defer close(stopCh)
stopCh := make(chan struct{})
ctrl := helmapp.NewController(stopCh, rainbondClient, 5*time.Second, "/tmp/helm/repo/repositories.yaml", "/tmp/helm/cache")
go ctrl.Start()
defer close(stopCh)
logrus.Info("worker begin running...")

View File

@ -7,6 +7,12 @@ const (
GovernanceModeKubernetesNativeService = "KUBERNETES_NATIVE_SERVICE"
)
// app type
const (
AppTypeRainbond = "rainbond"
AppTypeHelm = "helm"
)
// IsGovernanceModeValid checks if the governanceMode is valid.
func IsGovernanceModeValid(governanceMode string) bool {
return governanceMode == GovernanceModeBuildInServiceMesh || governanceMode == GovernanceModeKubernetesNativeService

View File

@ -40,6 +40,7 @@ type Informer struct {
Events cache.SharedIndexInformer
HorizontalPodAutoscaler cache.SharedIndexInformer
CRD cache.SharedIndexInformer
HelmApp cache.SharedIndexInformer
CRS map[string]cache.SharedIndexInformer
}

View File

@ -19,6 +19,7 @@
package store
import (
"github.com/goodrain/rainbond/pkg/generated/listers/rainbond/v1alpha1"
crdlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
appsv1 "k8s.io/client-go/listers/apps/v1"
autoscalingv2 "k8s.io/client-go/listers/autoscaling/v2beta2"
@ -42,4 +43,5 @@ type Lister struct {
Claims corev1.PersistentVolumeClaimLister
HorizontalPodAutoscaler autoscalingv2.HorizontalPodAutoscalerLister
CRD crdlisters.CustomResourceDefinitionLister
HelmApp v1alpha1.HelmAppLister
}

View File

@ -21,29 +21,29 @@ package store
import (
"context"
"fmt"
"github.com/goodrain/rainbond/api/util/bcode"
"github.com/goodrain/rainbond/pkg/apis/rainbond/v1alpha1"
"github.com/pkg/errors"
"os"
"sync"
"time"
"github.com/goodrain/rainbond/worker/server/pb"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"github.com/goodrain/rainbond/util/constants"
monitorv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
"k8s.io/apimachinery/pkg/types"
"github.com/eapache/channels"
"github.com/goodrain/rainbond/cmd/worker/option"
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/db/model"
rainbondversioned "github.com/goodrain/rainbond/pkg/generated/clientset/versioned"
"github.com/goodrain/rainbond/pkg/generated/informers/externalversions"
"github.com/goodrain/rainbond/util/constants"
k8sutil "github.com/goodrain/rainbond/util/k8s"
"github.com/goodrain/rainbond/worker/appm/conversion"
"github.com/goodrain/rainbond/worker/appm/f"
v1 "github.com/goodrain/rainbond/worker/appm/types/v1"
"github.com/goodrain/rainbond/worker/server/pb"
workerutil "github.com/goodrain/rainbond/worker/util"
"github.com/jinzhu/gorm"
monitorv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
"github.com/sirupsen/logrus"
appsv1 "k8s.io/api/apps/v1"
autoscalingv2 "k8s.io/api/autoscaling/v2beta2"
@ -53,12 +53,13 @@ import (
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
internalclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
internalinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions"
"k8s.io/apimachinery/pkg/api/errors"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
listcorev1 "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
)
@ -85,7 +86,6 @@ type Storer interface {
GetTenantRunningApp(tenantID string) []*v1.AppService
GetNeedBillingStatus(serviceIDs []string) map[string]string
OnDeletes(obj ...interface{})
GetPodLister() listcorev1.PodLister
RegistPodUpdateListener(string, chan<- *corev1.Pod)
UnRegistPodUpdateListener(string)
RegisterVolumeTypeListener(string, chan<- *model.TenantServiceVolumeType)
@ -96,6 +96,8 @@ type Storer interface {
GetServiceMonitorClient() (*versioned.Clientset, error)
GetAppStatus(appID string) (pb.AppStatus_Status, error)
GetAppResources(appID string) (int64, int64, error)
GetHelmApp(namespace, name string) (*v1alpha1.HelmApp, error)
ListPods(namespace string, selector labels.Selector) ([]*corev1.Pod, error)
}
// EventType type of event associated with an informer
@ -152,6 +154,7 @@ type appRuntimeStore struct {
func NewStore(
kubeconfig *rest.Config,
clientset kubernetes.Interface,
rainbondClient rainbondversioned.Interface,
dbmanager db.Manager,
conf option.Config,
startCh *channels.RingChannel,
@ -188,6 +191,11 @@ func NewStore(
infFactory := informers.NewSharedInformerFactoryWithOptions(conf.KubeClient, 10*time.Second,
informers.WithNamespace(corev1.NamespaceAll))
sharedInformer := externalversions.NewSharedInformerFactoryWithOptions(rainbondClient, 10*time.Second,
externalversions.WithNamespace(corev1.NamespaceAll))
store.listers.HelmApp = sharedInformer.Rainbond().V1alpha1().HelmApps().Lister()
store.informers.HelmApp = sharedInformer.Rainbond().V1alpha1().HelmApps().Informer()
store.informers.Namespace = infFactory.Core().V1().Namespaces().Informer()
store.informers.Deployment = infFactory.Apps().V1().Deployments().Informer()
@ -409,7 +417,7 @@ func (a *appRuntimeStore) init() error {
//init leader namespace
leaderNamespace := a.conf.LeaderElectionNamespace
if _, err := a.conf.KubeClient.CoreV1().Namespaces().Get(context.Background(), leaderNamespace, metav1.GetOptions{}); err != nil {
if errors.IsNotFound(err) {
if k8sErrors.IsNotFound(err) {
_, err = a.conf.KubeClient.CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: leaderNamespace,
@ -499,7 +507,8 @@ func (a *appRuntimeStore) checkReplicasetWhetherDelete(app *v1.AppService, rs *a
//delete old version
if v1.GetReplicaSetVersion(current) > v1.GetReplicaSetVersion(rs) {
if rs.Status.Replicas == 0 && rs.Status.ReadyReplicas == 0 && rs.Status.AvailableReplicas == 0 {
if err := a.conf.KubeClient.AppsV1().ReplicaSets(rs.Namespace).Delete(context.Background(), rs.Name, metav1.DeleteOptions{}); err != nil && errors.IsNotFound(err) {
if err := a.conf.KubeClient.AppsV1().ReplicaSets(rs.Namespace).Delete(context.Background(), rs.Name, metav1.DeleteOptions{});
err != nil && k8sErrors.IsNotFound(err) {
logrus.Errorf("delete old version replicaset failure %s", err.Error())
}
}
@ -667,7 +676,7 @@ func (a *appRuntimeStore) OnAdd(obj interface{}) {
}
if smClient != nil {
err := smClient.MonitoringV1().ServiceMonitors(sm.GetNamespace()).Delete(context.Background(), sm.GetName(), metav1.DeleteOptions{})
if err != nil && !errors.IsNotFound(err) {
if err != nil && !k8sErrors.IsNotFound(err) {
logrus.Errorf("delete service monitor failure: %s", err.Error())
}
}
@ -916,7 +925,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
appService := app.(*v1.AppService)
if statefulset := appService.GetStatefulSet(); statefulset != nil {
stateful, err := a.listers.StatefulSet.StatefulSets(statefulset.Namespace).Get(statefulset.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeleteStatefulSet(statefulset)
}
if stateful != nil {
@ -925,7 +934,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
}
if deployment := appService.GetDeployment(); deployment != nil {
deploy, err := a.listers.Deployment.Deployments(deployment.Namespace).Get(deployment.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeleteDeployment(deployment)
}
if deploy != nil {
@ -935,7 +944,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
if services := appService.GetServices(true); services != nil {
for _, service := range services {
se, err := a.listers.Service.Services(service.Namespace).Get(service.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeleteServices(service)
}
if se != nil {
@ -946,7 +955,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
if ingresses := appService.GetIngress(true); ingresses != nil {
for _, ingress := range ingresses {
in, err := a.listers.Ingress.Ingresses(ingress.Namespace).Get(ingress.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeleteIngress(ingress)
}
if in != nil {
@ -957,7 +966,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
if secrets := appService.GetSecrets(true); secrets != nil {
for _, secret := range secrets {
se, err := a.listers.Secret.Secrets(secret.Namespace).Get(secret.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeleteSecrets(secret)
}
if se != nil {
@ -968,7 +977,7 @@ func (a *appRuntimeStore) UpdateGetAppService(serviceID string) *v1.AppService {
if pods := appService.GetPods(true); pods != nil {
for _, pod := range pods {
se, err := a.listers.Pod.Pods(pod.Namespace).Get(pod.Name)
if err != nil && errors.IsNotFound(err) {
if err != nil && k8sErrors.IsNotFound(err) {
appService.DeletePods(pod)
}
if se != nil {
@ -1204,9 +1213,6 @@ func (a *appRuntimeStore) addAbnormalInfo(ai *v1.AbnormalInfo) {
}
}
func (a *appRuntimeStore) GetPodLister() listcorev1.PodLister {
return a.listers.Pod
}
//GetTenantResource get tenant resource
func (a *appRuntimeStore) GetTenantResource(tenantID string) TenantResource {
@ -1500,7 +1506,7 @@ func (a *appRuntimeStore) createOrUpdateImagePullSecret(ns string) error {
curSecret, err := a.secretByKey(types.NamespacedName{Namespace: ns, Name: imagePullSecretName})
if err != nil {
// current secret not exists. create a new one.
if errors.IsNotFound(err) {
if k8sErrors.IsNotFound(err) {
curSecret = &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: rawSecret.Name,
@ -1537,6 +1543,18 @@ func (a *appRuntimeStore) secretByKey(key types.NamespacedName) (*corev1.Secret,
return a.listers.Secret.Secrets(key.Namespace).Get(key.Name)
}
func (a *appRuntimeStore) GetHelmApp(namespace, name string) (*v1alpha1.HelmApp, error) {
helmApp, err := a.listers.HelmApp.HelmApps(namespace).Get(name)
if err != nil && k8sErrors.IsNotFound(err) {
err = errors.Wrap(bcode.ErrApplicationNotFound, "get helm app")
}
return helmApp, err
}
func (a *appRuntimeStore) ListPods(namespace string, selector labels.Selector) ([]*corev1.Pod, error) {
return a.listers.Pod.Pods(namespace).List(selector)
}
func isImagePullSecretEqual(a, b *corev1.Secret) bool {
if len(a.Data) != len(b.Data) {
return false

View File

@ -5,7 +5,6 @@ import (
"github.com/goodrain/rainbond/pkg/generated/clientset/versioned"
"github.com/sirupsen/logrus"
"k8s.io/client-go/rest"
"k8s.io/client-go/util/workqueue"
)
@ -16,10 +15,9 @@ type Controller struct {
controlLoop *ControlLoop
}
func NewController(stopCh chan struct{}, restcfg *rest.Config, resyncPeriod time.Duration,
func NewController(stopCh chan struct{}, clientset versioned.Interface, resyncPeriod time.Duration,
repoFile, repoCache string) *Controller {
queue := workqueue.New()
clientset := versioned.NewForConfigOrDie(restcfg)
storer := NewStorer(clientset, resyncPeriod, queue)
controlLoop := NewControlLoop(clientset, storer, queue, repoFile, repoCache)

View File

@ -8,8 +8,6 @@ import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
)
@ -22,7 +20,7 @@ var _ = math.Inf
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type ServiceVolumeStatus int32
@ -109,7 +107,7 @@ func (x PodStatus_Type) String() string {
}
func (PodStatus_Type) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{22, 0}
return fileDescriptor_f94cf1a886c479d6, []int{23, 0}
}
type AppStatus_Status int32
@ -146,7 +144,7 @@ func (x AppStatus_Status) String() string {
}
func (AppStatus_Status) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{30, 0}
return fileDescriptor_f94cf1a886c479d6, []int{31, 0}
}
type Empty struct {
@ -180,6 +178,45 @@ func (m *Empty) XXX_DiscardUnknown() {
var xxx_messageInfo_Empty proto.InternalMessageInfo
type AppReq struct {
AppId string `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AppReq) Reset() { *m = AppReq{} }
func (m *AppReq) String() string { return proto.CompactTextString(m) }
func (*AppReq) ProtoMessage() {}
func (*AppReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{1}
}
func (m *AppReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AppReq.Unmarshal(m, b)
}
func (m *AppReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AppReq.Marshal(b, m, deterministic)
}
func (m *AppReq) XXX_Merge(src proto.Message) {
xxx_messageInfo_AppReq.Merge(m, src)
}
func (m *AppReq) XXX_Size() int {
return xxx_messageInfo_AppReq.Size(m)
}
func (m *AppReq) XXX_DiscardUnknown() {
xxx_messageInfo_AppReq.DiscardUnknown(m)
}
var xxx_messageInfo_AppReq proto.InternalMessageInfo
func (m *AppReq) GetAppId() string {
if m != nil {
return m.AppId
}
return ""
}
type AppStatusReq struct {
AppId string `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -191,7 +228,7 @@ func (m *AppStatusReq) Reset() { *m = AppStatusReq{} }
func (m *AppStatusReq) String() string { return proto.CompactTextString(m) }
func (*AppStatusReq) ProtoMessage() {}
func (*AppStatusReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{1}
return fileDescriptor_f94cf1a886c479d6, []int{2}
}
func (m *AppStatusReq) XXX_Unmarshal(b []byte) error {
@ -230,7 +267,7 @@ func (m *ServiceRequest) Reset() { *m = ServiceRequest{} }
func (m *ServiceRequest) String() string { return proto.CompactTextString(m) }
func (*ServiceRequest) ProtoMessage() {}
func (*ServiceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{2}
return fileDescriptor_f94cf1a886c479d6, []int{3}
}
func (m *ServiceRequest) XXX_Unmarshal(b []byte) error {
@ -269,7 +306,7 @@ func (m *ServicesRequest) Reset() { *m = ServicesRequest{} }
func (m *ServicesRequest) String() string { return proto.CompactTextString(m) }
func (*ServicesRequest) ProtoMessage() {}
func (*ServicesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{3}
return fileDescriptor_f94cf1a886c479d6, []int{4}
}
func (m *ServicesRequest) XXX_Unmarshal(b []byte) error {
@ -308,7 +345,7 @@ func (m *TenantRequest) Reset() { *m = TenantRequest{} }
func (m *TenantRequest) String() string { return proto.CompactTextString(m) }
func (*TenantRequest) ProtoMessage() {}
func (*TenantRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{4}
return fileDescriptor_f94cf1a886c479d6, []int{5}
}
func (m *TenantRequest) XXX_Unmarshal(b []byte) error {
@ -347,7 +384,7 @@ func (m *StatusMessage) Reset() { *m = StatusMessage{} }
func (m *StatusMessage) String() string { return proto.CompactTextString(m) }
func (*StatusMessage) ProtoMessage() {}
func (*StatusMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{5}
return fileDescriptor_f94cf1a886c479d6, []int{6}
}
func (m *StatusMessage) XXX_Unmarshal(b []byte) error {
@ -386,7 +423,7 @@ func (m *DiskMessage) Reset() { *m = DiskMessage{} }
func (m *DiskMessage) String() string { return proto.CompactTextString(m) }
func (*DiskMessage) ProtoMessage() {}
func (*DiskMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{6}
return fileDescriptor_f94cf1a886c479d6, []int{7}
}
func (m *DiskMessage) XXX_Unmarshal(b []byte) error {
@ -426,7 +463,7 @@ func (m *ServiceAppPodList) Reset() { *m = ServiceAppPodList{} }
func (m *ServiceAppPodList) String() string { return proto.CompactTextString(m) }
func (*ServiceAppPodList) ProtoMessage() {}
func (*ServiceAppPodList) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{7}
return fileDescriptor_f94cf1a886c479d6, []int{8}
}
func (m *ServiceAppPodList) XXX_Unmarshal(b []byte) error {
@ -472,7 +509,7 @@ func (m *MultiServiceAppPodList) Reset() { *m = MultiServiceAppPodList{}
func (m *MultiServiceAppPodList) String() string { return proto.CompactTextString(m) }
func (*MultiServiceAppPodList) ProtoMessage() {}
func (*MultiServiceAppPodList) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{8}
return fileDescriptor_f94cf1a886c479d6, []int{9}
}
func (m *MultiServiceAppPodList) XXX_Unmarshal(b []byte) error {
@ -518,7 +555,7 @@ func (m *ServiceAppPod) Reset() { *m = ServiceAppPod{} }
func (m *ServiceAppPod) String() string { return proto.CompactTextString(m) }
func (*ServiceAppPod) ProtoMessage() {}
func (*ServiceAppPod) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{9}
return fileDescriptor_f94cf1a886c479d6, []int{10}
}
func (m *ServiceAppPod) XXX_Unmarshal(b []byte) error {
@ -608,7 +645,7 @@ func (m *Container) Reset() { *m = Container{} }
func (m *Container) String() string { return proto.CompactTextString(m) }
func (*Container) ProtoMessage() {}
func (*Container) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{10}
return fileDescriptor_f94cf1a886c479d6, []int{11}
}
func (m *Container) XXX_Unmarshal(b []byte) error {
@ -671,7 +708,7 @@ func (m *DeployInfo) Reset() { *m = DeployInfo{} }
func (m *DeployInfo) String() string { return proto.CompactTextString(m) }
func (*DeployInfo) ProtoMessage() {}
func (*DeployInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{11}
return fileDescriptor_f94cf1a886c479d6, []int{12}
}
func (m *DeployInfo) XXX_Unmarshal(b []byte) error {
@ -786,7 +823,7 @@ func (m *TenantResource) Reset() { *m = TenantResource{} }
func (m *TenantResource) String() string { return proto.CompactTextString(m) }
func (*TenantResource) ProtoMessage() {}
func (*TenantResource) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{12}
return fileDescriptor_f94cf1a886c479d6, []int{13}
}
func (m *TenantResource) XXX_Unmarshal(b []byte) error {
@ -867,7 +904,7 @@ func (m *TenantResourceList) Reset() { *m = TenantResourceList{} }
func (m *TenantResourceList) String() string { return proto.CompactTextString(m) }
func (*TenantResourceList) ProtoMessage() {}
func (*TenantResourceList) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{13}
return fileDescriptor_f94cf1a886c479d6, []int{14}
}
func (m *TenantResourceList) XXX_Unmarshal(b []byte) error {
@ -910,7 +947,7 @@ func (m *AddThirdPartyEndpointsReq) Reset() { *m = AddThirdPartyEndpoint
func (m *AddThirdPartyEndpointsReq) String() string { return proto.CompactTextString(m) }
func (*AddThirdPartyEndpointsReq) ProtoMessage() {}
func (*AddThirdPartyEndpointsReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{14}
return fileDescriptor_f94cf1a886c479d6, []int{15}
}
func (m *AddThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
@ -981,7 +1018,7 @@ func (m *UpdThirdPartyEndpointsReq) Reset() { *m = UpdThirdPartyEndpoint
func (m *UpdThirdPartyEndpointsReq) String() string { return proto.CompactTextString(m) }
func (*UpdThirdPartyEndpointsReq) ProtoMessage() {}
func (*UpdThirdPartyEndpointsReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{15}
return fileDescriptor_f94cf1a886c479d6, []int{16}
}
func (m *UpdThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
@ -1051,7 +1088,7 @@ func (m *DelThirdPartyEndpointsReq) Reset() { *m = DelThirdPartyEndpoint
func (m *DelThirdPartyEndpointsReq) String() string { return proto.CompactTextString(m) }
func (*DelThirdPartyEndpointsReq) ProtoMessage() {}
func (*DelThirdPartyEndpointsReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{16}
return fileDescriptor_f94cf1a886c479d6, []int{17}
}
func (m *DelThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
@ -1116,7 +1153,7 @@ func (m *ThirdPartyEndpoint) Reset() { *m = ThirdPartyEndpoint{} }
func (m *ThirdPartyEndpoint) String() string { return proto.CompactTextString(m) }
func (*ThirdPartyEndpoint) ProtoMessage() {}
func (*ThirdPartyEndpoint) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{17}
return fileDescriptor_f94cf1a886c479d6, []int{18}
}
func (m *ThirdPartyEndpoint) XXX_Unmarshal(b []byte) error {
@ -1190,7 +1227,7 @@ func (m *ThirdPartyEndpoints) Reset() { *m = ThirdPartyEndpoints{} }
func (m *ThirdPartyEndpoints) String() string { return proto.CompactTextString(m) }
func (*ThirdPartyEndpoints) ProtoMessage() {}
func (*ThirdPartyEndpoints) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{18}
return fileDescriptor_f94cf1a886c479d6, []int{19}
}
func (m *ThirdPartyEndpoints) XXX_Unmarshal(b []byte) error {
@ -1229,7 +1266,7 @@ func (m *ListPodsBySIDReq) Reset() { *m = ListPodsBySIDReq{} }
func (m *ListPodsBySIDReq) String() string { return proto.CompactTextString(m) }
func (*ListPodsBySIDReq) ProtoMessage() {}
func (*ListPodsBySIDReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{19}
return fileDescriptor_f94cf1a886c479d6, []int{20}
}
func (m *ListPodsBySIDReq) XXX_Unmarshal(b []byte) error {
@ -1269,7 +1306,7 @@ func (m *GetPodDetailReq) Reset() { *m = GetPodDetailReq{} }
func (m *GetPodDetailReq) String() string { return proto.CompactTextString(m) }
func (*GetPodDetailReq) ProtoMessage() {}
func (*GetPodDetailReq) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{20}
return fileDescriptor_f94cf1a886c479d6, []int{21}
}
func (m *GetPodDetailReq) XXX_Unmarshal(b []byte) error {
@ -1318,7 +1355,7 @@ func (m *PodEvent) Reset() { *m = PodEvent{} }
func (m *PodEvent) String() string { return proto.CompactTextString(m) }
func (*PodEvent) ProtoMessage() {}
func (*PodEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{21}
return fileDescriptor_f94cf1a886c479d6, []int{22}
}
func (m *PodEvent) XXX_Unmarshal(b []byte) error {
@ -1382,7 +1419,7 @@ func (m *PodStatus) Reset() { *m = PodStatus{} }
func (m *PodStatus) String() string { return proto.CompactTextString(m) }
func (*PodStatus) ProtoMessage() {}
func (*PodStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{22}
return fileDescriptor_f94cf1a886c479d6, []int{23}
}
func (m *PodStatus) XXX_Unmarshal(b []byte) error {
@ -1456,7 +1493,7 @@ func (m *PodContainer) Reset() { *m = PodContainer{} }
func (m *PodContainer) String() string { return proto.CompactTextString(m) }
func (*PodContainer) ProtoMessage() {}
func (*PodContainer) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{23}
return fileDescriptor_f94cf1a886c479d6, []int{24}
}
func (m *PodContainer) XXX_Unmarshal(b []byte) error {
@ -1553,7 +1590,7 @@ func (m *PodDetail) Reset() { *m = PodDetail{} }
func (m *PodDetail) String() string { return proto.CompactTextString(m) }
func (*PodDetail) ProtoMessage() {}
func (*PodDetail) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{24}
return fileDescriptor_f94cf1a886c479d6, []int{25}
}
func (m *PodDetail) XXX_Unmarshal(b []byte) error {
@ -1655,7 +1692,7 @@ func (m *StorageClasses) Reset() { *m = StorageClasses{} }
func (m *StorageClasses) String() string { return proto.CompactTextString(m) }
func (*StorageClasses) ProtoMessage() {}
func (*StorageClasses) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{25}
return fileDescriptor_f94cf1a886c479d6, []int{26}
}
func (m *StorageClasses) XXX_Unmarshal(b []byte) error {
@ -1700,7 +1737,7 @@ func (m *StorageClassDetail) Reset() { *m = StorageClassDetail{} }
func (m *StorageClassDetail) String() string { return proto.CompactTextString(m) }
func (*StorageClassDetail) ProtoMessage() {}
func (*StorageClassDetail) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{26}
return fileDescriptor_f94cf1a886c479d6, []int{27}
}
func (m *StorageClassDetail) XXX_Unmarshal(b []byte) error {
@ -1781,7 +1818,7 @@ func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} }
func (m *TopologySelectorTerm) String() string { return proto.CompactTextString(m) }
func (*TopologySelectorTerm) ProtoMessage() {}
func (*TopologySelectorTerm) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{27}
return fileDescriptor_f94cf1a886c479d6, []int{28}
}
func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error {
@ -1821,7 +1858,7 @@ func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelect
func (m *TopologySelectorLabelRequirement) String() string { return proto.CompactTextString(m) }
func (*TopologySelectorLabelRequirement) ProtoMessage() {}
func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{28}
return fileDescriptor_f94cf1a886c479d6, []int{29}
}
func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error {
@ -1867,7 +1904,7 @@ func (m *ServiceVolumeStatusMessage) Reset() { *m = ServiceVolumeStatusM
func (m *ServiceVolumeStatusMessage) String() string { return proto.CompactTextString(m) }
func (*ServiceVolumeStatusMessage) ProtoMessage() {}
func (*ServiceVolumeStatusMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{29}
return fileDescriptor_f94cf1a886c479d6, []int{30}
}
func (m *ServiceVolumeStatusMessage) XXX_Unmarshal(b []byte) error {
@ -1896,9 +1933,12 @@ func (m *ServiceVolumeStatusMessage) GetStatus() map[string]ServiceVolumeStatus
}
type AppStatus struct {
Status AppStatus_Status `protobuf:"varint,1,opt,name=status,proto3,enum=pb.AppStatus_Status" json:"status,omitempty"`
Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
Cpu int64 `protobuf:"varint,2,opt,name=cpu,proto3" json:"cpu,omitempty"`
Memory int64 `protobuf:"varint,3,opt,name=memory,proto3" json:"memory,omitempty"`
Phase string `protobuf:"bytes,4,opt,name=phase,proto3" json:"phase,omitempty"`
ValuesTemplate string `protobuf:"bytes,5,opt,name=valuesTemplate,proto3" json:"valuesTemplate,omitempty"`
Readme string `protobuf:"bytes,6,opt,name=readme,proto3" json:"readme,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1908,7 +1948,7 @@ func (m *AppStatus) Reset() { *m = AppStatus{} }
func (m *AppStatus) String() string { return proto.CompactTextString(m) }
func (*AppStatus) ProtoMessage() {}
func (*AppStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{30}
return fileDescriptor_f94cf1a886c479d6, []int{31}
}
func (m *AppStatus) XXX_Unmarshal(b []byte) error {
@ -1929,11 +1969,11 @@ func (m *AppStatus) XXX_DiscardUnknown() {
var xxx_messageInfo_AppStatus proto.InternalMessageInfo
func (m *AppStatus) GetStatus() AppStatus_Status {
func (m *AppStatus) GetStatus() string {
if m != nil {
return m.Status
}
return AppStatus_NIL
return ""
}
func (m *AppStatus) GetCpu() int64 {
@ -1950,11 +1990,127 @@ func (m *AppStatus) GetMemory() int64 {
return 0
}
func (m *AppStatus) GetPhase() string {
if m != nil {
return m.Phase
}
return ""
}
func (m *AppStatus) GetValuesTemplate() string {
if m != nil {
return m.ValuesTemplate
}
return ""
}
func (m *AppStatus) GetReadme() string {
if m != nil {
return m.Readme
}
return ""
}
type AppDetectCondition struct {
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"`
Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AppDetectCondition) Reset() { *m = AppDetectCondition{} }
func (m *AppDetectCondition) String() string { return proto.CompactTextString(m) }
func (*AppDetectCondition) ProtoMessage() {}
func (*AppDetectCondition) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{32}
}
func (m *AppDetectCondition) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AppDetectCondition.Unmarshal(m, b)
}
func (m *AppDetectCondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AppDetectCondition.Marshal(b, m, deterministic)
}
func (m *AppDetectCondition) XXX_Merge(src proto.Message) {
xxx_messageInfo_AppDetectCondition.Merge(m, src)
}
func (m *AppDetectCondition) XXX_Size() int {
return xxx_messageInfo_AppDetectCondition.Size(m)
}
func (m *AppDetectCondition) XXX_DiscardUnknown() {
xxx_messageInfo_AppDetectCondition.DiscardUnknown(m)
}
var xxx_messageInfo_AppDetectCondition proto.InternalMessageInfo
func (m *AppDetectCondition) GetType() string {
if m != nil {
return m.Type
}
return ""
}
func (m *AppDetectCondition) GetReady() bool {
if m != nil {
return m.Ready
}
return false
}
func (m *AppDetectCondition) GetError() string {
if m != nil {
return m.Error
}
return ""
}
type AppDetectConditions struct {
Conditions []*AppDetectCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AppDetectConditions) Reset() { *m = AppDetectConditions{} }
func (m *AppDetectConditions) String() string { return proto.CompactTextString(m) }
func (*AppDetectConditions) ProtoMessage() {}
func (*AppDetectConditions) Descriptor() ([]byte, []int) {
return fileDescriptor_f94cf1a886c479d6, []int{33}
}
func (m *AppDetectConditions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AppDetectConditions.Unmarshal(m, b)
}
func (m *AppDetectConditions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AppDetectConditions.Marshal(b, m, deterministic)
}
func (m *AppDetectConditions) XXX_Merge(src proto.Message) {
xxx_messageInfo_AppDetectConditions.Merge(m, src)
}
func (m *AppDetectConditions) XXX_Size() int {
return xxx_messageInfo_AppDetectConditions.Size(m)
}
func (m *AppDetectConditions) XXX_DiscardUnknown() {
xxx_messageInfo_AppDetectConditions.DiscardUnknown(m)
}
var xxx_messageInfo_AppDetectConditions proto.InternalMessageInfo
func (m *AppDetectConditions) GetConditions() []*AppDetectCondition {
if m != nil {
return m.Conditions
}
return nil
}
func init() {
proto.RegisterEnum("pb.ServiceVolumeStatus", ServiceVolumeStatus_name, ServiceVolumeStatus_value)
proto.RegisterEnum("pb.PodStatus_Type", PodStatus_Type_name, PodStatus_Type_value)
proto.RegisterEnum("pb.AppStatus_Status", AppStatus_Status_name, AppStatus_Status_value)
proto.RegisterType((*Empty)(nil), "pb.Empty")
proto.RegisterType((*AppReq)(nil), "pb.AppReq")
proto.RegisterType((*AppStatusReq)(nil), "pb.AppStatusReq")
proto.RegisterType((*ServiceRequest)(nil), "pb.ServiceRequest")
proto.RegisterType((*ServicesRequest)(nil), "pb.ServicesRequest")
@ -1998,162 +2154,169 @@ func init() {
proto.RegisterType((*ServiceVolumeStatusMessage)(nil), "pb.ServiceVolumeStatusMessage")
proto.RegisterMapType((map[string]ServiceVolumeStatus)(nil), "pb.ServiceVolumeStatusMessage.StatusEntry")
proto.RegisterType((*AppStatus)(nil), "pb.AppStatus")
proto.RegisterType((*AppDetectCondition)(nil), "pb.AppDetectCondition")
proto.RegisterType((*AppDetectConditions)(nil), "pb.AppDetectConditions")
}
func init() {
proto.RegisterFile("app_runtime_server.proto", fileDescriptor_f94cf1a886c479d6)
}
func init() { proto.RegisterFile("app_runtime_server.proto", fileDescriptor_f94cf1a886c479d6) }
var fileDescriptor_f94cf1a886c479d6 = []byte{
// 2217 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x4b, 0x73, 0x1b, 0xc7,
0x11, 0x26, 0x00, 0xe2, 0xd5, 0x20, 0x40, 0x70, 0x24, 0x52, 0x30, 0x6c, 0x59, 0xf2, 0x46, 0x52,
0xa9, 0x24, 0x05, 0xb6, 0x19, 0xab, 0x2c, 0xd9, 0x8a, 0x53, 0x20, 0x00, 0x53, 0x48, 0x40, 0x10,
0xb5, 0x00, 0x93, 0x72, 0x55, 0xaa, 0x50, 0x4b, 0xec, 0x98, 0xde, 0x68, 0x1f, 0xa3, 0x7d, 0xd0,
0xc1, 0x31, 0xb9, 0xe5, 0x9c, 0x9f, 0x90, 0x43, 0x0e, 0xc9, 0x31, 0x97, 0x5c, 0xfc, 0x17, 0xf2,
0x53, 0x7c, 0xc9, 0x0f, 0x48, 0xf5, 0xcc, 0xec, 0x13, 0x4b, 0x33, 0x4c, 0x25, 0x95, 0xdb, 0x4e,
0x4f, 0x7f, 0xd3, 0x3d, 0x3d, 0x3d, 0xfd, 0x98, 0x85, 0x8e, 0xc6, 0xd8, 0xd2, 0x0d, 0x6c, 0xdf,
0xb0, 0xe8, 0xd2, 0xa3, 0xee, 0x25, 0x75, 0x7b, 0xcc, 0x75, 0x7c, 0x87, 0x14, 0xd9, 0xb9, 0x52,
0x85, 0xf2, 0xc8, 0x62, 0xfe, 0x5a, 0x79, 0x08, 0x3b, 0x7d, 0xc6, 0xe6, 0xbe, 0xe6, 0x07, 0x9e,
0x4a, 0xdf, 0x92, 0x7d, 0xa8, 0x20, 0xd0, 0xd0, 0x3b, 0x85, 0xfb, 0x85, 0xc7, 0x75, 0xb5, 0xac,
0x31, 0x36, 0xd6, 0x95, 0x0f, 0xa1, 0x35, 0xa7, 0xee, 0xa5, 0xb1, 0xa2, 0x2a, 0x7d, 0x1b, 0x50,
0xcf, 0x27, 0x77, 0x01, 0x3c, 0x41, 0x89, 0x99, 0xeb, 0x92, 0x32, 0xd6, 0x95, 0x43, 0xd8, 0x95,
0x00, 0x2f, 0x44, 0xdc, 0x83, 0x46, 0x8c, 0xf0, 0x24, 0x04, 0x22, 0x88, 0xa7, 0x3c, 0x83, 0xe6,
0x82, 0xda, 0x9a, 0xed, 0x87, 0x88, 0x77, 0xa1, 0xee, 0x73, 0x42, 0x2c, 0xa2, 0x26, 0x08, 0x63,
0x5d, 0xf9, 0x5d, 0x01, 0x9a, 0x42, 0xef, 0x13, 0xea, 0x79, 0xda, 0x05, 0x25, 0xcf, 0xa1, 0xe2,
0x71, 0x42, 0xa7, 0x70, 0xbf, 0xf4, 0xb8, 0x71, 0x78, 0xb7, 0xc7, 0xce, 0x7b, 0x29, 0x16, 0x39,
0x1a, 0xd9, 0xbe, 0xbb, 0x56, 0x25, 0x73, 0xf7, 0x25, 0x34, 0x12, 0x64, 0xd2, 0x86, 0xd2, 0x1b,
0xba, 0x96, 0xe2, 0xf0, 0x93, 0xdc, 0x86, 0xf2, 0xa5, 0x66, 0x06, 0xb4, 0x53, 0x14, 0x26, 0xe1,
0x83, 0xcf, 0x8a, 0x2f, 0x0a, 0xca, 0x1a, 0x1a, 0x43, 0xc3, 0x7b, 0x13, 0x2a, 0xf0, 0x11, 0x94,
0x75, 0xc3, 0x7b, 0x13, 0xca, 0xef, 0xa2, 0xfc, 0xc4, 0x3c, 0xff, 0x96, 0xc2, 0x05, 0x63, 0xf7,
0x05, 0x40, 0x4c, 0xbc, 0x4e, 0x74, 0x21, 0x29, 0xda, 0x82, 0x3d, 0x69, 0xe0, 0x3e, 0x63, 0x33,
0x47, 0x9f, 0x18, 0x9e, 0x4f, 0x9e, 0x42, 0xd5, 0x31, 0xf5, 0x99, 0xa3, 0x87, 0x2a, 0xec, 0x71,
0x13, 0x24, 0xf9, 0xd4, 0x90, 0x03, 0x99, 0x6d, 0xfa, 0x2d, 0x67, 0x2e, 0x5e, 0xc9, 0x2c, 0x39,
0x94, 0xef, 0x0a, 0x70, 0x70, 0x12, 0x98, 0xbe, 0xb1, 0x29, 0xf4, 0x24, 0x3a, 0xd7, 0x84, 0xe0,
0xa7, 0xb8, 0x56, 0x3e, 0x20, 0x14, 0x81, 0xdc, 0xc2, 0x18, 0x49, 0x7c, 0xf7, 0x0c, 0xda, 0x59,
0x86, 0x1c, 0xc3, 0x3c, 0x4d, 0x1a, 0xa6, 0x71, 0xb8, 0xbf, 0xa1, 0x3a, 0x4a, 0x4a, 0xda, 0xeb,
0xfb, 0x22, 0x34, 0x53, 0x0c, 0xd7, 0x78, 0x30, 0x3a, 0x9f, 0x4e, 0x99, 0xe9, 0xac, 0x71, 0x56,
0x9c, 0x7c, 0x4d, 0x10, 0xc6, 0x3a, 0xfa, 0xb2, 0x9c, 0xf4, 0xd7, 0x8c, 0x76, 0x4a, 0xc2, 0x97,
0x05, 0x69, 0xb1, 0x66, 0x94, 0xbc, 0x03, 0x35, 0xe6, 0xe8, 0x4b, 0x5b, 0xb3, 0x68, 0x67, 0x9b,
0xcf, 0x56, 0x99, 0xa3, 0x4f, 0x35, 0x8b, 0xe2, 0x15, 0xc3, 0x29, 0x83, 0x75, 0xca, 0xc2, 0x9f,
0x98, 0xa3, 0x8f, 0x19, 0xaa, 0x83, 0x64, 0xe9, 0xc1, 0x15, 0xa1, 0x0e, 0x73, 0x74, 0xe1, 0x9b,
0xa4, 0x0f, 0xb0, 0x72, 0x6c, 0x5f, 0x33, 0x6c, 0xea, 0x7a, 0x9d, 0x2a, 0x37, 0xf2, 0x07, 0x1b,
0xbb, 0xee, 0x0d, 0x22, 0x1e, 0x61, 0xda, 0x04, 0x08, 0x95, 0x46, 0x09, 0x97, 0x8e, 0x19, 0x58,
0xd4, 0xeb, 0xd4, 0xee, 0x97, 0x50, 0x69, 0xe6, 0xe8, 0xbf, 0x14, 0x94, 0xee, 0x04, 0x76, 0x33,
0xf8, 0x1c, 0xcb, 0xff, 0x28, 0x6d, 0xf9, 0x26, 0xea, 0x10, 0xa1, 0x92, 0x16, 0xbf, 0x84, 0x7a,
0x44, 0x27, 0x0f, 0xa1, 0x15, 0x69, 0x22, 0xac, 0x22, 0x96, 0x6c, 0x46, 0x54, 0x6e, 0x9b, 0x0f,
0x60, 0xc7, 0xa2, 0x96, 0xe3, 0xae, 0x97, 0xa6, 0x61, 0x19, 0x3e, 0x97, 0x51, 0x52, 0x1b, 0x82,
0x36, 0x41, 0x12, 0xee, 0x62, 0xc5, 0x82, 0xa5, 0x2b, 0x62, 0x04, 0x37, 0x7d, 0x49, 0x85, 0x15,
0x0b, 0x64, 0xd4, 0x50, 0xbe, 0xaf, 0x00, 0x0c, 0xc5, 0x41, 0xd9, 0x5f, 0x3b, 0xe4, 0x3d, 0xa8,
0xa3, 0x3c, 0x8f, 0x69, 0xab, 0x50, 0x68, 0x4c, 0x20, 0x0a, 0xec, 0xa0, 0xc5, 0xe9, 0xd7, 0x81,
0x49, 0x3d, 0xea, 0xcb, 0x83, 0x4e, 0xd1, 0xc8, 0xfb, 0x20, 0x4f, 0xd6, 0xa2, 0xb6, 0x9f, 0x3e,
0x6b, 0xa4, 0x70, 0x47, 0xf2, 0x35, 0xd7, 0x5f, 0x62, 0xac, 0x95, 0xa7, 0x5d, 0xe7, 0x94, 0x85,
0x61, 0x51, 0xf2, 0x0c, 0xb6, 0x19, 0x5e, 0x8c, 0x32, 0x3f, 0xb3, 0x0e, 0x0f, 0x0a, 0x91, 0x7a,
0xbd, 0xf8, 0x16, 0x70, 0x2e, 0xf2, 0x02, 0x6a, 0xd2, 0x07, 0xd1, 0x09, 0x10, 0xf1, 0x5e, 0x06,
0x11, 0xc6, 0x55, 0x81, 0x8a, 0xb8, 0xc9, 0xe7, 0x50, 0xa7, 0xb6, 0xce, 0x1c, 0xc3, 0xf6, 0x43,
0x07, 0xb9, 0x9b, 0x81, 0x8e, 0xc2, 0x79, 0x81, 0x8d, 0xf9, 0xc9, 0x73, 0xa8, 0x7a, 0x74, 0xe5,
0x52, 0x5f, 0xf8, 0x45, 0xe3, 0xf0, 0xdd, 0x0d, 0xa9, 0x7c, 0x56, 0x00, 0x43, 0x5e, 0x94, 0x69,
0xd8, 0x17, 0x2e, 0xf5, 0x3c, 0xea, 0x75, 0xea, 0xb9, 0x32, 0xc7, 0xe1, 0xbc, 0x94, 0x19, 0xf1,
0x93, 0x3e, 0x34, 0x5c, 0xca, 0x4c, 0x63, 0xa5, 0xf9, 0x68, 0x7a, 0xe0, 0xf0, 0x7b, 0x19, 0xb8,
0x1a, 0x73, 0xc8, 0x60, 0x91, 0xc0, 0x90, 0x83, 0x28, 0xe4, 0x37, 0xb8, 0xd9, 0xc3, 0x98, 0xfe,
0x29, 0xd4, 0x7f, 0x28, 0x7a, 0x5c, 0x19, 0xd1, 0xbb, 0x9f, 0x47, 0x51, 0xe2, 0x3f, 0x00, 0xbf,
0x82, 0x56, 0xda, 0xc2, 0x37, 0x42, 0x7f, 0x06, 0x3b, 0x49, 0x23, 0xdf, 0x54, 0x72, 0xda, 0xce,
0x37, 0x42, 0x7f, 0x01, 0xed, 0xac, 0x99, 0x6f, 0x94, 0x06, 0xff, 0x5a, 0x84, 0x56, 0x98, 0xb9,
0x3d, 0x27, 0x70, 0x57, 0x34, 0x7b, 0x4b, 0x0b, 0xd9, 0x5b, 0x8a, 0xe1, 0x15, 0x19, 0x92, 0xd7,
0xbc, 0xb6, 0x62, 0x81, 0xb8, 0xe3, 0x0f, 0xa1, 0x25, 0xc3, 0x40, 0xfa, 0x9a, 0x37, 0x05, 0x35,
0x5c, 0x23, 0x1b, 0x2d, 0xb6, 0x37, 0xa3, 0xc5, 0x23, 0xd8, 0x75, 0x03, 0xdb, 0x36, 0xec, 0x8b,
0x25, 0xd6, 0x35, 0x76, 0x60, 0xf1, 0xa8, 0x5b, 0x52, 0x9b, 0x92, 0xdc, 0x67, 0x6c, 0x1a, 0x58,
0xe4, 0x63, 0xd8, 0x4f, 0xf2, 0xf9, 0xdf, 0x18, 0xae, 0xce, 0xb9, 0x81, 0x73, 0x93, 0x98, 0x7b,
0x81, 0x53, 0x08, 0xf9, 0x14, 0x3a, 0x49, 0x88, 0x61, 0xfb, 0xd4, 0xb5, 0x35, 0x93, 0xa3, 0x1a,
0x1c, 0xb5, 0x1f, 0xa3, 0xc6, 0x72, 0x76, 0x1a, 0x58, 0xca, 0x5f, 0x0a, 0x40, 0xd2, 0xe6, 0xe2,
0x79, 0x74, 0x00, 0x75, 0x57, 0x8e, 0xc3, 0x2c, 0xfa, 0x10, 0x2f, 0xc3, 0x26, 0x6b, 0x2f, 0x1c,
0x84, 0x77, 0x2a, 0xc2, 0x75, 0x67, 0xd0, 0x4a, 0x4f, 0xe6, 0x1c, 0xe4, 0xe3, 0x74, 0x04, 0x27,
0x9b, 0x42, 0x92, 0x87, 0xfb, 0xfb, 0x02, 0xbc, 0xd3, 0xd7, 0x75, 0xbe, 0xed, 0x99, 0xe6, 0xfa,
0xeb, 0xc8, 0xc5, 0xb1, 0x5e, 0x24, 0xb0, 0x1d, 0x04, 0x51, 0xfa, 0xe4, 0xdf, 0x28, 0xd1, 0x8b,
0x72, 0x26, 0x7e, 0x92, 0x16, 0x14, 0x0d, 0x26, 0x23, 0x67, 0xd1, 0x60, 0x88, 0x62, 0x8e, 0x2b,
0x0e, 0xac, 0xac, 0xf2, 0x6f, 0x74, 0x08, 0xc3, 0x5b, 0x3a, 0xb6, 0x69, 0xd8, 0x94, 0x9f, 0x51,
0x4d, 0xad, 0x19, 0xde, 0x29, 0x1f, 0x73, 0x25, 0xce, 0xd8, 0xff, 0x59, 0x09, 0x0a, 0xef, 0x0c,
0xa9, 0xf9, 0xbf, 0xd6, 0x41, 0xf9, 0x23, 0xba, 0xc7, 0x86, 0x90, 0xff, 0xe2, 0x26, 0xe3, 0xa0,
0x59, 0x4e, 0x06, 0xcd, 0xf4, 0xe6, 0x2b, 0x99, 0xcd, 0xff, 0x0c, 0x6e, 0xe5, 0xec, 0x9c, 0x3c,
0x86, 0x92, 0x73, 0xfe, 0x1b, 0xe9, 0xae, 0x07, 0xdc, 0x93, 0x36, 0xb8, 0x54, 0x64, 0x51, 0x1e,
0x40, 0x1b, 0x7d, 0x17, 0xc3, 0xf2, 0xd1, 0x7a, 0x3e, 0x1e, 0xa2, 0xd1, 0xa4, 0xfe, 0x85, 0x48,
0x7f, 0xe5, 0x0b, 0xd8, 0x3d, 0xa6, 0xc8, 0x34, 0xa4, 0xbe, 0x66, 0x98, 0xb9, 0x4c, 0xa9, 0xe2,
0xaa, 0x98, 0x2a, 0xae, 0x94, 0x73, 0xa8, 0xcd, 0x1c, 0x7d, 0x74, 0x49, 0x85, 0xc5, 0x78, 0x75,
0x26, 0x2d, 0x86, 0xdf, 0xb8, 0x77, 0x97, 0x6a, 0x9e, 0x63, 0x4b, 0xa0, 0x1c, 0xa1, 0x10, 0xed,
0x22, 0x2c, 0xe4, 0xf0, 0x93, 0x74, 0xa0, 0x6a, 0x89, 0xba, 0x5d, 0x9a, 0x29, 0x1c, 0x2a, 0xdf,
0x15, 0x79, 0x76, 0x91, 0x85, 0xd9, 0xa3, 0x84, 0x94, 0x96, 0xb8, 0x4c, 0xd1, 0x64, 0x0f, 0x6b,
0xc1, 0x6b, 0x24, 0x27, 0xe4, 0x94, 0x52, 0x72, 0x10, 0xa1, 0xe9, 0x98, 0x8a, 0x64, 0x4d, 0x21,
0x47, 0xb8, 0x7d, 0x5c, 0x71, 0xe9, 0xf9, 0x6e, 0xa8, 0x1a, 0x8e, 0xe7, 0xbe, 0xab, 0xfc, 0xa9,
0x00, 0xdb, 0xbc, 0xfe, 0x6c, 0x40, 0x75, 0x36, 0x9a, 0x0e, 0xc7, 0xd3, 0xe3, 0xf6, 0x16, 0x0e,
0xd4, 0xb3, 0xe9, 0x14, 0x07, 0x05, 0xd2, 0x84, 0xfa, 0xfc, 0x6c, 0x30, 0x18, 0x8d, 0x86, 0xa3,
0x61, 0xbb, 0x48, 0x00, 0x2a, 0x5f, 0xf6, 0xc7, 0x93, 0xd1, 0xb0, 0x5d, 0x42, 0xbe, 0xb3, 0xe9,
0x2f, 0xa6, 0xa7, 0xbf, 0x9a, 0xb6, 0xb7, 0x49, 0x0b, 0x60, 0x31, 0x3a, 0x19, 0x4f, 0xfb, 0x0b,
0xc4, 0x95, 0xc9, 0x0e, 0xd4, 0xfa, 0x47, 0xd3, 0x53, 0xf5, 0xa4, 0x3f, 0x69, 0x57, 0x70, 0x76,
0x3c, 0x1d, 0x2f, 0xc6, 0x62, 0xb6, 0x8a, 0xe3, 0xf9, 0xe0, 0xf5, 0x68, 0x78, 0x36, 0xc1, 0x71,
0x0d, 0xb9, 0xa7, 0xa7, 0x0b, 0x75, 0xd4, 0x1f, 0x7e, 0xd5, 0xae, 0xa3, 0xcc, 0xb3, 0xe9, 0xeb,
0x51, 0x7f, 0xb2, 0x78, 0xfd, 0x55, 0x1b, 0x94, 0x7f, 0x16, 0x60, 0x67, 0xe6, 0xe8, 0x71, 0x75,
0x78, 0x1b, 0xca, 0x86, 0x85, 0x16, 0x90, 0x4d, 0x27, 0x1f, 0x20, 0x95, 0xd7, 0x61, 0x61, 0xc2,
0xe1, 0x83, 0x84, 0x1d, 0x4b, 0x59, 0x3b, 0xf2, 0x9a, 0x8b, 0xea, 0x61, 0xc1, 0x2d, 0x87, 0x98,
0x26, 0x78, 0x7e, 0x58, 0x8a, 0xc4, 0x20, 0x6d, 0xd6, 0xe0, 0xb4, 0x13, 0x4e, 0x42, 0xd7, 0x17,
0x2c, 0x2b, 0x16, 0xc8, 0xda, 0xbb, 0xc6, 0x09, 0x03, 0x16, 0x60, 0x36, 0x92, 0x69, 0x28, 0x5c,
0xa1, 0x2a, 0x6a, 0x57, 0x49, 0x95, 0x6b, 0xdc, 0xc3, 0x72, 0x46, 0xb0, 0xe1, 0x2a, 0x35, 0x51,
0x27, 0x4a, 0xd2, 0x80, 0x05, 0xca, 0x3f, 0x84, 0xdf, 0x08, 0xcf, 0x46, 0xef, 0x4c, 0xd4, 0xc1,
0xfc, 0x9b, 0xd3, 0x1c, 0x3d, 0xdc, 0x30, 0xff, 0xce, 0x54, 0x97, 0xa5, 0x6c, 0x75, 0xf9, 0x30,
0xba, 0xcc, 0xdb, 0x71, 0x3d, 0x1e, 0x39, 0x60, 0x74, 0xb7, 0x45, 0x5c, 0x28, 0x47, 0x71, 0xe1,
0x0e, 0x54, 0x71, 0x75, 0xec, 0x42, 0xc4, 0x76, 0x2b, 0x38, 0x1c, 0x33, 0x34, 0xe3, 0x25, 0x75,
0x3d, 0xc3, 0xb1, 0xe5, 0x2e, 0xc3, 0x21, 0x79, 0x09, 0xbb, 0x86, 0x8d, 0x26, 0x8a, 0xdb, 0x10,
0x51, 0x2a, 0xb6, 0xa5, 0xc8, 0xb8, 0x0b, 0x68, 0x21, 0x63, 0xdc, 0x4a, 0x90, 0x8f, 0x52, 0xcd,
0x4b, 0xfd, 0x0a, 0x54, 0xb2, 0x57, 0x79, 0x00, 0x15, 0x8a, 0x97, 0xd8, 0x93, 0x65, 0xe1, 0x8e,
0xe4, 0xe6, 0x37, 0x5b, 0x95, 0x73, 0xca, 0x2b, 0x68, 0xcd, 0x7d, 0xc7, 0xd5, 0x2e, 0xe8, 0xc0,
0xd4, 0x78, 0x4d, 0xf9, 0x04, 0xb6, 0x4d, 0x83, 0x17, 0x1c, 0x51, 0x40, 0x4a, 0x72, 0xc8, 0xa8,
0xc2, 0x79, 0x94, 0x3f, 0x97, 0x80, 0x6c, 0x4e, 0xe6, 0x1e, 0xcc, 0x7d, 0x68, 0x30, 0xd7, 0xb9,
0x34, 0xd0, 0x10, 0xd4, 0x95, 0xe7, 0x93, 0x24, 0x91, 0x2f, 0x01, 0x98, 0xe6, 0x6a, 0x16, 0xf5,
0x71, 0x8b, 0x25, 0x2e, 0xfe, 0x51, 0xbe, 0xf8, 0xde, 0x2c, 0x62, 0x94, 0x4d, 0x5a, 0x8c, 0x14,
0xce, 0xb6, 0x32, 0x35, 0xc3, 0x5a, 0x32, 0xc7, 0x34, 0x56, 0x6b, 0xe9, 0xcd, 0x4d, 0x49, 0x9d,
0x71, 0x22, 0xf9, 0x04, 0x0e, 0x34, 0xd3, 0x74, 0xbe, 0x95, 0xdd, 0xdc, 0x92, 0xfe, 0x96, 0x69,
0x36, 0x3f, 0x35, 0x91, 0xb5, 0x6e, 0xf3, 0x59, 0xd1, 0xd8, 0x8d, 0xc2, 0x39, 0xd2, 0x83, 0x5b,
0x92, 0xff, 0xdc, 0xb0, 0x75, 0xac, 0x5c, 0x2c, 0x74, 0x37, 0xe1, 0x01, 0x7b, 0x62, 0xea, 0x48,
0xcc, 0x9c, 0xa0, 0xef, 0x1d, 0x03, 0xe1, 0xeb, 0x50, 0x7d, 0xe9, 0x3b, 0xcc, 0x31, 0x9d, 0x0b,
0x83, 0x86, 0xbd, 0x05, 0x6f, 0x64, 0x16, 0x82, 0xba, 0x9e, 0x53, 0x93, 0xae, 0x7c, 0xc7, 0x5d,
0x50, 0xd7, 0x52, 0xf7, 0x24, 0x66, 0x11, 0x41, 0xba, 0x3f, 0x85, 0xdd, 0xcc, 0xa6, 0x6f, 0x54,
0x60, 0xfa, 0x70, 0x3b, 0x4f, 0x12, 0xf9, 0x35, 0xdc, 0xb1, 0x34, 0x7f, 0xf5, 0xcd, 0xd2, 0xd4,
0xce, 0xa9, 0x89, 0x46, 0xc0, 0x12, 0xd8, 0x70, 0xec, 0xb0, 0x80, 0x7a, 0x90, 0xa7, 0xe4, 0x04,
0x99, 0xb1, 0x86, 0x34, 0x5c, 0x8a, 0x0d, 0x9c, 0xba, 0xcf, 0x17, 0xe1, 0xe4, 0x51, 0xbc, 0x84,
0x32, 0x81, 0xfb, 0xd7, 0x41, 0x73, 0x76, 0x71, 0x00, 0x15, 0xae, 0xb8, 0x78, 0x55, 0xa9, 0xab,
0x72, 0xa4, 0xfc, 0xad, 0x00, 0x5d, 0xd9, 0x5a, 0x88, 0x63, 0x49, 0x3f, 0x5e, 0x1d, 0x65, 0x1e,
0xaf, 0x9e, 0x24, 0x7a, 0xfb, 0x1c, 0xfe, 0xdc, 0x97, 0x2c, 0xf5, 0xba, 0x97, 0xac, 0x1f, 0x27,
0x2d, 0xdc, 0x3a, 0xbc, 0x73, 0x85, 0x8c, 0xa4, 0xe9, 0xff, 0x5e, 0x80, 0x7a, 0xf4, 0x42, 0x48,
0x9e, 0x25, 0xb4, 0xc4, 0x15, 0x6e, 0xe3, 0x0a, 0xd1, 0x74, 0x2f, 0x13, 0x74, 0xda, 0x50, 0xc2,
0x48, 0x28, 0xaa, 0x7b, 0xfc, 0x44, 0xe3, 0xc8, 0x10, 0x2a, 0x0a, 0x7a, 0x39, 0x52, 0x16, 0x50,
0x91, 0x12, 0xaa, 0x50, 0x9a, 0x8e, 0x27, 0xd9, 0xa4, 0x05, 0x50, 0x19, 0x4c, 0x4e, 0xe7, 0x3c,
0x63, 0x25, 0x13, 0x51, 0x09, 0x47, 0xf3, 0x45, 0x5f, 0xe5, 0x69, 0x68, 0x5b, 0x8c, 0x4e, 0x67,
0x33, 0x9e, 0xb2, 0x9e, 0x7c, 0x08, 0xb7, 0x72, 0x76, 0x47, 0xea, 0x50, 0x16, 0x89, 0x69, 0x0b,
0x13, 0xd3, 0xf4, 0x74, 0xb1, 0x14, 0xc3, 0xc2, 0xe1, 0x1f, 0xaa, 0xd0, 0xea, 0x33, 0xa6, 0x8a,
0x67, 0xd3, 0xf9, 0xda, 0x5e, 0x91, 0x23, 0x38, 0x38, 0xa6, 0x7e, 0xb4, 0xc5, 0x21, 0x65, 0x2e,
0x5d, 0x69, 0x98, 0x56, 0x6e, 0x25, 0xac, 0x17, 0x3e, 0x72, 0x76, 0xf7, 0x36, 0xde, 0x1c, 0x95,
0x2d, 0xf2, 0x31, 0xec, 0x24, 0xd7, 0x20, 0xed, 0x94, 0xd5, 0x54, 0xfa, 0xb6, 0xdb, 0x4c, 0x51,
0x94, 0x2d, 0xf2, 0x12, 0x40, 0x40, 0xf8, 0x53, 0x1d, 0x49, 0x88, 0x0a, 0x25, 0xe5, 0x3f, 0x79,
0x29, 0x5b, 0x64, 0xc8, 0x4b, 0x28, 0xfe, 0xf6, 0x16, 0xe2, 0x73, 0x55, 0xed, 0x5e, 0xfd, 0x44,
0xa7, 0x6c, 0x91, 0xe7, 0xd0, 0x3c, 0xa6, 0x7e, 0xe2, 0x1d, 0x25, 0x4f, 0x87, 0x56, 0xba, 0x59,
0x57, 0xb6, 0xc8, 0x2b, 0xd8, 0x3b, 0xa6, 0x7e, 0xa6, 0x19, 0xdc, 0x4b, 0x76, 0x18, 0x02, 0x99,
0xd3, 0x74, 0xf0, 0x5d, 0x93, 0x0d, 0xb4, 0x47, 0xea, 0xc8, 0xcb, 0x9f, 0xab, 0xbb, 0x07, 0xf9,
0x0d, 0x91, 0xb2, 0x45, 0x5e, 0xc3, 0x1d, 0xfc, 0xca, 0xab, 0x51, 0xf3, 0x34, 0xbf, 0x93, 0x5f,
0xaa, 0xa2, 0xe9, 0x07, 0xb0, 0x9f, 0xdb, 0xef, 0x10, 0xfe, 0xb2, 0x71, 0x65, 0x2b, 0xd4, 0x8d,
0xd5, 0x14, 0x8b, 0xe4, 0xf6, 0x2b, 0x62, 0x91, 0x2b, 0x5b, 0x99, 0x8d, 0x45, 0x72, 0x1b, 0x0e,
0x22, 0xdf, 0x58, 0xcc, 0x7f, 0x67, 0x91, 0x4f, 0xb8, 0xf3, 0xc5, 0x75, 0x07, 0xf7, 0x85, 0x4c,
0x8d, 0xdd, 0x0d, 0xab, 0x06, 0x41, 0xe1, 0x28, 0x3c, 0xc7, 0x4c, 0x72, 0x4d, 0x1c, 0x04, 0xc9,
0xa6, 0x36, 0x8a, 0xa6, 0xfb, 0x39, 0x3f, 0xbf, 0x3e, 0x63, 0xa9, 0xfb, 0x96, 0x67, 0xff, 0xf7,
0x7f, 0x38, 0xbc, 0x29, 0x5b, 0xe7, 0x15, 0xfe, 0xb7, 0xe2, 0x27, 0xff, 0x0a, 0x00, 0x00, 0xff,
0xff, 0xd3, 0x7f, 0x3d, 0x80, 0xc9, 0x18, 0x00, 0x00,
// 2322 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x39, 0x4b, 0x73, 0x1b, 0xc7,
0xd1, 0x04, 0x40, 0xbc, 0x1a, 0x04, 0x08, 0x8e, 0x44, 0x12, 0x82, 0x2c, 0x4b, 0xde, 0x4f, 0x52,
0xa9, 0x24, 0x7f, 0xb4, 0xcd, 0x58, 0xb1, 0x64, 0x2b, 0x4e, 0x41, 0x00, 0x4c, 0x22, 0x01, 0x41,
0xd4, 0x02, 0x4c, 0xca, 0x55, 0xa9, 0x42, 0x2d, 0xb1, 0x63, 0x6a, 0xa3, 0x7d, 0x8c, 0xf7, 0x41,
0x07, 0xc7, 0xe4, 0x2f, 0xe4, 0x27, 0xe4, 0x90, 0x43, 0x72, 0xcc, 0xd9, 0x7f, 0xc1, 0x3f, 0xc5,
0x97, 0x5c, 0x72, 0x4b, 0xf5, 0xcc, 0xec, 0x13, 0x4b, 0x31, 0x4c, 0x25, 0x95, 0xdb, 0x76, 0x4f,
0xf7, 0x74, 0x4f, 0x77, 0x4f, 0x3f, 0x66, 0xa1, 0xa3, 0x31, 0xb6, 0x70, 0x03, 0xdb, 0x37, 0x2c,
0xba, 0xf0, 0xa8, 0x7b, 0x49, 0xdd, 0x03, 0xe6, 0x3a, 0xbe, 0x43, 0x8a, 0xec, 0x5c, 0xa9, 0x42,
0x79, 0x68, 0x31, 0x7f, 0xa5, 0xdc, 0x87, 0x4a, 0x8f, 0x31, 0x95, 0x7e, 0x4b, 0x76, 0xa1, 0x82,
0x2c, 0x86, 0xde, 0x29, 0x3c, 0x28, 0x3c, 0xa9, 0xab, 0x65, 0x8d, 0xb1, 0x91, 0xae, 0x3c, 0x82,
0xad, 0x1e, 0x63, 0x33, 0x5f, 0xf3, 0x03, 0xef, 0x1d, 0x64, 0x1f, 0x41, 0x6b, 0x46, 0xdd, 0x4b,
0x63, 0x49, 0x55, 0xfa, 0x6d, 0x40, 0x3d, 0x9f, 0xdc, 0x03, 0xf0, 0x04, 0x26, 0x26, 0xae, 0x4b,
0xcc, 0x48, 0x57, 0x0e, 0x61, 0x5b, 0x32, 0x78, 0x21, 0xc7, 0x7d, 0x68, 0xc4, 0x1c, 0x9e, 0x64,
0x81, 0x88, 0xc5, 0x53, 0x3e, 0x84, 0xe6, 0x9c, 0xda, 0x9a, 0xed, 0x87, 0x1c, 0x77, 0xa1, 0xee,
0x73, 0x44, 0x2c, 0xa2, 0x26, 0x10, 0x23, 0x5d, 0xf9, 0x7d, 0x01, 0x9a, 0x42, 0xef, 0x13, 0xea,
0x79, 0xda, 0x05, 0x25, 0xcf, 0xa1, 0xe2, 0x71, 0x44, 0xa7, 0xf0, 0xa0, 0xf4, 0xa4, 0x71, 0x78,
0xef, 0x80, 0x9d, 0x1f, 0xa4, 0x48, 0x24, 0x34, 0xb4, 0x7d, 0x77, 0xa5, 0x4a, 0xe2, 0xee, 0x4b,
0x68, 0x24, 0xd0, 0xa4, 0x0d, 0xa5, 0xb7, 0x74, 0x25, 0xc5, 0xe1, 0x27, 0xb9, 0x0d, 0xe5, 0x4b,
0xcd, 0x0c, 0x68, 0xa7, 0x28, 0x4c, 0xc2, 0x81, 0xcf, 0x8b, 0x2f, 0x0a, 0xca, 0x0a, 0x1a, 0x03,
0xc3, 0x7b, 0x1b, 0x2a, 0xf0, 0x31, 0x94, 0x75, 0xc3, 0x7b, 0x1b, 0xca, 0xef, 0xa2, 0xfc, 0xc4,
0x3a, 0xff, 0x96, 0xc2, 0x05, 0x61, 0xf7, 0x05, 0x40, 0x8c, 0xbc, 0x4e, 0x74, 0x21, 0x29, 0xda,
0x82, 0x1d, 0x69, 0xe0, 0x1e, 0x63, 0x53, 0x47, 0x1f, 0x1b, 0x9e, 0x4f, 0x9e, 0x41, 0xd5, 0x31,
0xf5, 0xa9, 0xa3, 0x87, 0x2a, 0xec, 0x70, 0x13, 0x24, 0xe9, 0xd4, 0x90, 0x02, 0x89, 0x6d, 0xfa,
0x1d, 0x27, 0x2e, 0x5e, 0x49, 0x2c, 0x29, 0x94, 0xef, 0x0b, 0xb0, 0x77, 0x12, 0x98, 0xbe, 0xb1,
0x2e, 0xf4, 0x24, 0xf2, 0x6b, 0x42, 0xf0, 0x33, 0xdc, 0x2b, 0x9f, 0x21, 0x14, 0x81, 0xd4, 0xc2,
0x18, 0x49, 0xfe, 0xee, 0x19, 0xb4, 0xb3, 0x04, 0x39, 0x86, 0x79, 0x96, 0x34, 0x4c, 0xe3, 0x70,
0x77, 0x4d, 0x75, 0x94, 0x94, 0xb4, 0xd7, 0x8f, 0x45, 0x68, 0xa6, 0x08, 0xae, 0x89, 0x60, 0x0c,
0x3e, 0x9d, 0x32, 0xd3, 0x59, 0xe1, 0xaa, 0xf0, 0x7c, 0x4d, 0x20, 0x46, 0x3a, 0xc6, 0xb2, 0x5c,
0xf4, 0x57, 0x8c, 0x76, 0x4a, 0x22, 0x96, 0x05, 0x6a, 0xbe, 0x62, 0x94, 0xdc, 0x81, 0x1a, 0x73,
0xf4, 0x85, 0xad, 0x59, 0xb4, 0xb3, 0xc9, 0x57, 0xab, 0xcc, 0xd1, 0x27, 0x9a, 0x45, 0xf1, 0x8a,
0xe1, 0x92, 0xc1, 0x3a, 0x65, 0x11, 0x4f, 0xcc, 0xd1, 0x47, 0x0c, 0xd5, 0x41, 0xb4, 0x8c, 0xe0,
0x8a, 0x50, 0x87, 0x39, 0xba, 0x88, 0x4d, 0xd2, 0x03, 0x58, 0x3a, 0xb6, 0xaf, 0x19, 0x36, 0x75,
0xbd, 0x4e, 0x95, 0x1b, 0xf9, 0x83, 0xb5, 0x53, 0x1f, 0xf4, 0x23, 0x1a, 0x61, 0xda, 0x04, 0x13,
0x2a, 0x8d, 0x12, 0x2e, 0x1d, 0x33, 0xb0, 0xa8, 0xd7, 0xa9, 0x3d, 0x28, 0xa1, 0xd2, 0xcc, 0xd1,
0x7f, 0x25, 0x30, 0xdd, 0x31, 0x6c, 0x67, 0xf8, 0x73, 0x2c, 0xff, 0x7f, 0x69, 0xcb, 0x37, 0x51,
0x87, 0x88, 0x2b, 0x69, 0xf1, 0x4b, 0xa8, 0x47, 0x78, 0xf2, 0x08, 0x5a, 0x91, 0x26, 0xc2, 0x2a,
0x62, 0xcb, 0x66, 0x84, 0xe5, 0xb6, 0xf9, 0x00, 0xb6, 0x2c, 0x6a, 0x39, 0xee, 0x6a, 0x61, 0x1a,
0x96, 0xe1, 0x73, 0x19, 0x25, 0xb5, 0x21, 0x70, 0x63, 0x44, 0xe1, 0x29, 0x96, 0x2c, 0x58, 0xb8,
0x22, 0x47, 0x70, 0xd3, 0x97, 0x54, 0x58, 0xb2, 0x40, 0x66, 0x0d, 0xe5, 0xc7, 0x0a, 0xc0, 0x40,
0x38, 0xca, 0xfe, 0xc6, 0x21, 0xef, 0x41, 0x1d, 0xe5, 0x79, 0x4c, 0x5b, 0x86, 0x42, 0x63, 0x04,
0x51, 0x60, 0x0b, 0x2d, 0x4e, 0xbf, 0x09, 0x4c, 0xea, 0x51, 0x5f, 0x3a, 0x3a, 0x85, 0x23, 0xef,
0x83, 0xf4, 0xac, 0x45, 0x6d, 0x3f, 0xed, 0x6b, 0xc4, 0xf0, 0x40, 0xf2, 0x35, 0xd7, 0x5f, 0x60,
0x32, 0x96, 0xde, 0xae, 0x73, 0xcc, 0xdc, 0xb0, 0x28, 0xf9, 0x10, 0x36, 0x19, 0x5e, 0x8c, 0x32,
0xf7, 0x59, 0x87, 0x27, 0x85, 0x48, 0xbd, 0x83, 0xf8, 0x16, 0x70, 0x2a, 0xf2, 0x02, 0x6a, 0x32,
0x06, 0x31, 0x08, 0x90, 0xe3, 0xbd, 0x0c, 0x47, 0x98, 0x57, 0x05, 0x57, 0x44, 0x4d, 0xbe, 0x80,
0x3a, 0xb5, 0x75, 0xe6, 0x18, 0xb6, 0x1f, 0x06, 0xc8, 0xbd, 0x0c, 0xeb, 0x30, 0x5c, 0x17, 0xbc,
0x31, 0x3d, 0x79, 0x0e, 0x55, 0x8f, 0x2e, 0x5d, 0xea, 0x8b, 0xb8, 0x68, 0x1c, 0xde, 0x5d, 0x93,
0xca, 0x57, 0x05, 0x63, 0x48, 0x8b, 0x32, 0x0d, 0xfb, 0xc2, 0xa5, 0x9e, 0x47, 0xbd, 0x4e, 0x3d,
0x57, 0xe6, 0x28, 0x5c, 0x97, 0x32, 0x23, 0x7a, 0xd2, 0x83, 0x86, 0x4b, 0x99, 0x69, 0x2c, 0x35,
0x1f, 0x4d, 0x0f, 0x9c, 0xfd, 0x7e, 0x86, 0x5d, 0x8d, 0x29, 0x64, 0xb2, 0x48, 0xf0, 0x90, 0xbd,
0x28, 0xe5, 0x37, 0xb8, 0xd9, 0xc3, 0x9c, 0xfe, 0x19, 0xd4, 0xdf, 0x95, 0x3d, 0xae, 0xcc, 0xe8,
0xdd, 0x2f, 0xa2, 0x2c, 0xf1, 0x6f, 0x30, 0xbf, 0x82, 0x56, 0xda, 0xc2, 0x37, 0xe2, 0xfe, 0x1c,
0xb6, 0x92, 0x46, 0xbe, 0xa9, 0xe4, 0xb4, 0x9d, 0x6f, 0xc4, 0xfd, 0x25, 0xb4, 0xb3, 0x66, 0xbe,
0x51, 0x19, 0xfc, 0x6b, 0x11, 0x5a, 0x61, 0xe5, 0xf6, 0x9c, 0xc0, 0x5d, 0xd2, 0xec, 0x2d, 0x2d,
0x64, 0x6f, 0x29, 0xa6, 0x57, 0x24, 0x48, 0x5e, 0xf3, 0xda, 0x92, 0x05, 0xe2, 0x8e, 0x3f, 0x82,
0x96, 0x4c, 0x03, 0xe9, 0x6b, 0xde, 0x14, 0xd8, 0x70, 0x8f, 0x6c, 0xb6, 0xd8, 0x5c, 0xcf, 0x16,
0x8f, 0x61, 0xdb, 0x0d, 0x6c, 0xdb, 0xb0, 0x2f, 0x16, 0xd8, 0xd7, 0xd8, 0x81, 0xc5, 0xb3, 0x6e,
0x49, 0x6d, 0x4a, 0x74, 0x8f, 0xb1, 0x49, 0x60, 0x91, 0x4f, 0x60, 0x37, 0x49, 0xe7, 0xbf, 0x31,
0x5c, 0x9d, 0x53, 0x03, 0xa7, 0x26, 0x31, 0xf5, 0x1c, 0x97, 0x90, 0xe5, 0x33, 0xe8, 0x24, 0x59,
0x0c, 0xdb, 0xa7, 0xae, 0xad, 0x99, 0x9c, 0xab, 0xc1, 0xb9, 0x76, 0x63, 0xae, 0x91, 0x5c, 0x9d,
0x04, 0x96, 0xf2, 0x97, 0x02, 0x90, 0xb4, 0xb9, 0x78, 0x1d, 0xed, 0x43, 0xdd, 0x95, 0x70, 0x58,
0x45, 0x1f, 0xe1, 0x65, 0x58, 0x27, 0x3d, 0x08, 0x81, 0xf0, 0x4e, 0x45, 0x7c, 0xdd, 0x29, 0xb4,
0xd2, 0x8b, 0x39, 0x8e, 0x7c, 0x92, 0xce, 0xe0, 0x64, 0x5d, 0x48, 0xd2, 0xb9, 0x7f, 0x28, 0xc0,
0x9d, 0x9e, 0xae, 0xf3, 0x63, 0x4f, 0x35, 0xd7, 0x5f, 0x45, 0x21, 0x8e, 0xfd, 0x22, 0x81, 0xcd,
0x20, 0x88, 0xca, 0x27, 0xff, 0x46, 0x89, 0x5e, 0x54, 0x33, 0xf1, 0x93, 0xb4, 0xa0, 0x68, 0x30,
0x99, 0x39, 0x8b, 0x06, 0x43, 0x2e, 0xe6, 0xb8, 0xc2, 0x61, 0x65, 0x95, 0x7f, 0x63, 0x40, 0x18,
0xde, 0xc2, 0xb1, 0x4d, 0xc3, 0xa6, 0xdc, 0x47, 0x35, 0xb5, 0x66, 0x78, 0xa7, 0x1c, 0xe6, 0x4a,
0x9c, 0xb1, 0xff, 0xb1, 0x12, 0x14, 0xee, 0x0c, 0xa8, 0xf9, 0xdf, 0xd6, 0x41, 0xf9, 0x23, 0x86,
0xc7, 0x9a, 0x90, 0xff, 0xe0, 0x21, 0xe3, 0xa4, 0x59, 0x4e, 0x26, 0xcd, 0xf4, 0xe1, 0x2b, 0x99,
0xc3, 0xff, 0x1c, 0x6e, 0xe5, 0x9c, 0x9c, 0x3c, 0x81, 0x92, 0x73, 0xfe, 0x5b, 0x19, 0xae, 0x7b,
0x3c, 0x92, 0xd6, 0xa8, 0x54, 0x24, 0x51, 0x1e, 0x42, 0x1b, 0x63, 0x17, 0xd3, 0xf2, 0xeb, 0xd5,
0x6c, 0x34, 0x40, 0xa3, 0x49, 0xfd, 0x0b, 0x91, 0xfe, 0xca, 0x97, 0xb0, 0x7d, 0x44, 0x91, 0x68,
0x40, 0x7d, 0xcd, 0x30, 0x73, 0x89, 0x52, 0xcd, 0x55, 0x31, 0xd5, 0x5c, 0x29, 0xe7, 0x50, 0x9b,
0x3a, 0xfa, 0xf0, 0x92, 0x0a, 0x8b, 0xf1, 0xee, 0x4c, 0x5a, 0x0c, 0xbf, 0xf1, 0xec, 0x2e, 0xd5,
0x3c, 0xc7, 0x96, 0x8c, 0x12, 0x42, 0x21, 0xda, 0x45, 0xd8, 0xc8, 0xe1, 0x27, 0xe9, 0x40, 0xd5,
0x12, 0x7d, 0xbb, 0x34, 0x53, 0x08, 0x2a, 0xdf, 0x17, 0x79, 0x75, 0x91, 0x8d, 0xd9, 0xe3, 0x84,
0x94, 0x96, 0xb8, 0x4c, 0xd1, 0xe2, 0x01, 0xf6, 0x82, 0xd7, 0x48, 0x4e, 0xc8, 0x29, 0xa5, 0xe4,
0x20, 0x87, 0xa6, 0x63, 0x29, 0x92, 0x3d, 0x85, 0x84, 0xf0, 0xf8, 0xb8, 0xe3, 0xc2, 0xf3, 0xdd,
0x50, 0x35, 0x84, 0x67, 0xbe, 0xab, 0xfc, 0xa9, 0x00, 0x9b, 0xbc, 0xff, 0x6c, 0x40, 0x75, 0x3a,
0x9c, 0x0c, 0x46, 0x93, 0xa3, 0xf6, 0x06, 0x02, 0xea, 0xd9, 0x64, 0x82, 0x40, 0x81, 0x34, 0xa1,
0x3e, 0x3b, 0xeb, 0xf7, 0x87, 0xc3, 0xc1, 0x70, 0xd0, 0x2e, 0x12, 0x80, 0xca, 0x57, 0xbd, 0xd1,
0x78, 0x38, 0x68, 0x97, 0x90, 0xee, 0x6c, 0xf2, 0xcb, 0xc9, 0xe9, 0xaf, 0x27, 0xed, 0x4d, 0xd2,
0x02, 0x98, 0x0f, 0x4f, 0x46, 0x93, 0xde, 0x1c, 0xf9, 0xca, 0x64, 0x0b, 0x6a, 0xbd, 0xd7, 0x93,
0x53, 0xf5, 0xa4, 0x37, 0x6e, 0x57, 0x70, 0x75, 0x34, 0x19, 0xcd, 0x47, 0x62, 0xb5, 0x8a, 0xf0,
0xac, 0x7f, 0x3c, 0x1c, 0x9c, 0x8d, 0x11, 0xae, 0x21, 0xf5, 0xe4, 0x74, 0xae, 0x0e, 0x7b, 0x83,
0xaf, 0xdb, 0x75, 0x94, 0x79, 0x36, 0x39, 0x1e, 0xf6, 0xc6, 0xf3, 0xe3, 0xaf, 0xdb, 0xa0, 0xfc,
0xbd, 0x00, 0x5b, 0x53, 0x47, 0x8f, 0xbb, 0xc3, 0xdb, 0x50, 0x36, 0x2c, 0xb4, 0x80, 0x1c, 0x3a,
0x39, 0x80, 0x58, 0xde, 0x87, 0x85, 0x05, 0x87, 0x03, 0x09, 0x3b, 0x96, 0xb2, 0x76, 0xe4, 0x3d,
0x17, 0xd5, 0xc3, 0x86, 0x5b, 0x82, 0x58, 0x26, 0x78, 0x7d, 0x58, 0x88, 0xc2, 0x20, 0x6d, 0xd6,
0xe0, 0xb8, 0x13, 0x8e, 0xc2, 0xd0, 0x17, 0x24, 0x4b, 0x16, 0xc8, 0xde, 0xbb, 0xc6, 0x11, 0x7d,
0x16, 0x60, 0x35, 0x92, 0x65, 0x28, 0xdc, 0xa1, 0x2a, 0x7a, 0x57, 0x89, 0x95, 0x7b, 0xdc, 0xc7,
0x76, 0x46, 0x90, 0xe1, 0x2e, 0x35, 0xd1, 0x27, 0x4a, 0x54, 0x9f, 0x05, 0xca, 0x0f, 0x22, 0x6e,
0x44, 0x64, 0x63, 0x74, 0x26, 0xfa, 0x60, 0xfe, 0xcd, 0x71, 0x8e, 0x1e, 0x1e, 0x98, 0x7f, 0x67,
0xba, 0xcb, 0x52, 0xb6, 0xbb, 0x7c, 0x14, 0x5d, 0xe6, 0xcd, 0xb8, 0x1f, 0x8f, 0x02, 0x30, 0xba,
0xdb, 0x22, 0x2f, 0x94, 0xa3, 0xbc, 0xb0, 0x0f, 0x55, 0xdc, 0x1d, 0xa7, 0x10, 0x71, 0xdc, 0x0a,
0x82, 0x23, 0x86, 0x66, 0xbc, 0xa4, 0xae, 0x67, 0x38, 0xb6, 0x3c, 0x65, 0x08, 0x92, 0x97, 0xb0,
0x6d, 0xd8, 0x68, 0xa2, 0x78, 0x0c, 0x11, 0xad, 0x62, 0x5b, 0x8a, 0x8c, 0xa7, 0x80, 0x16, 0x12,
0xc6, 0xa3, 0x04, 0xf9, 0x38, 0x35, 0xbc, 0xd4, 0xaf, 0xe0, 0x4a, 0xce, 0x2a, 0x0f, 0xa1, 0x42,
0xf1, 0x12, 0x7b, 0xb2, 0x2d, 0xdc, 0x92, 0xd4, 0xfc, 0x66, 0xab, 0x72, 0x4d, 0x79, 0x05, 0xad,
0x99, 0xef, 0xb8, 0xda, 0x05, 0xed, 0x9b, 0x1a, 0xef, 0x29, 0x9f, 0xc2, 0xa6, 0x69, 0xf0, 0x86,
0x23, 0x4a, 0x48, 0x49, 0x0a, 0x99, 0x55, 0x38, 0x8d, 0xf2, 0xe7, 0x12, 0x90, 0xf5, 0xc5, 0x5c,
0xc7, 0x3c, 0x80, 0x06, 0x73, 0x9d, 0x4b, 0x03, 0x0d, 0x41, 0x5d, 0xe9, 0x9f, 0x24, 0x8a, 0x7c,
0x05, 0xc0, 0x34, 0x57, 0xb3, 0xa8, 0x8f, 0x47, 0x2c, 0x71, 0xf1, 0x8f, 0xf3, 0xc5, 0x1f, 0x4c,
0x23, 0x42, 0x39, 0xa4, 0xc5, 0x9c, 0x22, 0xd8, 0x96, 0xa6, 0x66, 0x58, 0x0b, 0xe6, 0x98, 0xc6,
0x72, 0x25, 0xa3, 0xb9, 0x29, 0xb1, 0x53, 0x8e, 0x24, 0x9f, 0xc2, 0x9e, 0x66, 0x9a, 0xce, 0x77,
0x72, 0x9a, 0x5b, 0xd0, 0xdf, 0x31, 0xcd, 0xe6, 0x5e, 0x13, 0x55, 0xeb, 0x36, 0x5f, 0x15, 0x83,
0xdd, 0x30, 0x5c, 0x23, 0x07, 0x70, 0x4b, 0xd2, 0x9f, 0x1b, 0xb6, 0x8e, 0x9d, 0x8b, 0x85, 0xe1,
0x26, 0x22, 0x60, 0x47, 0x2c, 0xbd, 0x16, 0x2b, 0x27, 0x18, 0x7b, 0x47, 0x40, 0xf8, 0x3e, 0x54,
0x5f, 0xf8, 0x0e, 0x73, 0x4c, 0xe7, 0xc2, 0xa0, 0xe1, 0x6c, 0xc1, 0x07, 0x99, 0xb9, 0xc0, 0xae,
0x66, 0xd4, 0xa4, 0x4b, 0xdf, 0x71, 0xe7, 0xd4, 0xb5, 0xd4, 0x1d, 0xc9, 0x33, 0x8f, 0x58, 0xba,
0x3f, 0x83, 0xed, 0xcc, 0xa1, 0x6f, 0xd4, 0x60, 0xfa, 0x70, 0x3b, 0x4f, 0x12, 0xf9, 0x0d, 0xec,
0x5b, 0x9a, 0xbf, 0x7c, 0xb3, 0x30, 0xb5, 0x73, 0x6a, 0xa2, 0x11, 0xb0, 0x05, 0x36, 0x1c, 0x3b,
0x6c, 0xa0, 0x1e, 0xe6, 0x29, 0x39, 0x46, 0x62, 0xec, 0x21, 0x0d, 0x97, 0xe2, 0x00, 0xa7, 0xee,
0xf2, 0x4d, 0x38, 0x7a, 0x18, 0x6f, 0xa1, 0x8c, 0xe1, 0xc1, 0x75, 0xac, 0x39, 0xa7, 0xd8, 0x83,
0x0a, 0x57, 0x5c, 0xbc, 0xaa, 0xd4, 0x55, 0x09, 0x29, 0x7f, 0x2b, 0x40, 0x57, 0x8e, 0x16, 0xc2,
0x2d, 0xe9, 0xc7, 0xab, 0xd7, 0x99, 0xc7, 0xab, 0xa7, 0x89, 0xd9, 0x3e, 0x87, 0x3e, 0xf7, 0x25,
0x4b, 0xbd, 0xee, 0x25, 0xeb, 0xff, 0x93, 0x16, 0x6e, 0x1d, 0xee, 0x5f, 0x21, 0x23, 0x69, 0xfa,
0x7f, 0x14, 0xa0, 0x1e, 0xbd, 0x10, 0x26, 0x5a, 0x87, 0x42, 0xaa, 0x75, 0x68, 0x43, 0x09, 0x73,
0x9e, 0xe8, 0xe3, 0xf1, 0x13, 0x29, 0x65, 0xb2, 0x14, 0xad, 0xbb, 0x84, 0xd0, 0xc9, 0xec, 0x8d,
0xe6, 0x85, 0x35, 0x4d, 0x00, 0xe4, 0x31, 0xb4, 0x84, 0x99, 0xe6, 0xd4, 0x62, 0x26, 0xe6, 0x7c,
0x91, 0xaa, 0x32, 0x58, 0x99, 0xfc, 0x75, 0x2b, 0x8c, 0x59, 0x09, 0x29, 0x73, 0xa8, 0x48, 0x0d,
0xab, 0x50, 0x9a, 0x8c, 0xc6, 0xd9, 0xa2, 0x07, 0x50, 0xe9, 0x8f, 0x4f, 0x67, 0xbc, 0xe2, 0x25,
0x0b, 0x59, 0x09, 0xa1, 0xd9, 0xbc, 0xa7, 0xf2, 0x32, 0xb6, 0x29, 0xa0, 0xd3, 0xe9, 0x94, 0x97,
0x3c, 0x65, 0x0e, 0xa4, 0xc7, 0xd8, 0x80, 0xfa, 0x74, 0x89, 0xd9, 0x4c, 0x37, 0x7c, 0xbc, 0x44,
0x79, 0x6d, 0xc5, 0x6d, 0x28, 0xa3, 0x26, 0x2b, 0x6e, 0x81, 0x9a, 0x2a, 0x00, 0xc4, 0x52, 0xd7,
0x75, 0x5c, 0x99, 0xb5, 0x05, 0xa0, 0x9c, 0xc0, 0xad, 0xf5, 0x5d, 0x3d, 0xf2, 0x53, 0x9e, 0x23,
0x25, 0x94, 0xcc, 0x5f, 0xeb, 0xc4, 0x6a, 0x82, 0xf2, 0xe9, 0x47, 0x70, 0x2b, 0xc7, 0x85, 0xa4,
0x0e, 0x65, 0x51, 0x7d, 0x37, 0xb0, 0xfa, 0x4e, 0x4e, 0xe7, 0x0b, 0x01, 0x16, 0x0e, 0x7f, 0xa8,
0x42, 0xab, 0xc7, 0x98, 0x2a, 0x1e, 0x8f, 0x67, 0x2b, 0x7b, 0x49, 0x5e, 0xc3, 0xde, 0x11, 0xf5,
0x23, 0x37, 0x0f, 0x28, 0x73, 0xe9, 0x52, 0xc3, 0xda, 0x79, 0x2b, 0x11, 0x22, 0xe1, 0x4b, 0x6e,
0x77, 0x67, 0xed, 0x61, 0x55, 0xd9, 0x20, 0x9f, 0xc0, 0x56, 0x72, 0x0f, 0xd2, 0x96, 0xba, 0x47,
0x6f, 0xcb, 0xdd, 0x66, 0x0a, 0xa3, 0x6c, 0x90, 0x97, 0x00, 0x82, 0x85, 0xbf, 0x47, 0x92, 0x84,
0xa8, 0x50, 0x52, 0xfe, 0xbb, 0x9e, 0xb2, 0x41, 0x06, 0xbc, 0x4f, 0xe4, 0x0f, 0x8c, 0x21, 0x7f,
0xae, 0xaa, 0xdd, 0xab, 0xdf, 0x21, 0x95, 0x0d, 0xf2, 0x1c, 0x9a, 0x47, 0xd4, 0x4f, 0x3c, 0x16,
0xe5, 0xe9, 0xd0, 0x4a, 0xbf, 0x48, 0x28, 0x1b, 0xe4, 0x15, 0xec, 0x1c, 0x51, 0x3f, 0x33, 0xf1,
0xee, 0x24, 0xc7, 0x28, 0xc1, 0x99, 0x33, 0x59, 0xf1, 0x53, 0x93, 0x35, 0x6e, 0x8f, 0xd4, 0x91,
0x96, 0x3f, 0xda, 0x77, 0xf7, 0xf2, 0xa7, 0x3e, 0x65, 0x83, 0x1c, 0xc3, 0x3e, 0x7e, 0xe5, 0x35,
0xe2, 0x79, 0x9a, 0xef, 0xe7, 0xf7, 0xe3, 0x68, 0xfa, 0x3e, 0xec, 0xe6, 0x0e, 0x75, 0x84, 0x3f,
0xdf, 0x5c, 0x39, 0xef, 0x75, 0x63, 0x35, 0xc5, 0x26, 0xb9, 0x43, 0x99, 0xd8, 0xe4, 0xca, 0x79,
0x6d, 0x6d, 0x93, 0xdc, 0xa9, 0x8a, 0xc8, 0x87, 0x24, 0xf3, 0x5f, 0xd9, 0xe4, 0x53, 0x1e, 0x7c,
0x71, 0x73, 0xc5, 0x63, 0x21, 0x33, 0x48, 0x74, 0xc3, 0xd6, 0x48, 0x60, 0x38, 0x17, 0xfa, 0x31,
0xd3, 0x41, 0x24, 0x1c, 0x41, 0xb2, 0xf5, 0x9b, 0xa2, 0xe9, 0x7e, 0xc1, 0xfd, 0xd7, 0x63, 0x2c,
0x75, 0xdf, 0xf2, 0xec, 0xff, 0xfe, 0xbb, 0x73, 0x38, 0x0f, 0xe3, 0xbb, 0xe8, 0xd0, 0x63, 0x6a,
0x5a, 0x79, 0x39, 0x01, 0xe4, 0x8d, 0x41, 0xed, 0xf7, 0xf3, 0x73, 0x81, 0xa7, 0x6c, 0x9c, 0x57,
0xf8, 0x9f, 0x9f, 0x9f, 0xfc, 0x33, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x41, 0x7e, 0x9d, 0x15, 0x1a,
0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6
const _ = grpc.SupportPackageIsVersion4
// AppRuntimeSyncClient is the client API for AppRuntimeSync service.
//
@ -2174,13 +2337,14 @@ type AppRuntimeSyncClient interface {
GetPodDetail(ctx context.Context, in *GetPodDetailReq, opts ...grpc.CallOption) (*PodDetail, error)
GetStorageClasses(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StorageClasses, error)
GetAppVolumeStatus(ctx context.Context, in *ServiceRequest, opts ...grpc.CallOption) (*ServiceVolumeStatusMessage, error)
ListHelmAppDetectConditions(ctx context.Context, in *AppReq, opts ...grpc.CallOption) (*AppDetectConditions, error)
}
type appRuntimeSyncClient struct {
cc grpc.ClientConnInterface
cc *grpc.ClientConn
}
func NewAppRuntimeSyncClient(cc grpc.ClientConnInterface) AppRuntimeSyncClient {
func NewAppRuntimeSyncClient(cc *grpc.ClientConn) AppRuntimeSyncClient {
return &appRuntimeSyncClient{cc}
}
@ -2310,6 +2474,15 @@ func (c *appRuntimeSyncClient) GetAppVolumeStatus(ctx context.Context, in *Servi
return out, nil
}
func (c *appRuntimeSyncClient) ListHelmAppDetectConditions(ctx context.Context, in *AppReq, opts ...grpc.CallOption) (*AppDetectConditions, error) {
out := new(AppDetectConditions)
err := c.cc.Invoke(ctx, "/pb.AppRuntimeSync/ListHelmAppDetectConditions", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// AppRuntimeSyncServer is the server API for AppRuntimeSync service.
type AppRuntimeSyncServer interface {
// Deprecated: -
@ -2327,53 +2500,7 @@ type AppRuntimeSyncServer interface {
GetPodDetail(context.Context, *GetPodDetailReq) (*PodDetail, error)
GetStorageClasses(context.Context, *Empty) (*StorageClasses, error)
GetAppVolumeStatus(context.Context, *ServiceRequest) (*ServiceVolumeStatusMessage, error)
}
// UnimplementedAppRuntimeSyncServer can be embedded to have forward compatible implementations.
type UnimplementedAppRuntimeSyncServer struct {
}
func (*UnimplementedAppRuntimeSyncServer) GetAppStatusDeprecated(ctx context.Context, req *ServicesRequest) (*StatusMessage, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetAppStatusDeprecated not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetAppStatus(ctx context.Context, req *AppStatusReq) (*AppStatus, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetAppStatus not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetAppPods(ctx context.Context, req *ServiceRequest) (*ServiceAppPodList, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetAppPods not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetMultiAppPods(ctx context.Context, req *ServicesRequest) (*MultiServiceAppPodList, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetMultiAppPods not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetDeployInfo(ctx context.Context, req *ServiceRequest) (*DeployInfo, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetDeployInfo not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetTenantResource(ctx context.Context, req *TenantRequest) (*TenantResource, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetTenantResource not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetTenantResources(ctx context.Context, req *Empty) (*TenantResourceList, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetTenantResources not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) ListThirdPartyEndpoints(ctx context.Context, req *ServiceRequest) (*ThirdPartyEndpoints, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListThirdPartyEndpoints not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) AddThirdPartyEndpoint(ctx context.Context, req *AddThirdPartyEndpointsReq) (*Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method AddThirdPartyEndpoint not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) UpdThirdPartyEndpoint(ctx context.Context, req *UpdThirdPartyEndpointsReq) (*Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdThirdPartyEndpoint not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) DelThirdPartyEndpoint(ctx context.Context, req *DelThirdPartyEndpointsReq) (*Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DelThirdPartyEndpoint not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetPodDetail(ctx context.Context, req *GetPodDetailReq) (*PodDetail, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetPodDetail not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetStorageClasses(ctx context.Context, req *Empty) (*StorageClasses, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetStorageClasses not implemented")
}
func (*UnimplementedAppRuntimeSyncServer) GetAppVolumeStatus(ctx context.Context, req *ServiceRequest) (*ServiceVolumeStatusMessage, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetAppVolumeStatus not implemented")
ListHelmAppDetectConditions(context.Context, *AppReq) (*AppDetectConditions, error)
}
func RegisterAppRuntimeSyncServer(s *grpc.Server, srv AppRuntimeSyncServer) {
@ -2632,6 +2759,24 @@ func _AppRuntimeSync_GetAppVolumeStatus_Handler(srv interface{}, ctx context.Con
return interceptor(ctx, in, info, handler)
}
func _AppRuntimeSync_ListHelmAppDetectConditions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AppReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AppRuntimeSyncServer).ListHelmAppDetectConditions(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.AppRuntimeSync/ListHelmAppDetectConditions",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AppRuntimeSyncServer).ListHelmAppDetectConditions(ctx, req.(*AppReq))
}
return interceptor(ctx, in, info, handler)
}
var _AppRuntimeSync_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.AppRuntimeSync",
HandlerType: (*AppRuntimeSyncServer)(nil),
@ -2692,6 +2837,10 @@ var _AppRuntimeSync_serviceDesc = grpc.ServiceDesc{
MethodName: "GetAppVolumeStatus",
Handler: _AppRuntimeSync_GetAppVolumeStatus_Handler,
},
{
MethodName: "ListHelmAppDetectConditions",
Handler: _AppRuntimeSync_ListHelmAppDetectConditions_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "app_runtime_server.proto",

View File

@ -17,10 +17,15 @@ service AppRuntimeSync {
rpc GetPodDetail(GetPodDetailReq) returns (PodDetail) {}
rpc GetStorageClasses(Empty) returns (StorageClasses) {}
rpc GetAppVolumeStatus(ServiceRequest) returns(ServiceVolumeStatusMessage){}
rpc ListHelmAppDetectConditions(AppReq) returns(AppDetectConditions){}
}
message Empty {}
message AppReq {
string app_id = 1;
}
message AppStatusReq {
string app_id = 1;
}
@ -248,7 +253,20 @@ message AppStatus {
STOPPING = 5;
}
Status status = 1;
string status = 1;
int64 cpu = 2;
int64 memory = 3;
string phase = 4;
string valuesTemplate = 5;
string readme = 6;
}
message AppDetectCondition {
string type = 1;
bool ready = 2;
string error = 3;
}
message AppDetectConditions {
repeated AppDetectCondition conditions = 1;
}

View File

@ -21,6 +21,10 @@ package server
import (
"context"
"fmt"
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/pkg/apis/rainbond/v1alpha1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"net"
"strings"
"time"
@ -113,23 +117,103 @@ func (r *RuntimeServer) GetAppStatusDeprecated(ctx context.Context, re *pb.Servi
// GetAppStatus returns the status of application based on the given appId.
func (r *RuntimeServer) GetAppStatus(ctx context.Context, in *pb.AppStatusReq) (*pb.AppStatus, error) {
status, err := r.store.GetAppStatus(in.AppId)
app, err := db.GetManager().ApplicationDao().GetAppByID(in.AppId)
if err != nil {
return nil, err
}
cpu, memory, err := r.store.GetAppResources(in.AppId)
if app.AppType == model.AppTypeHelm {
return r.getHelmAppStatus(app)
}
return r.getRainbondAppStatus(app)
}
func (r *RuntimeServer) getRainbondAppStatus(app *model.Application) (*pb.AppStatus, error) {
status, err := r.store.GetAppStatus(app.AppID)
if err != nil {
return nil, err
}
cpu, memory, err := r.store.GetAppResources(app.AppID)
if err != nil {
return nil, err
}
return &pb.AppStatus{
Status: status,
Status: string(status),
Cpu: cpu,
Memory: memory,
}, nil
}
func (r *RuntimeServer) getHelmAppStatus(app *model.Application) (*pb.AppStatus, error) {
helmApp, err := r.store.GetHelmApp(app.TenantID, app.AppName)
if err != nil {
return nil, err
}
phase := string(v1alpha1.HelmAppStatusPhaseDetecting)
if string(helmApp.Status.Phase) != "" {
phase = string(helmApp.Status.Phase)
}
selector := labels.NewSelector()
instanceReq, _ := labels.NewRequirement("app.kubernetes.io/instance", selection.Equals, []string{app.AppName})
selector = selector.Add(*instanceReq)
managedReq, _ := labels.NewRequirement("app.kubernetes.io/managed-by", selection.Equals, []string{"Helm"})
selector = selector.Add(*managedReq)
pods, err := r.store.ListPods(app.TenantID, selector)
if err != nil {
return nil, err
}
var cpu, memory int64
for _, pod := range pods {
for _, c := range pod.Spec.Containers {
cpu += c.Resources.Requests.Cpu().MilliValue()
memory += c.Resources.Limits.Memory().Value() / 1024 / 1024
}
}
return &pb.AppStatus{
Status: string(helmApp.Status.Status),
Phase: phase,
ValuesTemplate: helmApp.Status.ValuesTemplate,
Cpu: cpu,
Memory: memory,
Readme: helmApp.Status.Readme,
}, nil
}
func (r *RuntimeServer) ListHelmAppDetectConditions(ctx context.Context, appReq *pb.AppReq) (*pb.AppDetectConditions, error) {
app, err := db.GetManager().ApplicationDao().GetAppByID(appReq.AppId)
if err != nil {
return nil, err
}
helmApp, err :=r.store.GetHelmApp(app.TenantID, app.AppName)
if err != nil {
return nil, err
}
var conditions []*pb.AppDetectCondition
for _, condition := range helmApp.Status.Conditions {
if condition.Type == v1alpha1.HelmAppInstalled {
continue
}
conditions = append(conditions, &pb.AppDetectCondition{
Type: string(condition.Type),
Ready: condition.Status == corev1.ConditionTrue,
Error: condition.Message,
})
}
return &pb.AppDetectConditions{
Conditions: conditions,
}, nil
}
//GetTenantResource get tenant resource
//if TenantId is "" will return the sum of the all tenant
func (r *RuntimeServer) GetTenantResource(ctx context.Context, re *pb.TenantRequest) (*pb.TenantResource, error) {