query volume status

This commit is contained in:
凡羊羊 2019-11-28 19:45:04 +08:00
parent 45c76f788c
commit 5229bb0924
18 changed files with 595 additions and 182 deletions

View File

@ -44,6 +44,7 @@ type TenantInterface interface {
TenantResourcesStatus(w http.ResponseWriter, r *http.Request)
VolumeProvider(w http.ResponseWriter, r *http.Request)
VolumeBestSelector(w http.ResponseWriter, r *http.Request)
GetVolumesStatus(w http.ResponseWriter, r *http.Request)
}
//ServiceInterface ServiceInterface

View File

@ -201,6 +201,7 @@ func (v2 *V2) serviceRouter() chi.Router {
r.Post("/volumes", middleware.WrapEL(controller.AddVolume, dbmodel.TargetTypeService, "add-service-volume", dbmodel.SYNEVENTTYPE))
r.Put("/volumes", middleware.WrapEL(controller.GetManager().UpdVolume, dbmodel.TargetTypeService, "update-service-volume", dbmodel.SYNEVENTTYPE))
r.Get("/volumes", controller.GetVolume)
r.Get("/volumes-status", controller.GetManager().GetVolumesStatus)
r.Delete("/volumes/{volume_name}", middleware.WrapEL(controller.DeleteVolume, dbmodel.TargetTypeService, "delete-service-volume", dbmodel.SYNEVENTTYPE))
r.Post("/depvolumes", middleware.WrapEL(controller.AddVolumeDependency, dbmodel.TargetTypeService, "add-service-depvolume", dbmodel.SYNEVENTTYPE))
r.Delete("/depvolumes", middleware.WrapEL(controller.DeleteVolumeDependency, dbmodel.TargetTypeService, "delete-service-depvolume", dbmodel.SYNEVENTTYPE))

View File

@ -31,8 +31,55 @@ import (
"github.com/goodrain/rainbond/api/util"
dbmodel "github.com/goodrain/rainbond/db/model"
httputil "github.com/goodrain/rainbond/util/http"
"github.com/jinzhu/gorm"
)
// GetVolumesStatus getvolume status
func (t *TenantStruct) GetVolumesStatus(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /v2/tenants/{tenant_name}/volumes-status v2 GetVolumesStatus
//
// 查询组件存储状态
//
// post volumes-status
//
// ---
// consumes:
// - application/json
// - application/x-protobuf
//
// produces:
// - application/json
// - application/xml
//
// responses:
// default:
// schema:
// description: 统一返回格式
serviceID := r.Context().Value(middleware.ContextKey("service_id")).(string)
volumes, handlerErr := handler.GetServiceManager().GetVolumes(serviceID)
if handlerErr != nil && handlerErr.Error() != gorm.ErrRecordNotFound.Error() {
httputil.ReturnError(r, w, 500, handlerErr.Error())
return
}
var err error
volumeStatusList, err := t.StatusCli.GetAppVolumeStatus(serviceID)
if err != nil {
logrus.Warnf("get volume status error: %s", err.Error())
}
ret := api_model.VolumeWithStatusResp{Status: make(map[string]string)}
if volumeStatusList != nil && volumeStatusList.GetStatus() != nil {
volumeStatus := volumeStatusList.GetStatus()
status := make(map[string]string)
for _, volume := range volumes {
if phrase, ok := volumeStatus[volume.VolumeName]; ok {
status[volume.VolumeName] = phrase.String()
}
}
ret.Status = status
}
httputil.ReturnSuccess(r, w, ret)
}
// VolumeBestSelector best volume by volume filter
func (t *TenantStruct) VolumeBestSelector(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /v2/tenants/{tenant_name}/volume-best v2 VolumeBest

View File

@ -278,3 +278,10 @@ type UpdVolumeReq struct {
FileContent string `json:"file_content"`
VolumePath string `json:"volume_path"`
}
// VolumeWithStatusResp volume status
type VolumeWithStatusResp struct {
ServiceID string `json:"service_id"`
//存储名称
Status map[string]string `json:"status"`
}

View File

@ -368,7 +368,8 @@ func (container *ContainerLog) startLogger() ([]Logger, error) {
configs := getLoggerConfig(container.Config.Env)
var loggers []Logger
for _, config := range configs {
initDriver, err := GetLogDriver(config.Name)
initDriver, err :=
GetLogDriver(config.Name)
if err != nil {
logrus.Warnf("get container log driver failure %s", err.Error())
continue

View File

@ -98,6 +98,16 @@ func (s *startController) startOne(app v1.AppService) error {
return fmt.Errorf("create or check namespace failure %s", err.Error())
}
}
// step 0: create claim
if claims := app.GetClaims(); claims != nil {
for _, claim := range claims {
logrus.Debugf("volume label is : %+v", claim.Labels)
_, err := s.manager.client.CoreV1().PersistentVolumeClaims(app.TenantID).Create(claim)
if err != nil && !errors.IsAlreadyExists(err) {
logrus.Debugf("create claim failure: %s, ignore this volume", err.Error())
}
}
}
//step 1: create configmap
if configs := app.GetConfigMaps(); configs != nil {
for _, config := range configs {

View File

@ -139,6 +139,22 @@ func (s *stopController) stopOne(app v1.AppService) error {
}
}
}
if claims := app.GetClaims(); claims != nil {
for _, claim := range claims {
if claim != nil && claim.GetName() != "" {
// reclaim_policy can be delete, recyle, retain
if claim.Annotations != nil && claim.Annotations["reclaim_policy"] == "Delete" {
err := s.manager.client.CoreV1().PersistentVolumeClaims(app.TenantID).Delete(claim.GetName(), &metav1.DeleteOptions{
GracePeriodSeconds: &gracePeriodSeconds,
})
if err != nil && !errors.IsNotFound(err) {
return fmt.Errorf("delete claim failure: %s", err.Error())
}
s.manager.store.OnDelete(claim)
}
}
}
}
//step 7: waiting endpoint ready
app.Logger.Info("Delete all app model success, will waiting app closed", event.GetLoggerOption("running"))
return s.WaitingReady(app)

View File

@ -35,6 +35,7 @@ type Informer struct {
Endpoints cache.SharedIndexInformer
Nodes cache.SharedIndexInformer
StorageClass cache.SharedIndexInformer
Claim cache.SharedIndexInformer
}
//Start statrt
@ -49,6 +50,8 @@ func (i *Informer) Start(stop chan struct{}) {
go i.ReplicaSet.Run(stop)
go i.Endpoints.Run(stop)
go i.Nodes.Run(stop)
go i.StorageClass.Run(stop)
go i.Claim.Run(stop)
}
//Ready if all kube informers is syncd, store is ready

View File

@ -37,4 +37,5 @@ type Lister struct {
Endpoints corev1.EndpointsLister
Nodes corev1.NodeLister
StorageClass storagev1.StorageClassLister
Claim corev1.PersistentVolumeClaimLister
}

View File

@ -169,6 +169,9 @@ func NewStore(clientset *kubernetes.Clientset,
store.informers.StorageClass = infFactory.Storage().V1().StorageClasses().Informer()
store.listers.StorageClass = infFactory.Storage().V1().StorageClasses().Lister()
store.informers.Claim = infFactory.Core().V1().PersistentVolumeClaims().Informer()
store.listers.Claim = infFactory.Core().V1().PersistentVolumeClaims().Lister()
isThirdParty := func(ep *corev1.Endpoints) bool {
return ep.Labels["service-kind"] == model.ServiceKindThirdParty.String()
}
@ -261,6 +264,8 @@ func NewStore(clientset *kubernetes.Clientset,
store.informers.Endpoints.AddEventHandlerWithResyncPeriod(epEventHandler, time.Second*10)
store.informers.Nodes.AddEventHandlerWithResyncPeriod(store, time.Second*10)
store.informers.StorageClass.AddEventHandlerWithResyncPeriod(store, time.Second*10)
store.informers.Claim.AddEventHandlerWithResyncPeriod(store, time.Second*10)
return store
}
@ -544,6 +549,21 @@ func (a *appRuntimeStore) OnAdd(obj interface{}) {
}
}
}
if claim, ok := obj.(*corev1.PersistentVolumeClaim); ok {
serviceID := claim.Labels["service_id"]
version := claim.Labels["version"]
createrID := claim.Labels["creater_id"]
if serviceID != "" && createrID != "" {
appservice, err := a.getAppService(serviceID, version, createrID, true)
if err == conversion.ErrServiceNotFound {
a.conf.KubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Delete(claim.Name, &metav1.DeleteOptions{})
}
if appservice != nil {
appservice.SetClaim(claim)
return
}
}
}
}
//getAppService if creater is true, will create new app service where not found in store
@ -670,6 +690,22 @@ func (a *appRuntimeStore) OnDelete(obj interface{}) {
}
}
}
if claim, ok := obj.(*corev1.PersistentVolumeClaim); ok {
serviceID := claim.Labels["service_id"]
version := claim.Labels["version"]
createrID := claim.Labels["creater_id"]
if serviceID != "" && createrID != "" {
appservice, _ := a.getAppService(serviceID, version, createrID, false)
if appservice != nil {
appservice.DeleteClaim(claim)
if appservice.IsClosed() {
a.DeleteAppService(appservice)
}
return
}
}
}
}
//RegistAppService regist a app model to store.
@ -1073,7 +1109,7 @@ func (a *appRuntimeStore) UnRegistPodUpdateListener(name string) {
func (a *appRuntimeStore) GetStorageClasses() []v1.StorageClass {
storageClassList, err := a.clientset.StorageV1().StorageClasses().List(metav1.ListOptions{})
if err != nil {
if err != nil { // TODO 使用 store获取
return make([]v1.StorageClass, 0)
}
var sclist []v1.StorageClass

View File

@ -21,6 +21,7 @@ package store
import (
"fmt"
"testing"
"time"
"github.com/eapache/channels"
"github.com/goodrain/rainbond/cmd/worker/option"
@ -90,3 +91,54 @@ func TestGetStorageClass(t *testing.T) {
t.Logf("%+v", sc.Parameters)
}
}
func TestGetAppVolumeStatus(t *testing.T) {
ocfg := option.Config{
DBType: "mysql",
MysqlConnectionInfo: "oc6Poh:noot6Mea@tcp(192.168.2.203:3306)/region",
EtcdEndPoints: []string{"http://192.168.2.203:2379"},
EtcdTimeout: 5,
KubeConfig: "/Users/fanyangyang/Documents/company/goodrain/admin.kubeconfig",
LeaderElectionNamespace: "rainbond",
}
dbconfig := config.Config{
DBType: ocfg.DBType,
MysqlConnectionInfo: ocfg.MysqlConnectionInfo,
EtcdEndPoints: ocfg.EtcdEndPoints,
EtcdTimeout: ocfg.EtcdTimeout,
}
//step 1:db manager init ,event log client init
if err := db.CreateManager(dbconfig); err != nil {
t.Fatalf("error creating db manager: %v", err)
}
defer db.CloseManager()
c, err := clientcmd.BuildConfigFromFlags("", ocfg.KubeConfig)
if err != nil {
t.Fatalf("read kube config file error: %v", err)
}
clientset, err := kubernetes.NewForConfig(c)
if err != nil {
t.Fatalf("create kube api client error: %v", err)
}
startCh := channels.NewRingChannel(1024)
probeCh := channels.NewRingChannel(1024)
storer := NewStore(clientset, db.GetManager(), option.Config{LeaderElectionNamespace: ocfg.LeaderElectionNamespace, KubeClient: clientset}, startCh, probeCh)
if err := storer.Start(); err != nil {
t.Fatalf("error starting store: %v", err)
}
time.Sleep(10 * time.Second)
// serviceID := "69123df08744e36800c29c91574370d5"
apps := storer.GetAllAppServices()
for _, app := range apps {
if app != nil {
t.Logf("%+v", app.GetClaims())
} else {
t.Log("app is nil")
}
}
// app := storer.GetAppService(serviceID)
time.Sleep(20 * time.Second)
}

View File

@ -111,6 +111,7 @@ type AppService struct {
secrets []*corev1.Secret
delSecrets []*corev1.Secret // secrets which need to be deleted
pods []*corev1.Pod
claims []*corev1.PersistentVolumeClaim
status AppServiceStatus
Logger event.Logger
UpgradePatch map[string][]byte
@ -550,6 +551,35 @@ func (a *AppService) DistinguishPod(pod *corev1.Pod) bool {
return !pod.ObjectMeta.CreationTimestamp.Before(&rss.ObjectMeta.CreationTimestamp)
}
// GetClaims get claims
func (a *AppService) GetClaims() []*corev1.PersistentVolumeClaim {
return a.claims
}
// SetClaim set claim
func (a *AppService) SetClaim(claim *corev1.PersistentVolumeClaim) {
if len(a.claims) > 0 {
for i, cla := range a.configMaps {
if cla.GetName() == claim.GetName() {
a.claims[i] = claim
return
}
}
}
a.claims = append(a.claims, claim)
print(a.claims)
}
// DeleteClaim delete claim
func (a *AppService) DeleteClaim(claim *corev1.PersistentVolumeClaim) {
for i, c := range a.claims {
if c.GetName() == claim.GetName() {
a.claims = append(a.claims[0:i], a.claims[i+1:]...)
return
}
}
}
func (a *AppService) String() string {
return fmt.Sprintf(`
-----------------------------------------------------

View File

@ -120,7 +120,8 @@ func (v *ShareFileVolume) CreateVolume(define *Define) error {
if v.as.GetStatefulSet() != nil {
statefulset := v.as.GetStatefulSet()
labels := v.as.GetCommonLabels(map[string]string{"volume_name": volumeMountName, "volume_path": volumeMountPath})
claim := newVolumeClaim(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeCapacity, labels)
annotations := map[string]string{"volume_name": v.svm.VolumeName}
claim := newVolumeClaim(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeCapacity, labels, annotations)
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, *claim)
vm = &corev1.VolumeMount{
@ -159,13 +160,14 @@ func (v *ShareFileVolume) CreateVolume(define *Define) error {
return nil
}
func newVolumeClaim(name, volumePath, accessMode string, capacity int64, labels map[string]string) *corev1.PersistentVolumeClaim {
func newVolumeClaim(name, volumePath, accessMode string, capacity int64, labels, annotations map[string]string) *corev1.PersistentVolumeClaim {
// TODO use capacity as resroouceStorage
resourceStorage, _ := resource.ParseQuantity("500Gi")
return &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Labels: labels,
Name: name,
Labels: labels,
Annotations: annotations,
},
Spec: corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{parseAccessMode(accessMode)},
@ -198,13 +200,13 @@ func parseAccessMode(accessMode string) corev1.PersistentVolumeAccessMode {
}
}
func newVolumeClaim4RBD(name, volumePath, accessMode, storageClassName string, capacity int64, labels map[string]string) *corev1.PersistentVolumeClaim {
// TODO use capacity as resroouceStorage
func newVolumeClaim4RBD(name, volumePath, accessMode, storageClassName string, capacity int64, labels, annotations map[string]string) *corev1.PersistentVolumeClaim {
resourceStorage, _ := resource.ParseQuantity(fmt.Sprintf("%dMi", capacity))
return &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Labels: labels,
Name: name,
Labels: labels,
Annotations: annotations,
},
Spec: corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{parseAccessMode(accessMode)},
@ -265,8 +267,9 @@ func (v *LocalVolume) CreateVolume(define *Define) error {
volumeMountPath := v.svm.VolumePath
volumeReadOnly := v.svm.IsReadOnly
statefulset := v.as.GetStatefulSet()
labels := v.as.GetCommonLabels(map[string]string{"volume_name": volumeMountName, "volume_path": volumeMountPath})
claim := newVolumeClaim(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeCapacity, labels)
labels := v.as.GetCommonLabels(map[string]string{"volume_name": v.svm.VolumeName, "volume_path": volumeMountPath, "version": v.as.DeployVersion})
annotations := map[string]string{"volume_name": v.svm.VolumeName}
claim := newVolumeClaim(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeCapacity, labels, annotations)
claim.Annotations = map[string]string{
client.LabelOS: func() string {
if v.as.IsWindowsService {
@ -417,30 +420,37 @@ func (v *CephRBDVolume) CreateVolume(define *Define) error {
volumeMountName := fmt.Sprintf("manual%d", v.svm.ID)
volumeMountPath := v.svm.VolumePath
volumeReadOnly := v.svm.IsReadOnly
labels := v.as.GetCommonLabels(map[string]string{"volume_name": v.svm.VolumeName, "volume_path": volumeMountPath, "version": v.as.DeployVersion})
annotations := map[string]string{"volume_name": v.svm.VolumeName}
annotations["reclaim_policy"] = v.svm.ReclaimPolicy
claim := newVolumeClaim4RBD(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeProviderName, v.svm.VolumeCapacity, labels, annotations)
logrus.Debugf("storage class is : %s, claim value is : %s", v.svm.VolumeProviderName, claim.GetName())
v.as.SetClaim(claim) // store claim to appService
claim.Annotations = map[string]string{
client.LabelOS: func() string {
if v.as.IsWindowsService {
return "windows"
}
return "linux"
}(),
}
statefulset := v.as.GetStatefulSet() //有状态组件
if statefulset != nil {
labels := v.as.GetCommonLabels(map[string]string{"volume_name": volumeMountName, "volume_path": volumeMountPath})
claim := newVolumeClaim4RBD(volumeMountName, volumeMountPath, v.svm.AccessMode, v.svm.VolumeProviderName, v.svm.VolumeCapacity, labels)
logrus.Debugf("storage class is : %s, claim value is : %s", v.svm.VolumeProviderName, claim.Spec.StorageClassName)
claim.Annotations = map[string]string{
client.LabelOS: func() string {
if v.as.IsWindowsService {
return "windows"
}
return "linux"
}(),
}
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, *claim)
vm := corev1.VolumeMount{
Name: volumeMountName,
MountPath: volumeMountPath,
ReadOnly: volumeReadOnly,
}
define.volumeMounts = append(define.volumeMounts, vm)
} else {
logrus.Warnf("service[%s] has not statefulset, ignore this volume[ceph]", v.svm.ServiceID)
vo := corev1.Volume{Name: volumeMountName}
vo.PersistentVolumeClaim = &corev1.PersistentVolumeClaimVolumeSource{ClaimName: claim.GetName(), ReadOnly: volumeReadOnly}
define.volumes = append(define.volumes, vo)
logrus.Warnf("service[%s] is not stateful, mount volume by k8s volume.PersistenVolumeClaim[%s]", v.svm.ServiceID, claim.GetName())
}
vm := corev1.VolumeMount{
Name: volumeMountName,
MountPath: volumeMountPath,
ReadOnly: volumeReadOnly,
}
define.volumeMounts = append(define.volumeMounts, vm)
return nil
}

View File

@ -205,3 +205,10 @@ func (a *AppRuntimeSyncClient) GetStorageClasses() (storageclasses *pb.StorageCl
defer cancel()
return a.AppRuntimeSyncClient.GetStorageClasses(ctx, &pb.Empty{})
}
// GetAppVolumeStatus get app volume status
func (a *AppRuntimeSyncClient) GetAppVolumeStatus(serviceID string) (*pb.ServiceVolumeStatusMessage, error) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
return a.AppRuntimeSyncClient.GetAppVolumeStatus(ctx, &pb.ServiceRequest{ServiceId: serviceID})
}

View File

@ -23,6 +23,29 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type ServiceVolumeStatus int32
const (
ServiceVolumeStatus_READY ServiceVolumeStatus = 0
ServiceVolumeStatus_NOT_READY ServiceVolumeStatus = 1
)
var ServiceVolumeStatus_name = map[int32]string{
0: "READY",
1: "NOT_READY",
}
var ServiceVolumeStatus_value = map[string]int32{
"READY": 0,
"NOT_READY": 1,
}
func (x ServiceVolumeStatus) String() string {
return proto.EnumName(ServiceVolumeStatus_name, int32(x))
}
func (ServiceVolumeStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{0}
}
type PodStatus_Type int32
const (
@ -81,7 +104,7 @@ func (x PodStatus_Type) String() string {
return proto.EnumName(PodStatus_Type_name, int32(x))
}
func (PodStatus_Type) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_app_runtime_server_b31ccbbc74ce31c5, []int{19, 0}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{19, 0}
}
type Empty struct {
@ -94,7 +117,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_app_runtime_server_b31ccbbc74ce31c5, []int{0}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{0}
}
func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -125,7 +148,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_app_runtime_server_b31ccbbc74ce31c5, []int{1}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{1}
}
func (m *ServiceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServiceRequest.Unmarshal(m, b)
@ -163,7 +186,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_app_runtime_server_b31ccbbc74ce31c5, []int{2}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{2}
}
func (m *ServicesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServicesRequest.Unmarshal(m, b)
@ -201,7 +224,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_app_runtime_server_b31ccbbc74ce31c5, []int{3}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{3}
}
func (m *TenantRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TenantRequest.Unmarshal(m, b)
@ -239,7 +262,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_app_runtime_server_b31ccbbc74ce31c5, []int{4}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{4}
}
func (m *StatusMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusMessage.Unmarshal(m, b)
@ -277,7 +300,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_app_runtime_server_b31ccbbc74ce31c5, []int{5}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{5}
}
func (m *DiskMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DiskMessage.Unmarshal(m, b)
@ -316,7 +339,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_app_runtime_server_b31ccbbc74ce31c5, []int{6}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{6}
}
func (m *ServiceAppPodList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServiceAppPodList.Unmarshal(m, b)
@ -367,7 +390,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_app_runtime_server_b31ccbbc74ce31c5, []int{7}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{7}
}
func (m *ServiceAppPod) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServiceAppPod.Unmarshal(m, b)
@ -448,7 +471,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_app_runtime_server_b31ccbbc74ce31c5, []int{8}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{8}
}
func (m *Container) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Container.Unmarshal(m, b)
@ -503,7 +526,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_app_runtime_server_b31ccbbc74ce31c5, []int{9}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{9}
}
func (m *DeployInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeployInfo.Unmarshal(m, b)
@ -621,7 +644,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_app_runtime_server_b31ccbbc74ce31c5, []int{10}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{10}
}
func (m *TenantResource) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TenantResource.Unmarshal(m, b)
@ -733,7 +756,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_app_runtime_server_b31ccbbc74ce31c5, []int{11}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{11}
}
func (m *AddThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddThirdPartyEndpointsReq.Unmarshal(m, b)
@ -803,7 +826,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_app_runtime_server_b31ccbbc74ce31c5, []int{12}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{12}
}
func (m *UpdThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UpdThirdPartyEndpointsReq.Unmarshal(m, b)
@ -870,7 +893,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_app_runtime_server_b31ccbbc74ce31c5, []int{13}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{13}
}
func (m *DelThirdPartyEndpointsReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DelThirdPartyEndpointsReq.Unmarshal(m, b)
@ -920,7 +943,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_app_runtime_server_b31ccbbc74ce31c5, []int{14}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{14}
}
func (m *ThirdPartyEndpoint) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ThirdPartyEndpoint.Unmarshal(m, b)
@ -993,7 +1016,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_app_runtime_server_b31ccbbc74ce31c5, []int{15}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{15}
}
func (m *ThirdPartyEndpoints) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ThirdPartyEndpoints.Unmarshal(m, b)
@ -1031,7 +1054,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_app_runtime_server_b31ccbbc74ce31c5, []int{16}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{16}
}
func (m *ListPodsBySIDReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListPodsBySIDReq.Unmarshal(m, b)
@ -1070,7 +1093,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_app_runtime_server_b31ccbbc74ce31c5, []int{17}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{17}
}
func (m *GetPodDetailReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetPodDetailReq.Unmarshal(m, b)
@ -1118,7 +1141,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_app_runtime_server_b31ccbbc74ce31c5, []int{18}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{18}
}
func (m *PodEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PodEvent.Unmarshal(m, b)
@ -1181,7 +1204,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_app_runtime_server_b31ccbbc74ce31c5, []int{19}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{19}
}
func (m *PodStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PodStatus.Unmarshal(m, b)
@ -1254,7 +1277,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_app_runtime_server_b31ccbbc74ce31c5, []int{20}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{20}
}
func (m *PodContainer) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PodContainer.Unmarshal(m, b)
@ -1350,7 +1373,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_app_runtime_server_b31ccbbc74ce31c5, []int{21}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{21}
}
func (m *PodDetail) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PodDetail.Unmarshal(m, b)
@ -1451,7 +1474,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_app_runtime_server_b31ccbbc74ce31c5, []int{22}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{22}
}
func (m *StorageClasses) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageClasses.Unmarshal(m, b)
@ -1495,7 +1518,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_app_runtime_server_b31ccbbc74ce31c5, []int{23}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{23}
}
func (m *StorageClassDetail) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageClassDetail.Unmarshal(m, b)
@ -1575,7 +1598,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_app_runtime_server_b31ccbbc74ce31c5, []int{24}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{24}
}
func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TopologySelectorTerm.Unmarshal(m, b)
@ -1614,7 +1637,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_app_runtime_server_b31ccbbc74ce31c5, []int{25}
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{25}
}
func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TopologySelectorLabelRequirement.Unmarshal(m, b)
@ -1648,6 +1671,44 @@ func (m *TopologySelectorLabelRequirement) GetValues() []string {
return nil
}
type ServiceVolumeStatusMessage struct {
Status map[string]ServiceVolumeStatus `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=pb.ServiceVolumeStatus"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ServiceVolumeStatusMessage) Reset() { *m = ServiceVolumeStatusMessage{} }
func (m *ServiceVolumeStatusMessage) String() string { return proto.CompactTextString(m) }
func (*ServiceVolumeStatusMessage) ProtoMessage() {}
func (*ServiceVolumeStatusMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e, []int{26}
}
func (m *ServiceVolumeStatusMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServiceVolumeStatusMessage.Unmarshal(m, b)
}
func (m *ServiceVolumeStatusMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ServiceVolumeStatusMessage.Marshal(b, m, deterministic)
}
func (dst *ServiceVolumeStatusMessage) XXX_Merge(src proto.Message) {
xxx_messageInfo_ServiceVolumeStatusMessage.Merge(dst, src)
}
func (m *ServiceVolumeStatusMessage) XXX_Size() int {
return xxx_messageInfo_ServiceVolumeStatusMessage.Size(m)
}
func (m *ServiceVolumeStatusMessage) XXX_DiscardUnknown() {
xxx_messageInfo_ServiceVolumeStatusMessage.DiscardUnknown(m)
}
var xxx_messageInfo_ServiceVolumeStatusMessage proto.InternalMessageInfo
func (m *ServiceVolumeStatusMessage) GetStatus() map[string]ServiceVolumeStatus {
if m != nil {
return m.Status
}
return nil
}
func init() {
proto.RegisterType((*Empty)(nil), "pb.Empty")
proto.RegisterType((*ServiceRequest)(nil), "pb.ServiceRequest")
@ -1685,6 +1746,9 @@ func init() {
proto.RegisterMapType((map[string]string)(nil), "pb.StorageClassDetail.ParametersEntry")
proto.RegisterType((*TopologySelectorTerm)(nil), "pb.TopologySelectorTerm")
proto.RegisterType((*TopologySelectorLabelRequirement)(nil), "pb.TopologySelectorLabelRequirement")
proto.RegisterType((*ServiceVolumeStatusMessage)(nil), "pb.ServiceVolumeStatusMessage")
proto.RegisterMapType((map[string]ServiceVolumeStatus)(nil), "pb.ServiceVolumeStatusMessage.StatusEntry")
proto.RegisterEnum("pb.ServiceVolumeStatus", ServiceVolumeStatus_name, ServiceVolumeStatus_value)
proto.RegisterEnum("pb.PodStatus_Type", PodStatus_Type_name, PodStatus_Type_value)
}
@ -1710,6 +1774,7 @@ type AppRuntimeSyncClient interface {
DelThirdPartyEndpoint(ctx context.Context, in *DelThirdPartyEndpointsReq, opts ...grpc.CallOption) (*Empty, error)
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)
}
type appRuntimeSyncClient struct {
@ -1810,6 +1875,15 @@ func (c *appRuntimeSyncClient) GetStorageClasses(ctx context.Context, in *Empty,
return out, nil
}
func (c *appRuntimeSyncClient) GetAppVolumeStatus(ctx context.Context, in *ServiceRequest, opts ...grpc.CallOption) (*ServiceVolumeStatusMessage, error) {
out := new(ServiceVolumeStatusMessage)
err := c.cc.Invoke(ctx, "/pb.AppRuntimeSync/GetAppVolumeStatus", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// AppRuntimeSyncServer is the server API for AppRuntimeSync service.
type AppRuntimeSyncServer interface {
GetAppStatus(context.Context, *ServicesRequest) (*StatusMessage, error)
@ -1822,6 +1896,7 @@ type AppRuntimeSyncServer interface {
DelThirdPartyEndpoint(context.Context, *DelThirdPartyEndpointsReq) (*Empty, error)
GetPodDetail(context.Context, *GetPodDetailReq) (*PodDetail, error)
GetStorageClasses(context.Context, *Empty) (*StorageClasses, error)
GetAppVolumeStatus(context.Context, *ServiceRequest) (*ServiceVolumeStatusMessage, error)
}
func RegisterAppRuntimeSyncServer(s *grpc.Server, srv AppRuntimeSyncServer) {
@ -2008,6 +2083,24 @@ func _AppRuntimeSync_GetStorageClasses_Handler(srv interface{}, ctx context.Cont
return interceptor(ctx, in, info, handler)
}
func _AppRuntimeSync_GetAppVolumeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ServiceRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AppRuntimeSyncServer).GetAppVolumeStatus(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.AppRuntimeSync/GetAppVolumeStatus",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AppRuntimeSyncServer).GetAppVolumeStatus(ctx, req.(*ServiceRequest))
}
return interceptor(ctx, in, info, handler)
}
var _AppRuntimeSync_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.AppRuntimeSync",
HandlerType: (*AppRuntimeSyncServer)(nil),
@ -2052,137 +2145,146 @@ var _AppRuntimeSync_serviceDesc = grpc.ServiceDesc{
MethodName: "GetStorageClasses",
Handler: _AppRuntimeSync_GetStorageClasses_Handler,
},
{
MethodName: "GetAppVolumeStatus",
Handler: _AppRuntimeSync_GetAppVolumeStatus_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "app_runtime_server.proto",
}
func init() {
proto.RegisterFile("app_runtime_server.proto", fileDescriptor_app_runtime_server_b31ccbbc74ce31c5)
proto.RegisterFile("app_runtime_server.proto", fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e)
}
var fileDescriptor_app_runtime_server_b31ccbbc74ce31c5 = []byte{
// 1939 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x6d, 0x8f, 0x1b, 0x49,
0x11, 0x5e, 0xbf, 0xdb, 0xe5, 0xb5, 0xd7, 0xdb, 0xc9, 0x26, 0x8e, 0xef, 0x42, 0x72, 0x43, 0x2e,
0x8a, 0x20, 0x5a, 0x8e, 0xe5, 0xa2, 0x4b, 0xee, 0xc2, 0x21, 0xc7, 0xf6, 0x6d, 0x2c, 0xbc, 0xce,
0x6a, 0xec, 0x05, 0x9d, 0x84, 0x64, 0xcd, 0x7a, 0xfa, 0xf6, 0x86, 0xcc, 0x4b, 0x33, 0xd3, 0xb3,
0x87, 0x3f, 0xc2, 0x5f, 0xe0, 0x27, 0xf0, 0x81, 0x7f, 0xc1, 0x4f, 0x00, 0xfe, 0x09, 0x5f, 0xf8,
0x0e, 0xaa, 0xea, 0x9e, 0x17, 0xbf, 0x44, 0x61, 0x01, 0x89, 0x6f, 0xd3, 0x55, 0x4f, 0x55, 0x75,
0xbd, 0x74, 0x75, 0xf5, 0x40, 0xd7, 0x12, 0x62, 0x11, 0xc6, 0xbe, 0x74, 0x3c, 0xbe, 0x88, 0x78,
0x78, 0xcd, 0xc3, 0x63, 0x11, 0x06, 0x32, 0x60, 0x45, 0x71, 0x69, 0xd4, 0xa0, 0x32, 0xf2, 0x84,
0x5c, 0x19, 0x3f, 0x82, 0xf6, 0x8c, 0x87, 0xd7, 0xce, 0x92, 0x9b, 0xfc, 0x37, 0x31, 0x8f, 0x24,
0xbb, 0x0f, 0x10, 0x29, 0xca, 0xc2, 0xb1, 0xbb, 0x85, 0x87, 0x85, 0x27, 0x0d, 0xb3, 0xa1, 0x29,
0x63, 0xdb, 0x38, 0x81, 0x03, 0x2d, 0x10, 0x25, 0x12, 0x0f, 0xa0, 0x99, 0x49, 0x44, 0x5a, 0x04,
0x52, 0x91, 0xc8, 0x78, 0x0a, 0xad, 0x39, 0xf7, 0x2d, 0x5f, 0x26, 0x12, 0x1f, 0x40, 0x43, 0x12,
0x21, 0x33, 0x51, 0x57, 0x84, 0xb1, 0x6d, 0xfc, 0xae, 0x00, 0xad, 0x99, 0xb4, 0x64, 0x1c, 0x9d,
0xf1, 0x28, 0xb2, 0xae, 0x38, 0x7b, 0x06, 0xd5, 0x88, 0x08, 0xdd, 0xc2, 0xc3, 0xd2, 0x93, 0xe6,
0xc9, 0xfd, 0x63, 0x71, 0x79, 0xbc, 0x06, 0xd1, 0xab, 0x91, 0x2f, 0xc3, 0x95, 0xa9, 0xc1, 0xbd,
0x17, 0xd0, 0xcc, 0x91, 0x59, 0x07, 0x4a, 0x6f, 0xf9, 0x4a, 0x9b, 0xc3, 0x4f, 0x76, 0x1b, 0x2a,
0xd7, 0x96, 0x1b, 0xf3, 0x6e, 0x91, 0x68, 0x6a, 0xf1, 0x79, 0xf1, 0x79, 0xc1, 0x58, 0x41, 0x73,
0xe8, 0x44, 0x6f, 0x93, 0x0d, 0x7c, 0x02, 0x15, 0xdb, 0x89, 0xde, 0x26, 0xf6, 0x7b, 0x68, 0x3f,
0xc7, 0xa7, 0x6f, 0x6d, 0x5c, 0x01, 0x7b, 0xcf, 0x01, 0x32, 0xe2, 0xfb, 0x4c, 0x17, 0xf2, 0xa6,
0x3d, 0x38, 0xd4, 0x01, 0xee, 0x0b, 0x71, 0x1e, 0xd8, 0x13, 0x27, 0x92, 0xec, 0x87, 0x50, 0x0b,
0x5c, 0xfb, 0x3c, 0xb0, 0x93, 0x2d, 0x1c, 0x52, 0x08, 0xf2, 0x38, 0x33, 0x41, 0x20, 0xd8, 0xe7,
0xdf, 0x11, 0xb8, 0xf8, 0x4e, 0xb0, 0x46, 0x18, 0x7f, 0x29, 0x42, 0x6b, 0x8d, 0xf5, 0x9e, 0x02,
0xc0, 0xdc, 0xd9, 0x5c, 0xb8, 0xc1, 0x0a, 0xb9, 0x2a, 0x70, 0x75, 0x45, 0x18, 0xdb, 0x58, 0x0a,
0x9a, 0x29, 0x57, 0x82, 0x77, 0x4b, 0xaa, 0x14, 0x14, 0x69, 0xbe, 0x12, 0x9c, 0xdd, 0x83, 0xba,
0x08, 0xec, 0x85, 0x6f, 0x79, 0xbc, 0x5b, 0x26, 0x6e, 0x4d, 0x04, 0xf6, 0xd4, 0xf2, 0x38, 0x3b,
0x82, 0x2a, 0xb2, 0x1c, 0xd1, 0xad, 0xa8, 0x74, 0x88, 0xc0, 0x1e, 0x0b, 0xdc, 0x0e, 0x92, 0x75,
0x01, 0x54, 0xd5, 0x76, 0x44, 0x60, 0xab, 0xd4, 0xb2, 0x3e, 0xc0, 0x32, 0xf0, 0xa5, 0xe5, 0xf8,
0x3c, 0x8c, 0xba, 0x35, 0xf2, 0xf7, 0xa3, 0x2d, 0x7f, 0x8f, 0x07, 0x29, 0x46, 0xa5, 0x29, 0x27,
0xd4, 0x9b, 0xc0, 0xc1, 0x06, 0x7b, 0x47, 0xc2, 0xbe, 0x9f, 0x4f, 0x58, 0xf3, 0xa4, 0x85, 0x26,
0x52, 0xa9, 0x7c, 0xfe, 0x2e, 0xa0, 0x91, 0xd2, 0xd9, 0xc7, 0xd0, 0x4e, 0x0d, 0x29, 0xa7, 0x95,
0xca, 0x56, 0x4a, 0x25, 0xd7, 0x3f, 0x82, 0x7d, 0x8f, 0x7b, 0x41, 0xb8, 0x5a, 0xb8, 0x8e, 0xe7,
0x48, 0xb2, 0x51, 0x32, 0x9b, 0x8a, 0x36, 0x41, 0x92, 0xf1, 0xf7, 0x2a, 0xc0, 0x50, 0x85, 0xd9,
0xff, 0x26, 0x60, 0x1f, 0x42, 0x03, 0xd5, 0x45, 0xc2, 0x5a, 0x26, 0x3a, 0x33, 0x02, 0x33, 0x60,
0x1f, 0xe3, 0xc5, 0xbf, 0x89, 0x5d, 0x1e, 0x71, 0xa9, 0xd3, 0xb4, 0x46, 0x63, 0xdf, 0x03, 0x9d,
0x17, 0x8f, 0xfb, 0x72, 0x3d, 0x53, 0x48, 0xa1, 0x32, 0x90, 0x56, 0x28, 0x17, 0xd8, 0x41, 0x74,
0xae, 0x1a, 0x44, 0x99, 0x3b, 0x1e, 0x67, 0x4f, 0xa1, 0x2c, 0xb0, 0xc2, 0x2a, 0x14, 0xf1, 0x2e,
0x9d, 0x88, 0x74, 0x7b, 0xc7, 0x58, 0x5a, 0x2a, 0xd0, 0x84, 0x62, 0xcf, 0xa1, 0xae, 0x2b, 0x08,
0x53, 0x88, 0x12, 0x1f, 0x6e, 0x48, 0x24, 0x4d, 0x45, 0x49, 0xa5, 0x68, 0xf6, 0x05, 0x34, 0xb8,
0x6f, 0x8b, 0xc0, 0xf1, 0x65, 0x92, 0xde, 0xfb, 0x1b, 0xa2, 0xa3, 0x84, 0xaf, 0x64, 0x33, 0x3c,
0x7b, 0x06, 0xb5, 0x88, 0x2f, 0x43, 0x2e, 0xa3, 0x6e, 0x9d, 0x44, 0x3f, 0xd8, 0xb2, 0x4a, 0x5c,
0x25, 0x98, 0x60, 0xd1, 0xa6, 0xe3, 0x5f, 0x85, 0x3c, 0x8a, 0x78, 0xd4, 0x6d, 0xec, 0xb4, 0x39,
0x4e, 0xf8, 0xda, 0x66, 0x8a, 0x67, 0x7d, 0x68, 0x86, 0x5c, 0xb8, 0xce, 0xd2, 0x92, 0x18, 0x7a,
0x20, 0xf1, 0x07, 0x1b, 0xe2, 0x66, 0x86, 0x50, 0x0a, 0xf2, 0x32, 0xec, 0x4e, 0xda, 0xef, 0x9a,
0x14, 0xf6, 0xa4, 0xa1, 0x7d, 0x06, 0x8d, 0x34, 0xb0, 0x37, 0x69, 0x67, 0xbd, 0x2f, 0xd2, 0x33,
0xfe, 0x1f, 0x08, 0xbf, 0x84, 0xf6, 0x7a, 0x84, 0x6f, 0x24, 0xfd, 0x39, 0xec, 0xe7, 0x83, 0x7c,
0x53, 0xcb, 0xeb, 0x71, 0xbe, 0x91, 0xf4, 0x97, 0xd0, 0xd9, 0x0c, 0xf3, 0x8d, 0xee, 0x80, 0xbf,
0x95, 0xa0, 0x9d, 0x5c, 0x5b, 0x51, 0x10, 0x87, 0x4b, 0x8e, 0xed, 0x6d, 0x29, 0xe2, 0x45, 0xa8,
0xae, 0x31, 0x52, 0x53, 0x32, 0x61, 0x29, 0xe2, 0xdc, 0xc5, 0x86, 0x80, 0xfc, 0x29, 0xae, 0x2f,
0x45, 0x4c, 0x47, 0x18, 0x9b, 0x81, 0x3e, 0xe5, 0x89, 0x82, 0x12, 0x21, 0x5a, 0x8a, 0x9a, 0xe8,
0xd8, 0x6c, 0x06, 0xe5, 0xad, 0x66, 0xc0, 0x1e, 0xc3, 0x41, 0x18, 0xfb, 0xbe, 0xe3, 0x5f, 0x2d,
0xf0, 0x9a, 0xf7, 0x63, 0x8f, 0x7a, 0x66, 0xc9, 0x6c, 0x69, 0x72, 0x5f, 0x88, 0x69, 0xec, 0x31,
0x03, 0x5a, 0xb1, 0x1f, 0x2d, 0xed, 0x85, 0xde, 0x35, 0xb5, 0xcf, 0x92, 0xd9, 0x24, 0xe2, 0x80,
0xb6, 0x8d, 0xba, 0x32, 0x8c, 0xb2, 0x58, 0x53, 0xba, 0x12, 0x94, 0xb2, 0xf9, 0x04, 0x3a, 0x0a,
0x97, 0xf9, 0xd0, 0xad, 0x13, 0xb0, 0x4d, 0xf4, 0xb3, 0xc4, 0x09, 0xf6, 0x14, 0xd8, 0x1a, 0x52,
0x29, 0x6d, 0x10, 0xb6, 0x93, 0xc3, 0x2a, 0xbd, 0x3f, 0x86, 0xa3, 0xbc, 0x2f, 0xf2, 0x5b, 0x27,
0xb4, 0xc9, 0x23, 0x20, 0x01, 0x96, 0x79, 0x34, 0x47, 0x16, 0xba, 0xf5, 0x19, 0x74, 0xf3, 0x22,
0x8e, 0x2f, 0x79, 0xe8, 0x5b, 0x2e, 0x49, 0x35, 0x49, 0xea, 0x28, 0x93, 0x1a, 0x6b, 0xee, 0x34,
0xf6, 0x8c, 0xdf, 0x17, 0xe0, 0x5e, 0xdf, 0xb6, 0x49, 0xd1, 0xb9, 0x15, 0xca, 0x55, 0x5a, 0xd8,
0xb8, 0x6f, 0x06, 0xe5, 0x38, 0x4e, 0xaf, 0x3c, 0xfa, 0xc6, 0x82, 0x89, 0xd2, 0x7b, 0x0e, 0x3f,
0x59, 0x1b, 0x8a, 0x8e, 0xd0, 0xfd, 0xb2, 0xe8, 0x08, 0x94, 0x12, 0x41, 0xa8, 0xd2, 0x54, 0x31,
0xe9, 0x1b, 0xcb, 0xc0, 0x89, 0x16, 0x81, 0xef, 0x3a, 0x3e, 0xa7, 0xcc, 0xd4, 0xcd, 0xba, 0x13,
0xbd, 0xa1, 0x35, 0x6d, 0xe2, 0x42, 0xfc, 0x9f, 0x37, 0xd1, 0x87, 0x7b, 0x43, 0xee, 0xfe, 0x37,
0x7b, 0x30, 0xfe, 0x50, 0x00, 0xb6, 0xad, 0xe0, 0x7f, 0xe8, 0x40, 0xd6, 0x06, 0x2b, 0xf9, 0x36,
0xb8, 0xee, 0x58, 0x75, 0xc3, 0xb1, 0x9f, 0xc1, 0xad, 0x1d, 0x5e, 0xb1, 0x27, 0x50, 0x0a, 0x2e,
0x7f, 0xad, 0x87, 0xa7, 0x3b, 0xd8, 0x8d, 0xb7, 0x51, 0x26, 0x42, 0x8c, 0x47, 0xd0, 0xc1, 0x91,
0x0b, 0x1b, 0xed, 0xab, 0xd5, 0x6c, 0x3c, 0xc4, 0x80, 0xe8, 0xfd, 0x17, 0x32, 0xe7, 0xbf, 0x84,
0x83, 0x53, 0x8e, 0xa0, 0x21, 0x97, 0x96, 0xe3, 0xee, 0x04, 0xad, 0x0d, 0x3b, 0xc5, 0xb5, 0x61,
0xc7, 0xb8, 0x84, 0xfa, 0x79, 0x60, 0x8f, 0xae, 0xb9, 0x8a, 0x18, 0x4d, 0x4b, 0x3a, 0x62, 0xf8,
0x8d, 0xbe, 0x87, 0xdc, 0x8a, 0x02, 0x5f, 0x0b, 0xea, 0x15, 0x1a, 0xb1, 0xae, 0x92, 0xc1, 0x0a,
0x3f, 0x59, 0x17, 0x6a, 0x9e, 0x1a, 0x43, 0x75, 0x98, 0x92, 0xa5, 0xf1, 0xe7, 0x22, 0xdd, 0x17,
0x7a, 0x50, 0x7a, 0x9c, 0xb3, 0xd2, 0x3e, 0x61, 0x18, 0x82, 0x94, 0x79, 0x8c, 0xb3, 0xd9, 0x7b,
0x2c, 0xe7, 0xec, 0x94, 0xd6, 0xec, 0xa0, 0x84, 0x65, 0xe3, 0xe5, 0xa2, 0xa7, 0x04, 0xbd, 0x42,
0xf7, 0x51, 0xe3, 0x22, 0x92, 0x61, 0xb2, 0x35, 0x5c, 0xcf, 0x64, 0x68, 0xfc, 0xb1, 0x00, 0x65,
0x9a, 0x07, 0x9b, 0x50, 0x3b, 0x1f, 0x4d, 0x87, 0xe3, 0xe9, 0x69, 0x67, 0x0f, 0x17, 0xe6, 0xc5,
0x74, 0x8a, 0x8b, 0x02, 0x6b, 0x41, 0x63, 0x76, 0x31, 0x18, 0x8c, 0x46, 0xc3, 0xd1, 0xb0, 0x53,
0x64, 0x00, 0xd5, 0xaf, 0xfa, 0xe3, 0xc9, 0x68, 0xd8, 0x29, 0x21, 0xee, 0x62, 0xfa, 0xf3, 0xe9,
0x9b, 0x5f, 0x4e, 0x3b, 0x65, 0xd6, 0x06, 0x98, 0x8f, 0xce, 0xc6, 0xd3, 0xfe, 0x1c, 0xe5, 0x2a,
0x6c, 0x1f, 0xea, 0xfd, 0x57, 0xd3, 0x37, 0xe6, 0x59, 0x7f, 0xd2, 0xa9, 0x22, 0x77, 0x3c, 0x1d,
0xcf, 0xc7, 0x8a, 0x5b, 0xc3, 0xf5, 0x6c, 0xf0, 0x7a, 0x34, 0xbc, 0x98, 0xe0, 0xba, 0x8e, 0xe8,
0xe9, 0x9b, 0xb9, 0x39, 0xea, 0x0f, 0xbf, 0xee, 0x34, 0xd0, 0xe6, 0xc5, 0xf4, 0xf5, 0xa8, 0x3f,
0x99, 0xbf, 0xfe, 0xba, 0x03, 0xc6, 0x3f, 0x0a, 0xb0, 0x7f, 0x1e, 0xd8, 0xd9, 0x38, 0x77, 0x1b,
0x2a, 0x8e, 0x87, 0x11, 0x50, 0xa9, 0x52, 0x0b, 0xa4, 0xd2, 0x64, 0x95, 0x5c, 0x21, 0xb4, 0xc8,
0xc5, 0xb1, 0xb4, 0x19, 0x47, 0x9a, 0xa2, 0xb8, 0x9d, 0x0c, 0xc0, 0x7a, 0x89, 0x8d, 0x9f, 0x5a,
0xa5, 0xee, 0x9b, 0x3a, 0x66, 0x4d, 0xa2, 0xa9, 0x8e, 0x89, 0xa5, 0xaf, 0x20, 0x4b, 0x11, 0xeb,
0x59, 0xb8, 0x4e, 0x84, 0x81, 0x88, 0xf1, 0x7e, 0xd1, 0x17, 0x4b, 0xa2, 0xa1, 0xa6, 0x86, 0x4d,
0x4d, 0xd5, 0x3a, 0x1e, 0xe0, 0x80, 0xa2, 0x60, 0xa8, 0xa5, 0xae, 0x26, 0x3f, 0x4d, 0x1a, 0x88,
0xd8, 0xf8, 0xab, 0xaa, 0x1b, 0x55, 0xd9, 0x58, 0x9d, 0xb9, 0xc1, 0x95, 0xbe, 0x89, 0x16, 0xd8,
0x89, 0xc3, 0xf4, 0xbd, 0x31, 0x2f, 0x96, 0x36, 0xe7, 0xc5, 0x8f, 0xd3, 0xc3, 0x5c, 0xce, 0x06,
0xe8, 0xb4, 0x00, 0xd3, 0xb3, 0xad, 0xfa, 0x42, 0x25, 0xed, 0x0b, 0x77, 0xa1, 0x86, 0xda, 0xf1,
0x55, 0xa0, 0xdc, 0xad, 0xe2, 0x72, 0x2c, 0x30, 0x8c, 0xd7, 0x3c, 0x8c, 0x9c, 0xc0, 0xd7, 0x5e,
0x26, 0x4b, 0xf6, 0x02, 0x0e, 0x1c, 0x1f, 0x43, 0x94, 0x3d, 0x0b, 0xd4, 0xf0, 0xd7, 0xd1, 0x26,
0xb3, 0xb1, 0xbd, 0x8d, 0xc0, 0x6c, 0xf6, 0x67, 0x9f, 0xac, 0x3d, 0x26, 0x1a, 0xef, 0x90, 0xca,
0x61, 0xd8, 0x23, 0xa8, 0x72, 0x3c, 0xc4, 0x91, 0x1e, 0xf4, 0xf6, 0x35, 0x9a, 0x4e, 0xb6, 0xa9,
0x79, 0xc6, 0x4b, 0x68, 0xcf, 0x64, 0x10, 0x5a, 0x57, 0x7c, 0xe0, 0x5a, 0x34, 0x25, 0xfe, 0x00,
0xca, 0xae, 0x43, 0x23, 0x44, 0xda, 0x90, 0xf2, 0x08, 0xdd, 0x55, 0x08, 0x63, 0xfc, 0xa9, 0x04,
0x6c, 0x9b, 0xb9, 0x33, 0x31, 0x0f, 0xa1, 0x29, 0xc2, 0xe0, 0xda, 0xc1, 0x40, 0xf0, 0x50, 0xe7,
0x27, 0x4f, 0x62, 0x5f, 0x01, 0x08, 0x2b, 0xb4, 0x3c, 0x2e, 0xd1, 0xc5, 0x12, 0x99, 0x7f, 0xbc,
0xdb, 0xfc, 0xf1, 0x79, 0x0a, 0xd4, 0x8f, 0xa6, 0x4c, 0x52, 0x15, 0xdb, 0xd2, 0xb5, 0x1c, 0x6f,
0x21, 0x02, 0xd7, 0x59, 0xae, 0x74, 0x35, 0xb7, 0x34, 0xf5, 0x9c, 0x88, 0xec, 0x53, 0xb8, 0x63,
0xb9, 0x6e, 0xf0, 0xdd, 0xe2, 0x3a, 0x70, 0x63, 0x8f, 0x2f, 0xf8, 0x6f, 0x85, 0xe5, 0x53, 0xd6,
0xd4, 0x8d, 0x74, 0x9b, 0xb8, 0xbf, 0x20, 0xe6, 0x28, 0xe1, 0xb1, 0x63, 0xb8, 0xa5, 0xf1, 0x97,
0x8e, 0x6f, 0xe3, 0x3d, 0xef, 0x61, 0xb9, 0xa9, 0x0a, 0x38, 0x54, 0xac, 0x57, 0x8a, 0x73, 0x86,
0xb5, 0x77, 0x0a, 0x8c, 0xf4, 0x70, 0x7b, 0x21, 0x03, 0x11, 0xb8, 0xc1, 0x95, 0xc3, 0x93, 0xd7,
0x02, 0x3d, 0x4d, 0xe6, 0x8a, 0xba, 0x9a, 0x71, 0x97, 0x2f, 0x65, 0x10, 0xce, 0x79, 0xe8, 0x99,
0x87, 0x5a, 0x66, 0x9e, 0x8a, 0xf4, 0x7e, 0x0a, 0x07, 0x1b, 0x4e, 0xdf, 0x68, 0x64, 0x94, 0x70,
0x7b, 0x97, 0x25, 0xf6, 0x2b, 0xb8, 0xeb, 0x59, 0x72, 0xf9, 0xed, 0xc2, 0xb5, 0x2e, 0xb9, 0x8b,
0x41, 0xc0, 0xa1, 0xd6, 0x09, 0xfc, 0xe4, 0x39, 0xff, 0x68, 0xd7, 0x26, 0x27, 0x08, 0xc6, 0xa9,
0xd0, 0x09, 0x39, 0x3e, 0xc9, 0xcc, 0x23, 0x52, 0x42, 0xe4, 0x51, 0xa6, 0xc2, 0x98, 0xc0, 0xc3,
0xf7, 0x89, 0xee, 0xf0, 0xe2, 0x0e, 0x54, 0x69, 0xe3, 0xea, 0x27, 0x41, 0xc3, 0xd4, 0xab, 0x93,
0x7f, 0x96, 0xa1, 0xdd, 0x17, 0xc2, 0x54, 0xbf, 0x8e, 0x66, 0x2b, 0x7f, 0xc9, 0x9e, 0xc3, 0xfe,
0x29, 0x97, 0x7d, 0x21, 0xf4, 0x55, 0x72, 0x2b, 0xf7, 0xbe, 0x4e, 0xfe, 0x02, 0xf5, 0x0e, 0xb7,
0x7e, 0xca, 0x18, 0x7b, 0xec, 0x05, 0x80, 0x92, 0xa4, 0x1f, 0x13, 0x2c, 0x27, 0x97, 0x88, 0x1d,
0x6d, 0xbd, 0xd5, 0xf1, 0xf6, 0x35, 0xf6, 0xd8, 0x33, 0x68, 0x9d, 0x72, 0x99, 0x7b, 0xf2, 0xee,
0x92, 0x6e, 0xaf, 0xbf, 0xab, 0x8c, 0x3d, 0xf6, 0x12, 0x0e, 0x4f, 0xb9, 0xdc, 0x98, 0xdb, 0x69,
0x6f, 0x6b, 0xbf, 0xa0, 0x7a, 0x2c, 0x4f, 0x52, 0x30, 0x63, 0x8f, 0xbd, 0x86, 0xbb, 0x68, 0x7e,
0xd7, 0x04, 0xb1, 0xcb, 0xfc, 0xdd, 0xdd, 0x83, 0x44, 0x64, 0xec, 0xb1, 0x01, 0x1c, 0xed, 0x9c,
0x34, 0x19, 0xbd, 0x24, 0xdf, 0x39, 0x84, 0xf6, 0x1a, 0xc8, 0x56, 0xff, 0xe6, 0x48, 0xc9, 0xce,
0x49, 0x51, 0x29, 0x79, 0xe7, 0x10, 0xb9, 0xa5, 0x64, 0xe7, 0xa8, 0xc7, 0xf4, 0x9b, 0xd6, 0xfd,
0x77, 0x94, 0x7c, 0x4a, 0x25, 0x90, 0xdd, 0x0a, 0x54, 0x02, 0x1b, 0x13, 0x50, 0x2f, 0xe9, 0xe9,
0x8a, 0x42, 0x52, 0x98, 0x8c, 0x8d, 0xd6, 0x97, 0xe9, 0x55, 0x49, 0x58, 0x67, 0x1b, 0x7b, 0x97,
0x55, 0xfa, 0x4f, 0xf9, 0x93, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x52, 0x5a, 0xc1, 0x40, 0xc3,
0x14, 0x00, 0x00,
var fileDescriptor_app_runtime_server_2ffdebd8c5e2af9e = []byte{
// 2020 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdb, 0x72, 0x1b, 0xc7,
0xd1, 0x26, 0x00, 0xe2, 0xd4, 0x20, 0x40, 0x70, 0x24, 0x8a, 0x10, 0x6c, 0x59, 0xf2, 0xfe, 0xb2,
0x4a, 0xa5, 0x5f, 0xa1, 0x1d, 0xc6, 0x2a, 0x4b, 0xb6, 0xe2, 0x14, 0x04, 0xc0, 0x14, 0x12, 0x10,
0x64, 0x2d, 0xc0, 0xa4, 0x5c, 0x95, 0x2a, 0xd4, 0x12, 0x3b, 0xa6, 0x37, 0xda, 0xc3, 0x64, 0x0f,
0x74, 0x70, 0x99, 0xbc, 0x42, 0x1e, 0x21, 0x17, 0x79, 0x81, 0x5c, 0xe7, 0x05, 0x52, 0x95, 0xe4,
0x4d, 0x72, 0x93, 0x07, 0x48, 0x75, 0xcf, 0xec, 0x01, 0xc0, 0x32, 0x0c, 0x93, 0x54, 0xe5, 0x6e,
0xa7, 0xfb, 0xeb, 0xee, 0xe9, 0xc3, 0xf6, 0xf4, 0x0c, 0x74, 0x0c, 0x21, 0xe6, 0x7e, 0xe4, 0x86,
0x96, 0xc3, 0xe7, 0x01, 0xf7, 0xaf, 0xb8, 0x7f, 0x28, 0x7c, 0x2f, 0xf4, 0x58, 0x51, 0x5c, 0x68,
0x55, 0x28, 0x0f, 0x1d, 0x11, 0x2e, 0xb5, 0x8f, 0xa1, 0x35, 0xe5, 0xfe, 0x95, 0xb5, 0xe0, 0x3a,
0xff, 0x65, 0xc4, 0x83, 0x90, 0x3d, 0x00, 0x08, 0x24, 0x65, 0x6e, 0x99, 0x9d, 0xc2, 0xa3, 0xc2,
0xd3, 0xba, 0x5e, 0x57, 0x94, 0x91, 0xa9, 0x1d, 0xc1, 0xae, 0x12, 0x08, 0x62, 0x89, 0x87, 0xd0,
0x48, 0x25, 0x02, 0x25, 0x02, 0x89, 0x48, 0xa0, 0x3d, 0x87, 0xe6, 0x8c, 0xbb, 0x86, 0x1b, 0xc6,
0x12, 0xef, 0x41, 0x3d, 0x24, 0x42, 0x6a, 0xa2, 0x26, 0x09, 0x23, 0x53, 0xfb, 0x75, 0x01, 0x9a,
0xd3, 0xd0, 0x08, 0xa3, 0xe0, 0x84, 0x07, 0x81, 0x71, 0xc9, 0xd9, 0x0b, 0xa8, 0x04, 0x44, 0xe8,
0x14, 0x1e, 0x95, 0x9e, 0x36, 0x8e, 0x1e, 0x1c, 0x8a, 0x8b, 0xc3, 0x15, 0x88, 0x5a, 0x0d, 0xdd,
0xd0, 0x5f, 0xea, 0x0a, 0xdc, 0x7d, 0x05, 0x8d, 0x0c, 0x99, 0xb5, 0xa1, 0xf4, 0x8e, 0x2f, 0x95,
0x39, 0xfc, 0x64, 0x77, 0xa1, 0x7c, 0x65, 0xd8, 0x11, 0xef, 0x14, 0x89, 0x26, 0x17, 0x9f, 0x17,
0x5f, 0x16, 0xb4, 0x25, 0x34, 0x06, 0x56, 0xf0, 0x2e, 0xde, 0xc0, 0x27, 0x50, 0x36, 0xad, 0xe0,
0x5d, 0x6c, 0xbf, 0x8b, 0xf6, 0x33, 0x7c, 0xfa, 0x56, 0xc6, 0x25, 0xb0, 0xfb, 0x12, 0x20, 0x25,
0xde, 0x64, 0xba, 0x90, 0x35, 0xed, 0xc0, 0x9e, 0x0a, 0x70, 0x4f, 0x88, 0x33, 0xcf, 0x1c, 0x5b,
0x41, 0xc8, 0xfe, 0x1f, 0xaa, 0x9e, 0x6d, 0x9e, 0x79, 0x66, 0xbc, 0x85, 0x3d, 0x0a, 0x41, 0x16,
0xa7, 0xc7, 0x08, 0x04, 0xbb, 0xfc, 0x3b, 0x02, 0x17, 0xaf, 0x05, 0x2b, 0x84, 0xf6, 0xe7, 0x22,
0x34, 0x57, 0x58, 0x37, 0x14, 0x00, 0xe6, 0xce, 0xe4, 0xc2, 0xf6, 0x96, 0xc8, 0x95, 0x81, 0xab,
0x49, 0xc2, 0xc8, 0xc4, 0x52, 0x50, 0xcc, 0x70, 0x29, 0x78, 0xa7, 0x24, 0x4b, 0x41, 0x92, 0x66,
0x4b, 0xc1, 0xd9, 0x7d, 0xa8, 0x09, 0xcf, 0x9c, 0xbb, 0x86, 0xc3, 0x3b, 0xdb, 0xc4, 0xad, 0x0a,
0xcf, 0x9c, 0x18, 0x0e, 0x67, 0xfb, 0x50, 0x41, 0x96, 0x25, 0x3a, 0x65, 0x99, 0x0e, 0xe1, 0x99,
0x23, 0x81, 0xdb, 0x41, 0xb2, 0x2a, 0x80, 0x8a, 0xdc, 0x8e, 0xf0, 0x4c, 0x99, 0x5a, 0xd6, 0x03,
0x58, 0x78, 0x6e, 0x68, 0x58, 0x2e, 0xf7, 0x83, 0x4e, 0x95, 0xfc, 0xfd, 0x70, 0xc3, 0xdf, 0xc3,
0x7e, 0x82, 0x91, 0x69, 0xca, 0x08, 0x75, 0xc7, 0xb0, 0xbb, 0xc6, 0xce, 0x49, 0xd8, 0xff, 0x65,
0x13, 0xd6, 0x38, 0x6a, 0xa2, 0x89, 0x44, 0x2a, 0x9b, 0xbf, 0x73, 0xa8, 0x27, 0x74, 0xf6, 0x11,
0xb4, 0x12, 0x43, 0xd2, 0x69, 0xa9, 0xb2, 0x99, 0x50, 0xc9, 0xf5, 0x0f, 0x61, 0xc7, 0xe1, 0x8e,
0xe7, 0x2f, 0xe7, 0xb6, 0xe5, 0x58, 0x21, 0xd9, 0x28, 0xe9, 0x0d, 0x49, 0x1b, 0x23, 0x49, 0xfb,
0x5b, 0x05, 0x60, 0x20, 0xc3, 0xec, 0x7e, 0xe3, 0xb1, 0xf7, 0xa1, 0x8e, 0xea, 0x02, 0x61, 0x2c,
0x62, 0x9d, 0x29, 0x81, 0x69, 0xb0, 0x83, 0xf1, 0xe2, 0xdf, 0x44, 0x36, 0x0f, 0x78, 0xa8, 0xd2,
0xb4, 0x42, 0x63, 0x1f, 0x80, 0xca, 0x8b, 0xc3, 0xdd, 0x70, 0x35, 0x53, 0x48, 0xa1, 0x32, 0x08,
0x0d, 0x3f, 0x9c, 0x63, 0x07, 0x51, 0xb9, 0xaa, 0x13, 0x65, 0x66, 0x39, 0x9c, 0x3d, 0x87, 0x6d,
0x81, 0x15, 0x56, 0xa6, 0x88, 0x77, 0xe8, 0x8f, 0x48, 0xb6, 0x77, 0x88, 0xa5, 0x25, 0x03, 0x4d,
0x28, 0xf6, 0x12, 0x6a, 0xaa, 0x82, 0x30, 0x85, 0x28, 0xf1, 0xfe, 0x9a, 0x44, 0xdc, 0x54, 0xa4,
0x54, 0x82, 0x66, 0x5f, 0x40, 0x9d, 0xbb, 0xa6, 0xf0, 0x2c, 0x37, 0x8c, 0xd3, 0xfb, 0x60, 0x4d,
0x74, 0x18, 0xf3, 0xa5, 0x6c, 0x8a, 0x67, 0x2f, 0xa0, 0x1a, 0xf0, 0x85, 0xcf, 0xc3, 0xa0, 0x53,
0x23, 0xd1, 0xf7, 0x36, 0xac, 0x12, 0x57, 0x0a, 0xc6, 0x58, 0xb4, 0x69, 0xb9, 0x97, 0x3e, 0x0f,
0x02, 0x1e, 0x74, 0xea, 0xb9, 0x36, 0x47, 0x31, 0x5f, 0xd9, 0x4c, 0xf0, 0xac, 0x07, 0x0d, 0x9f,
0x0b, 0xdb, 0x5a, 0x18, 0x21, 0x86, 0x1e, 0x48, 0xfc, 0xe1, 0x9a, 0xb8, 0x9e, 0x22, 0xa4, 0x82,
0xac, 0x0c, 0xbb, 0x97, 0xf4, 0xbb, 0x06, 0x85, 0x3d, 0x6e, 0x68, 0x9f, 0x41, 0x3d, 0x09, 0xec,
0x6d, 0xda, 0x59, 0xf7, 0x8b, 0xe4, 0x1f, 0xff, 0x37, 0x84, 0x5f, 0x43, 0x6b, 0x35, 0xc2, 0xb7,
0x92, 0xfe, 0x1c, 0x76, 0xb2, 0x41, 0xbe, 0xad, 0xe5, 0xd5, 0x38, 0xdf, 0x4a, 0xfa, 0x4b, 0x68,
0xaf, 0x87, 0xf9, 0x56, 0x67, 0xc0, 0x5f, 0x4b, 0xd0, 0x8a, 0x8f, 0xad, 0xc0, 0x8b, 0xfc, 0x05,
0xc7, 0xf6, 0xb6, 0x10, 0xd1, 0xdc, 0x97, 0xc7, 0x18, 0xa9, 0x29, 0xe9, 0xb0, 0x10, 0x51, 0xe6,
0x60, 0x43, 0x40, 0xf6, 0x2f, 0xae, 0x2d, 0x44, 0x44, 0xbf, 0x30, 0x36, 0x03, 0xf5, 0x97, 0xc7,
0x0a, 0x4a, 0x84, 0x68, 0x4a, 0x6a, 0xac, 0x63, 0xbd, 0x19, 0x6c, 0x6f, 0x34, 0x03, 0xf6, 0x04,
0x76, 0xfd, 0xc8, 0x75, 0x2d, 0xf7, 0x72, 0x8e, 0xc7, 0xbc, 0x1b, 0x39, 0xd4, 0x33, 0x4b, 0x7a,
0x53, 0x91, 0x7b, 0x42, 0x4c, 0x22, 0x87, 0x69, 0xd0, 0x8c, 0xdc, 0x60, 0x61, 0xce, 0xd5, 0xae,
0xa9, 0x7d, 0x96, 0xf4, 0x06, 0x11, 0xfb, 0xb4, 0x6d, 0xd4, 0x95, 0x62, 0xa4, 0xc5, 0xaa, 0xd4,
0x15, 0xa3, 0xa4, 0xcd, 0xa7, 0xd0, 0x96, 0xb8, 0xd4, 0x87, 0x4e, 0x8d, 0x80, 0x2d, 0xa2, 0x9f,
0xc4, 0x4e, 0xb0, 0xe7, 0xc0, 0x56, 0x90, 0x52, 0x69, 0x9d, 0xb0, 0xed, 0x0c, 0x56, 0xea, 0xfd,
0x3e, 0xec, 0x67, 0x7d, 0x09, 0xbf, 0xb5, 0x7c, 0x93, 0x3c, 0x02, 0x12, 0x60, 0xa9, 0x47, 0x33,
0x64, 0xa1, 0x5b, 0x9f, 0x41, 0x27, 0x2b, 0x62, 0xb9, 0x21, 0xf7, 0x5d, 0xc3, 0x26, 0xa9, 0x06,
0x49, 0xed, 0xa7, 0x52, 0x23, 0xc5, 0x9d, 0x44, 0x8e, 0xf6, 0x9b, 0x02, 0xdc, 0xef, 0x99, 0x26,
0x29, 0x3a, 0x33, 0xfc, 0x70, 0x99, 0x14, 0x36, 0xee, 0x9b, 0xc1, 0x76, 0x14, 0x25, 0x47, 0x1e,
0x7d, 0x63, 0xc1, 0x04, 0xc9, 0x39, 0x87, 0x9f, 0xac, 0x05, 0x45, 0x4b, 0xa8, 0x7e, 0x59, 0xb4,
0x04, 0x4a, 0x09, 0xcf, 0x97, 0x69, 0x2a, 0xeb, 0xf4, 0x8d, 0x65, 0x60, 0x05, 0x73, 0xcf, 0xb5,
0x2d, 0x97, 0x53, 0x66, 0x6a, 0x7a, 0xcd, 0x0a, 0x4e, 0x69, 0x4d, 0x9b, 0x38, 0x17, 0xff, 0xe3,
0x4d, 0xf4, 0xe0, 0xfe, 0x80, 0xdb, 0xff, 0xc9, 0x1e, 0xb4, 0xdf, 0x16, 0x80, 0x6d, 0x2a, 0xf8,
0x2f, 0x3a, 0x90, 0xb6, 0xc1, 0x72, 0xb6, 0x0d, 0xae, 0x3a, 0x56, 0x59, 0x73, 0xec, 0x47, 0x70,
0x27, 0xc7, 0x2b, 0xf6, 0x14, 0x4a, 0xde, 0xc5, 0x2f, 0xd4, 0xf0, 0x74, 0x0f, 0xbb, 0xf1, 0x26,
0x4a, 0x47, 0x88, 0xf6, 0x18, 0xda, 0x38, 0x72, 0x61, 0xa3, 0x7d, 0xb3, 0x9c, 0x8e, 0x06, 0x18,
0x10, 0xb5, 0xff, 0x42, 0xea, 0xfc, 0x97, 0xb0, 0x7b, 0xcc, 0x11, 0x34, 0xe0, 0xa1, 0x61, 0xd9,
0xb9, 0xa0, 0x95, 0x61, 0xa7, 0xb8, 0x32, 0xec, 0x68, 0x17, 0x50, 0x3b, 0xf3, 0xcc, 0xe1, 0x15,
0x97, 0x11, 0xa3, 0x69, 0x49, 0x45, 0x0c, 0xbf, 0xd1, 0x77, 0x9f, 0x1b, 0x81, 0xe7, 0x2a, 0x41,
0xb5, 0x42, 0x23, 0xc6, 0x65, 0x3c, 0x58, 0xe1, 0x27, 0xeb, 0x40, 0xd5, 0x91, 0x63, 0xa8, 0x0a,
0x53, 0xbc, 0xd4, 0xfe, 0x58, 0xa4, 0xf3, 0x42, 0x0d, 0x4a, 0x4f, 0x32, 0x56, 0x5a, 0x47, 0x0c,
0x43, 0x90, 0x30, 0x0f, 0x71, 0x36, 0xbb, 0xc1, 0x72, 0xc6, 0x4e, 0x69, 0xc5, 0x0e, 0x4a, 0x18,
0x26, 0x1e, 0x2e, 0x6a, 0x4a, 0x50, 0x2b, 0x74, 0x1f, 0x35, 0xce, 0x83, 0xd0, 0x8f, 0xb7, 0x86,
0xeb, 0x69, 0xe8, 0x6b, 0xbf, 0x2b, 0xc0, 0x36, 0xcd, 0x83, 0x0d, 0xa8, 0x9e, 0x0d, 0x27, 0x83,
0xd1, 0xe4, 0xb8, 0xbd, 0x85, 0x0b, 0xfd, 0x7c, 0x32, 0xc1, 0x45, 0x81, 0x35, 0xa1, 0x3e, 0x3d,
0xef, 0xf7, 0x87, 0xc3, 0xc1, 0x70, 0xd0, 0x2e, 0x32, 0x80, 0xca, 0x57, 0xbd, 0xd1, 0x78, 0x38,
0x68, 0x97, 0x10, 0x77, 0x3e, 0xf9, 0xc9, 0xe4, 0xf4, 0x67, 0x93, 0xf6, 0x36, 0x6b, 0x01, 0xcc,
0x86, 0x27, 0xa3, 0x49, 0x6f, 0x86, 0x72, 0x65, 0xb6, 0x03, 0xb5, 0xde, 0x9b, 0xc9, 0xa9, 0x7e,
0xd2, 0x1b, 0xb7, 0x2b, 0xc8, 0x1d, 0x4d, 0x46, 0xb3, 0x91, 0xe4, 0x56, 0x71, 0x3d, 0xed, 0xbf,
0x1d, 0x0e, 0xce, 0xc7, 0xb8, 0xae, 0x21, 0x7a, 0x72, 0x3a, 0xd3, 0x87, 0xbd, 0xc1, 0xd7, 0xed,
0x3a, 0xda, 0x3c, 0x9f, 0xbc, 0x1d, 0xf6, 0xc6, 0xb3, 0xb7, 0x5f, 0xb7, 0x41, 0xfb, 0x7b, 0x01,
0x76, 0xce, 0x3c, 0x33, 0x1d, 0xe7, 0xee, 0x42, 0xd9, 0x72, 0x30, 0x02, 0x32, 0x55, 0x72, 0x81,
0x54, 0x9a, 0xac, 0xe2, 0x23, 0x84, 0x16, 0x99, 0x38, 0x96, 0xd6, 0xe3, 0x48, 0x53, 0x14, 0x37,
0xe3, 0x01, 0x58, 0x2d, 0xb1, 0xf1, 0x53, 0xab, 0x54, 0x7d, 0x53, 0xc5, 0xac, 0x41, 0x34, 0xd9,
0x31, 0xb1, 0xf4, 0x25, 0x64, 0x21, 0x22, 0x35, 0x0b, 0xd7, 0x88, 0xd0, 0x17, 0x11, 0x9e, 0x2f,
0xea, 0x60, 0x89, 0x35, 0x54, 0xe5, 0xb0, 0xa9, 0xa8, 0x4a, 0xc7, 0x43, 0x1c, 0x50, 0x24, 0x0c,
0xb5, 0xd4, 0xe4, 0xe4, 0xa7, 0x48, 0x7d, 0x11, 0x69, 0x7f, 0x91, 0x75, 0x23, 0x2b, 0x1b, 0xab,
0x33, 0x33, 0xb8, 0xd2, 0x37, 0xd1, 0x3c, 0x33, 0x76, 0x98, 0xbe, 0xd7, 0xe6, 0xc5, 0xd2, 0xfa,
0xbc, 0xf8, 0x51, 0xf2, 0x33, 0x6f, 0xa7, 0x03, 0x74, 0x52, 0x80, 0xc9, 0xbf, 0x2d, 0xfb, 0x42,
0x39, 0xe9, 0x0b, 0x07, 0x50, 0x45, 0xed, 0x78, 0x2b, 0x90, 0xee, 0x56, 0x70, 0x39, 0x12, 0x18,
0xc6, 0x2b, 0xee, 0x07, 0x96, 0xe7, 0x2a, 0x2f, 0xe3, 0x25, 0x7b, 0x05, 0xbb, 0x96, 0x8b, 0x21,
0x4a, 0xaf, 0x05, 0x72, 0xf8, 0x6b, 0x2b, 0x93, 0xe9, 0xd8, 0xde, 0x42, 0x60, 0x3a, 0xfb, 0xb3,
0x4f, 0x56, 0x2e, 0x13, 0xf5, 0x6b, 0xa4, 0x32, 0x18, 0xf6, 0x18, 0x2a, 0x1c, 0x7f, 0xe2, 0x40,
0x0d, 0x7a, 0x3b, 0x0a, 0x4d, 0x7f, 0xb6, 0xae, 0x78, 0xda, 0x6b, 0x68, 0x4d, 0x43, 0xcf, 0x37,
0x2e, 0x79, 0xdf, 0x36, 0x68, 0x4a, 0x7c, 0x06, 0xdb, 0xb6, 0x45, 0x23, 0x44, 0xd2, 0x90, 0xb2,
0x08, 0xd5, 0x55, 0x08, 0xa3, 0xfd, 0xbe, 0x04, 0x6c, 0x93, 0x99, 0x9b, 0x98, 0x47, 0xd0, 0x10,
0xbe, 0x77, 0x65, 0x61, 0x20, 0xb8, 0xaf, 0xf2, 0x93, 0x25, 0xb1, 0xaf, 0x00, 0x84, 0xe1, 0x1b,
0x0e, 0x0f, 0xd1, 0xc5, 0x12, 0x99, 0x7f, 0x92, 0x6f, 0xfe, 0xf0, 0x2c, 0x01, 0xaa, 0x4b, 0x53,
0x2a, 0x29, 0x8b, 0x6d, 0x61, 0x1b, 0x96, 0x33, 0x17, 0x9e, 0x6d, 0x2d, 0x96, 0xaa, 0x9a, 0x9b,
0x8a, 0x7a, 0x46, 0x44, 0xf6, 0x29, 0xdc, 0x33, 0x6c, 0xdb, 0xfb, 0x6e, 0x7e, 0xe5, 0xd9, 0x91,
0xc3, 0xe7, 0xfc, 0x57, 0xc2, 0x70, 0x29, 0x6b, 0xf2, 0x44, 0xba, 0x4b, 0xdc, 0x9f, 0x12, 0x73,
0x18, 0xf3, 0xd8, 0x21, 0xdc, 0x51, 0xf8, 0x0b, 0xcb, 0x35, 0xf1, 0x9c, 0x77, 0xb0, 0xdc, 0x64,
0x05, 0xec, 0x49, 0xd6, 0x1b, 0xc9, 0x39, 0xc1, 0xda, 0x3b, 0x06, 0x46, 0x7a, 0xb8, 0x39, 0x0f,
0x3d, 0xe1, 0xd9, 0xde, 0xa5, 0xc5, 0xe3, 0xdb, 0x02, 0x5d, 0x4d, 0x66, 0x92, 0xba, 0x9c, 0x72,
0x9b, 0x2f, 0x42, 0xcf, 0x9f, 0x71, 0xdf, 0xd1, 0xf7, 0x94, 0xcc, 0x2c, 0x11, 0xe9, 0xfe, 0x10,
0x76, 0xd7, 0x9c, 0xbe, 0xd5, 0xc8, 0x18, 0xc2, 0xdd, 0x3c, 0x4b, 0xec, 0xe7, 0x70, 0xe0, 0x18,
0xe1, 0xe2, 0xdb, 0xb9, 0x6d, 0x5c, 0x70, 0x1b, 0x83, 0x80, 0x43, 0xad, 0xe5, 0xb9, 0xf1, 0x75,
0xfe, 0x71, 0xde, 0x26, 0xc7, 0x08, 0xc6, 0xa9, 0xd0, 0xf2, 0x39, 0x5e, 0xc9, 0xf4, 0x7d, 0x52,
0x42, 0xe4, 0x61, 0xaa, 0x42, 0x1b, 0xc3, 0xa3, 0x9b, 0x44, 0x73, 0xbc, 0xb8, 0x07, 0x15, 0xda,
0xb8, 0x7c, 0x24, 0xa8, 0xeb, 0x6a, 0xa5, 0xfd, 0xa1, 0x00, 0x5d, 0x75, 0x59, 0x90, 0x69, 0x59,
0x7d, 0x8b, 0x79, 0xb3, 0xf6, 0x16, 0xf3, 0x2c, 0x73, 0xd7, 0xce, 0xc1, 0xe7, 0x3e, 0xcc, 0xe8,
0x37, 0x3d, 0xcc, 0x7c, 0x2f, 0x1b, 0xe1, 0xd6, 0xd1, 0xc1, 0x35, 0x36, 0x32, 0xa1, 0x7f, 0xf6,
0x31, 0xdc, 0xc9, 0x41, 0xb0, 0x3a, 0x94, 0x65, 0x73, 0xdf, 0xc2, 0xe6, 0x3e, 0x39, 0x9d, 0xcd,
0xe5, 0xb2, 0x70, 0xf4, 0xa7, 0x32, 0xb4, 0x7a, 0x42, 0xe8, 0xf2, 0x89, 0x6c, 0xba, 0x74, 0x17,
0xec, 0x25, 0xec, 0x1c, 0xf3, 0xb0, 0x27, 0x84, 0x12, 0xbe, 0x93, 0xb1, 0x1b, 0xbf, 0x76, 0x75,
0xf7, 0x36, 0x1e, 0x9f, 0xb4, 0x2d, 0xf6, 0x0a, 0x40, 0x4a, 0xd2, 0x03, 0x0c, 0xcb, 0xc8, 0xc5,
0x62, 0xfb, 0x1b, 0x6f, 0x12, 0x38, 0x65, 0x68, 0x5b, 0xec, 0x05, 0x34, 0x8f, 0x79, 0x98, 0xb9,
0xda, 0xe7, 0x49, 0xb7, 0x56, 0xef, 0x8f, 0xda, 0x16, 0x7b, 0x0d, 0x7b, 0xc7, 0x3c, 0x5c, 0xbb,
0x9f, 0xd0, 0xde, 0x56, 0x9e, 0xda, 0xba, 0x2c, 0x4b, 0x92, 0x30, 0x6d, 0x8b, 0xbd, 0x85, 0x03,
0x34, 0x9f, 0x37, 0x29, 0xe5, 0x99, 0x3f, 0xc8, 0x1f, 0x98, 0x02, 0x6d, 0x8b, 0xf5, 0x61, 0x3f,
0x77, 0xa2, 0x66, 0x74, 0x63, 0xbe, 0x76, 0xd8, 0xee, 0xd6, 0x91, 0x2d, 0xdf, 0x20, 0x49, 0x49,
0xee, 0x44, 0x2c, 0x95, 0x5c, 0x3b, 0x2c, 0x6f, 0x28, 0xc9, 0x1d, 0x69, 0x99, 0xba, 0xbb, 0xdb,
0xff, 0x8a, 0x92, 0x4f, 0xa9, 0x04, 0xd2, 0xd3, 0x8f, 0x4a, 0x60, 0x6d, 0xd2, 0xeb, 0xc6, 0x67,
0x97, 0xa4, 0x90, 0x14, 0x26, 0x63, 0xad, 0xc5, 0xa7, 0x7a, 0x65, 0x12, 0x56, 0xd9, 0xda, 0x16,
0xfb, 0x31, 0x30, 0x59, 0x34, 0x2b, 0x15, 0x9b, 0x17, 0xff, 0x0f, 0xfe, 0xf9, 0x4f, 0xa6, 0x6d,
0x5d, 0x54, 0xe8, 0x6d, 0xf7, 0x07, 0xff, 0x08, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xf9, 0x45, 0xb1,
0xf7, 0x15, 0x00, 0x00,
}

View File

@ -12,6 +12,7 @@ service AppRuntimeSync {
rpc DelThirdPartyEndpoint (DelThirdPartyEndpointsReq) returns (Empty) {}
rpc GetPodDetail(GetPodDetailReq) returns (PodDetail) {}
rpc GetStorageClasses(Empty) returns (StorageClasses) {}
rpc GetAppVolumeStatus(ServiceRequest) returns(ServiceVolumeStatusMessage){}
}
message Empty {}
@ -210,4 +211,13 @@ repeated TopologySelectorLabelRequirement match_label_expressions = 1;
message TopologySelectorLabelRequirement {
string key = 1;
repeated string values = 2;
}
enum ServiceVolumeStatus {
READY = 0;
NOT_READY = 1;
}
message ServiceVolumeStatusMessage {
map<string, ServiceVolumeStatus> status = 1;
}

View File

@ -462,3 +462,31 @@ func (r *RuntimeServer) GetStorageClasses(ctx context.Context, re *pb.Empty) (*p
}
return storageclasses, nil
}
// GetAppVolumeStatus get app volume status
func (r *RuntimeServer) GetAppVolumeStatus(ctx context.Context, re *pb.ServiceRequest) (*pb.ServiceVolumeStatusMessage, error) {
ret := new(pb.ServiceVolumeStatusMessage)
ret.Status = make(map[string]pb.ServiceVolumeStatus)
as := r.store.GetAppService(re.ServiceId)
if as == nil {
return ret, nil
}
// claims := as.GetClaims()// TODO 临时使用client直接获取PVC后续换成store中获取
claimList, err := r.clientset.CoreV1().PersistentVolumeClaims(as.TenantID).List(metav1.ListOptions{LabelSelector: "service_id=69123df08744e36800c29c91574370d5"})
if err != nil {
return ret, err
}
if claimList != nil {
for _, claim := range claimList.Items {
if claim.Annotations != nil {
if claim.Status.Phase != corev1.ClaimBound {
ret.Status[claim.Annotations["volume_name"]] = pb.ServiceVolumeStatus_NOT_READY
} else {
ret.Status[claim.Annotations["volume_name"]] = pb.ServiceVolumeStatus_READY
}
}
}
}
return ret, nil
}

View File

@ -8,8 +8,11 @@ import (
"testing"
"time"
"github.com/eapache/channels"
"github.com/golang/mock/gomock"
"github.com/goodrain/rainbond/cmd/worker/option"
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/db/config"
"github.com/goodrain/rainbond/worker/appm/store"
v1 "github.com/goodrain/rainbond/worker/appm/types/v1"
"github.com/goodrain/rainbond/worker/server/pb"
@ -196,3 +199,51 @@ func TestGetStorageClass(t *testing.T) {
}
}
}
func TestGetAppVolumeStatus(t *testing.T) {
ocfg := option.Config{
DBType: "mysql",
MysqlConnectionInfo: "oc6Poh:noot6Mea@tcp(192.168.2.203:3306)/region",
EtcdEndPoints: []string{"http://192.168.2.203:2379"},
EtcdTimeout: 5,
KubeConfig: "/Users/fanyangyang/Documents/company/goodrain/admin.kubeconfig",
LeaderElectionNamespace: "rainbond",
}
dbconfig := config.Config{
DBType: ocfg.DBType,
MysqlConnectionInfo: ocfg.MysqlConnectionInfo,
EtcdEndPoints: ocfg.EtcdEndPoints,
EtcdTimeout: ocfg.EtcdTimeout,
}
//step 1:db manager init ,event log client init
if err := db.CreateManager(dbconfig); err != nil {
t.Fatalf("error creating db manager: %v", err)
}
defer db.CloseManager()
c, err := clientcmd.BuildConfigFromFlags("", ocfg.KubeConfig)
if err != nil {
t.Fatalf("read kube config file error: %v", err)
}
clientset, err := kubernetes.NewForConfig(c)
if err != nil {
t.Fatalf("create kube api client error: %v", err)
}
startCh := channels.NewRingChannel(1024)
probeCh := channels.NewRingChannel(1024)
storer := store.NewStore(clientset, db.GetManager(), option.Config{LeaderElectionNamespace: ocfg.LeaderElectionNamespace, KubeClient: clientset}, startCh, probeCh)
if err := storer.Start(); err != nil {
t.Fatalf("error starting store: %v", err)
}
server := &RuntimeServer{
store: storer,
clientset: clientset,
}
statusList, err := server.GetAppVolumeStatus(context.Background(), &pb.ServiceRequest{ServiceId: "69123df08744e36800c29c91574370d5"})
if err != nil {
t.Fatal(err)
}
t.Log(statusList.GetStatus())
time.Sleep(20 * time.Second) // db woulld close
}