diff --git a/.github/workflows/check-format-code.yml b/.github/workflows/check-format-code.yml index 6167ee486e1..6215a7e4d02 100755 --- a/.github/workflows/check-format-code.yml +++ b/.github/workflows/check-format-code.yml @@ -21,7 +21,7 @@ on: - "CHANGELOG/**" env: # Common versions - GO_VERSION: "1.20" + GO_VERSION: "1.23" jobs: format-code: diff --git a/.github/workflows/controllers.yml b/.github/workflows/controllers.yml index 1577b7bf132..0f846527bfc 100644 --- a/.github/workflows/controllers.yml +++ b/.github/workflows/controllers.yml @@ -99,6 +99,7 @@ jobs: - { name: job-heartbeat, path: job/heartbeat } - { name: resources, path: resources } - { name: node, path: node } + - { name: devbox, path: devbox} - { name: objectstorage, path: objectstorage } steps: - name: Checkout @@ -201,6 +202,7 @@ jobs: - { name: job-heartbeat, path: job/heartbeat } - { name: resources, path: resources } - { name: node, path: node } + - { name: devbox, path: devbox } - { name: objectstorage, path: objectstorage } steps: - name: Checkout diff --git a/.github/workflows/services.yml b/.github/workflows/services.yml index 00170a4b298..da03a2badfe 100644 --- a/.github/workflows/services.yml +++ b/.github/workflows/services.yml @@ -44,7 +44,7 @@ on: - "!**/*.yaml" env: # Common versions - GO_VERSION: "1.20" + GO_VERSION: "1.22" DEFAULT_OWNER: "labring" CRYPTOKEY: ${{ secrets.CONTROLLER_BUILD_CRYPTOKEY }} diff --git a/.gitignore b/.gitignore index 4411fc345ff..ab88cf2803c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ tmp **/.DS_Store node_modules vendor -.vscode/ pkg/registry/save/testdata/registry .dummy.report.md deploy/cloud/tars +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md index 67176d0a2b9..cb2291c09b7 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ A Cloud Operating System designed for managing cloud-native applications -https://github.com/labring/sealos/assets/82700206/b1f8a25a-55cf-4d15-a47b-38cf7d507134 +https://github.com/user-attachments/assets/a7b7ed5c-0e31-4158-8a76-3b161ed70a70

Docs | diff --git a/README_zh.md b/README_zh.md index 9fcd6dd9b7c..1336e1cf98b 100644 --- a/README_zh.md +++ b/README_zh.md @@ -26,7 +26,7 @@ -https://github.com/labring/sealos/assets/82700206/b1f8a25a-55cf-4d15-a47b-38cf7d507134 +https://github.com/user-attachments/assets/a7b7ed5c-0e31-4158-8a76-3b161ed70a70

文档 | diff --git a/controllers/account/api/v1/debt_types.go b/controllers/account/api/v1/debt_types.go index 5a23d350ea0..e9d2228c9b5 100644 --- a/controllers/account/api/v1/debt_types.go +++ b/controllers/account/api/v1/debt_types.go @@ -51,14 +51,16 @@ var DefaultDebtConfig = map[DebtStatusType]int64{ const DebtNamespaceAnnoStatusKey = "debt.sealos/status" const ( - NormalDebtNamespaceAnnoStatus = "Normal" - SuspendDebtNamespaceAnnoStatus = "Suspend" - ResumeDebtNamespaceAnnoStatus = "Resume" + NormalDebtNamespaceAnnoStatus = "Normal" + SuspendDebtNamespaceAnnoStatus = "Suspend" + ResumeDebtNamespaceAnnoStatus = "Resume" + TerminateSuspendDebtNamespaceAnnoStatus = "TerminateSuspend" ) // DebtSpec defines the desired state of Debt type DebtSpec struct { UserName string `json:"userName,omitempty"` + UserID string `json:"userID,omitempty"` } // DebtStatus defines the observed state of Debt diff --git a/controllers/account/api/v1/debt_webhook.go b/controllers/account/api/v1/debt_webhook.go index 85519c937a0..942a9f05bd8 100644 --- a/controllers/account/api/v1/debt_webhook.go +++ b/controllers/account/api/v1/debt_webhook.go @@ -85,9 +85,12 @@ func (d *DebtValidate) Handle(ctx context.Context, req admission.Request) admiss return admission.ValidationResponse(true, "") } // is user sa - if !strings.HasPrefix(g, saPrefix+":ns-") { + if !strings.HasPrefix(g, saPrefix+":user-system") { continue } + if strings.Contains(req.UserInfo.Username, "user-controller-manager") { + break + } if isWhiteList(req) { return admission.ValidationResponse(true, "") } diff --git a/controllers/account/api/v1/payment_types.go b/controllers/account/api/v1/payment_types.go index a1fe9d1410c..bd287b4b571 100644 --- a/controllers/account/api/v1/payment_types.go +++ b/controllers/account/api/v1/payment_types.go @@ -45,6 +45,8 @@ type PaymentSpec struct { // UserID is the user id who want to recharge UserID string `json:"userID,omitempty"` + // UserCr is the user cr name who want to recharge + UserCR string `json:"userCR,omitempty"` // Amount is the amount of recharge Amount int64 `json:"amount,omitempty"` // e.g. wechat, alipay, creditcard, etc. diff --git a/controllers/account/config/crd/bases/account.sealos.io_debts.yaml b/controllers/account/config/crd/bases/account.sealos.io_debts.yaml index 28508b2ff9f..ae0db6f8040 100644 --- a/controllers/account/config/crd/bases/account.sealos.io_debts.yaml +++ b/controllers/account/config/crd/bases/account.sealos.io_debts.yaml @@ -55,6 +55,8 @@ spec: properties: userName: type: string + userID: + type: string type: object status: description: DebtStatus defines the observed state of Debt diff --git a/controllers/account/config/crd/bases/account.sealos.io_payments.yaml b/controllers/account/config/crd/bases/account.sealos.io_payments.yaml index 410b07ba695..d5e0ad03a3a 100644 --- a/controllers/account/config/crd/bases/account.sealos.io_payments.yaml +++ b/controllers/account/config/crd/bases/account.sealos.io_payments.yaml @@ -60,6 +60,9 @@ spec: userID: description: UserID is the user id who want to recharge type: string + userCR: + description: UserCr is the user cr name who want to recharge + type: string type: object status: description: PaymentStatus defines the observed state of Payment diff --git a/controllers/account/controllers/account_controller.go b/controllers/account/controllers/account_controller.go index 78a1efea462..b20dbbaf664 100644 --- a/controllers/account/controllers/account_controller.go +++ b/controllers/account/controllers/account_controller.go @@ -44,7 +44,6 @@ import ( accountv1 "github.com/labring/sealos/controllers/account/api/v1" "github.com/labring/sealos/controllers/pkg/database" - "github.com/labring/sealos/controllers/pkg/pay" "github.com/labring/sealos/controllers/pkg/resources" pkgtypes "github.com/labring/sealos/controllers/pkg/types" "github.com/labring/sealos/controllers/pkg/utils/env" @@ -58,8 +57,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" ) const ( @@ -98,11 +95,6 @@ type AccountReconciler struct { //+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete func (r *AccountReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - //It should not stop the normal process for the failure to delete the payment - // delete payments that exist for more than 5 minutes - if err := r.DeletePayment(ctx); err != nil { - r.Logger.Error(err, "delete payment failed") - } user := &userv1.User{} owner := "" if err := r.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: req.Name}, user); err == nil { @@ -113,82 +105,14 @@ func (r *AccountReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct // determine the resource quota created by the owner user and the resource quota initialized by the account user, // and only the resource quota created by the team user _, err = r.syncAccount(ctx, owner, "ns-"+user.Name) + if errors.Is(err, gorm.ErrRecordNotFound) && user.CreationTimestamp.Add(20*24*time.Hour).Before(time.Now()) { + return ctrl.Result{}, nil + } return ctrl.Result{}, err } else if client.IgnoreNotFound(err) != nil { return ctrl.Result{}, err } - payment := &accountv1.Payment{} - if err := r.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: req.Name}, payment); err != nil { - return ctrl.Result{}, client.IgnoreNotFound(err) - } - if payment.Spec.UserID == "" || payment.Spec.Amount == 0 { - return ctrl.Result{}, fmt.Errorf("payment is invalid: %v", payment) - } - if payment.Status.TradeNO == "" { - return ctrl.Result{Requeue: true, RequeueAfter: time.Millisecond * 300}, nil - } - if payment.Status.Status == pay.PaymentSuccess { - return ctrl.Result{}, nil - } - - account, err := r.syncAccount(ctx, getUsername(payment.Spec.UserID), payment.Namespace) - if err != nil { - return ctrl.Result{}, fmt.Errorf("get account failed: %v", err) - } - - // get payment handler - payHandler, err := pay.NewPayHandler(payment.Spec.PaymentMethod) - if err != nil { - r.Logger.Error(err, "get payment handler failed") - return ctrl.Result{}, err - } - // get payment details(status, amount) - // TODO The GetPaymentDetails may cause issues when using Stripe - status, orderAmount, err := payHandler.GetPaymentDetails(payment.Status.TradeNO) - if err != nil { - return ctrl.Result{}, fmt.Errorf("query order failed: %v", err) - } - r.Logger.V(1).Info("query order details", "orderStatus", status, "orderAmount", orderAmount) - switch status { - case pay.PaymentSuccess: - //1¥ = 100WechatPayAmount; 1 WechatPayAmount = 10000 SealosAmount - payAmount := orderAmount * 10000 - gift, err := r.getAmountWithRates(payAmount, account) - if err != nil { - r.Logger.Error(err, "get gift error") - } - if err = r.AccountV2.Payment(&pkgtypes.Payment{ - PaymentRaw: pkgtypes.PaymentRaw{ - UserUID: account.UserUID, - Amount: payAmount, - Gift: gift, - CreatedAt: payment.CreationTimestamp.Time, - RegionUserOwner: owner, - Method: payment.Spec.PaymentMethod, - TradeNO: payment.Status.TradeNO, - CodeURL: payment.Status.CodeURL, - }, - }); err != nil { - r.Logger.Error(err, "save payment failed", "payment", payment) - return ctrl.Result{}, nil - } - payment.Status.Status = pay.PaymentSuccess - if err := r.Status().Update(ctx, payment); err != nil { - return ctrl.Result{}, fmt.Errorf("update payment failed: %v", err) - } - - case pay.PaymentProcessing, pay.PaymentNotPaid: - return ctrl.Result{Requeue: true, RequeueAfter: time.Second}, nil - case pay.PaymentFailed, pay.PaymentExpired: - if err := r.Delete(ctx, payment); err != nil { - return ctrl.Result{}, fmt.Errorf("delete payment failed: %v", err) - } - return ctrl.Result{}, nil - default: - return ctrl.Result{}, fmt.Errorf("unknown status: %v", err) - } - return ctrl.Result{}, nil } @@ -204,10 +128,7 @@ func (r *AccountReconciler) syncAccount(ctx context.Context, owner string, userN } account, err := r.AccountV2.NewAccount(&pkgtypes.UserQueryOpts{Owner: owner}) if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, fmt.Errorf("failed to create %s account: %v", owner, err) + return nil, err } return account, nil } @@ -245,53 +166,12 @@ func (r *AccountReconciler) adaptEphemeralStorageLimitRange(ctx context.Context, }) } -// DeletePayment delete payments that exist for more than 5 minutes -func (r *AccountReconciler) DeletePayment(ctx context.Context) error { - payments := &accountv1.PaymentList{} - err := r.List(ctx, payments) - if err != nil { - return err - } - for _, payment := range payments.Items { - //get payment handler - payHandler, err := pay.NewPayHandler(payment.Spec.PaymentMethod) - if err != nil { - r.Logger.Error(err, "get payment handler failed") - return err - } - //delete payment if it is exist for more than 5 minutes - if time.Since(payment.CreationTimestamp.Time) > time.Minute*5 { - if payment.Status.TradeNO != "" { - status, amount, err := payHandler.GetPaymentDetails(payment.Status.TradeNO) - if err != nil { - r.Logger.Error(err, "get payment details failed") - } - if status == pay.PaymentSuccess { - if payment.Status.Status != pay.PaymentSuccess { - continue - } - r.Logger.Info("payment success, post delete payment cr", "payment", payment, "amount", amount) - } - // expire session - if err = payHandler.ExpireSession(payment.Status.TradeNO); err != nil { - r.Logger.Error(err, "cancel payment failed") - } - } - if err := r.Delete(ctx, &payment); err != nil { - return err - } - } - } - return nil -} - // SetupWithManager sets up the controller with the Manager. func (r *AccountReconciler) SetupWithManager(mgr ctrl.Manager, rateOpts controller.Options) error { r.Logger = ctrl.Log.WithName("account_controller") r.AccountSystemNamespace = env.GetEnvWithDefault(ACCOUNTNAMESPACEENV, DEFAULTACCOUNTNAMESPACE) return ctrl.NewControllerManagedBy(mgr). For(&userv1.User{}, builder.WithPredicates(OnlyCreatePredicate{})). - Watches(&source.Kind{Type: &accountv1.Payment{}}, &handler.EnqueueRequestForObject{}). WithOptions(rateOpts). Complete(r) } @@ -352,49 +232,49 @@ func parseConfigList(s string, list interface{}, configName string) error { return nil } -func GetUserOwner(user *userv1.User) string { - own := user.Annotations[userv1.UserAnnotationOwnerKey] - if own == "" { - return user.Name - } - return own -} +//func GetUserOwner(user *userv1.User) string { +// own := user.Annotations[userv1.UserAnnotationOwnerKey] +// if own == "" { +// return user.Name +// } +// return own +//} const BaseUnit = 1_000_000 -func (r *AccountReconciler) getAmountWithRates(amount int64, account *pkgtypes.Account) (amt int64, err error) { - //userActivities, err := pkgtypes.ParseUserActivities(account.Annotations) - //if err != nil { - // return nil, 0, fmt.Errorf("parse user activities failed: %w", err) - //} - // - //rechargeDiscount := pkgtypes.RechargeDiscount{ - // DiscountSteps: r.RechargeStep, - // DiscountRates: r.RechargeRatio, - //} - //if len(userActivities) > 0 { - // if activityType, phase, _ := pkgtypes.GetUserActivityDiscount(r.Activities, &userActivities); phase != nil { - // if len(phase.RechargeDiscount.DiscountSteps) > 0 { - // rechargeDiscount.DiscountSteps = phase.RechargeDiscount.DiscountSteps - // rechargeDiscount.DiscountRates = phase.RechargeDiscount.DiscountRates - // } - // rechargeDiscount.SpecialDiscount = phase.RechargeDiscount.SpecialDiscount - // rechargeDiscount = phase.RechargeDiscount - // currentPhase := userActivities[activityType].Phases[userActivities[activityType].CurrentPhase] - // anno = pkgtypes.SetUserPhaseRechargeTimes(account.Annotations, activityType, currentPhase.Name, currentPhase.RechargeNums+1) - // } - //} - //return anno, getAmountWithDiscount(amount, rechargeDiscount), nil - - discount, err := r.AccountV2.GetUserAccountRechargeDiscount(&pkgtypes.UserQueryOpts{UID: account.UserUID}) - if err != nil { - return 0, fmt.Errorf("get user %s account recharge discount failed: %w", account.UserUID, err) - } - if discount == nil || discount.DiscountSteps == nil || discount.DiscountRates == nil { - return getAmountWithDiscount(amount, r.DefaultDiscount), nil - } - return getAmountWithDiscount(amount, *discount), nil -} +//func (r *AccountReconciler) getAmountWithRates(amount int64, account *pkgtypes.Account) (amt int64, err error) { +// //userActivities, err := pkgtypes.ParseUserActivities(account.Annotations) +// //if err != nil { +// // return nil, 0, fmt.Errorf("parse user activities failed: %w", err) +// //} +// // +// //rechargeDiscount := pkgtypes.RechargeDiscount{ +// // DiscountSteps: r.RechargeStep, +// // DiscountRates: r.RechargeRatio, +// //} +// //if len(userActivities) > 0 { +// // if activityType, phase, _ := pkgtypes.GetUserActivityDiscount(r.Activities, &userActivities); phase != nil { +// // if len(phase.RechargeDiscount.DiscountSteps) > 0 { +// // rechargeDiscount.DiscountSteps = phase.RechargeDiscount.DiscountSteps +// // rechargeDiscount.DiscountRates = phase.RechargeDiscount.DiscountRates +// // } +// // rechargeDiscount.SpecialDiscount = phase.RechargeDiscount.SpecialDiscount +// // rechargeDiscount = phase.RechargeDiscount +// // currentPhase := userActivities[activityType].Phases[userActivities[activityType].CurrentPhase] +// // anno = pkgtypes.SetUserPhaseRechargeTimes(account.Annotations, activityType, currentPhase.Name, currentPhase.RechargeNums+1) +// // } +// //} +// //return anno, getAmountWithDiscount(amount, rechargeDiscount), nil +// +// discount, err := r.AccountV2.GetUserAccountRechargeDiscount(&pkgtypes.UserQueryOpts{UID: account.UserUID}) +// if err != nil { +// return 0, fmt.Errorf("get user %s account recharge discount failed: %w", account.UserUID, err) +// } +// if discount == nil || discount.DiscountSteps == nil || discount.DiscountRates == nil { +// return getAmountWithDiscount(amount, r.DefaultDiscount), nil +// } +// return getAmountWithDiscount(amount, *discount), nil +//} func getAmountWithDiscount(amount int64, discount pkgtypes.RechargeDiscount) int64 { if discount.SpecialDiscount != nil && discount.SpecialDiscount[amount/BaseUnit] != 0 { diff --git a/controllers/account/controllers/billing_controller.go b/controllers/account/controllers/billing_controller.go index 3809186bf30..7d78299d9d8 100644 --- a/controllers/account/controllers/billing_controller.go +++ b/controllers/account/controllers/billing_controller.go @@ -172,13 +172,13 @@ func (r *BillingReconciler) SetupWithManager(mgr ctrl.Manager, rateOpts controll own, ok := createEvent.Object.GetLabels()[v1.UserLabelOwnerKey] return ok && getUsername(createEvent.Object.GetName()) == own }, - UpdateFunc: func(updateEvent event.UpdateEvent) bool { + UpdateFunc: func(_ event.UpdateEvent) bool { return false }, - DeleteFunc: func(deleteEvent event.DeleteEvent) bool { + DeleteFunc: func(_ event.DeleteEvent) bool { return false }, - GenericFunc: func(genericEvent event.GenericEvent) bool { + GenericFunc: func(_ event.GenericEvent) bool { return false }, })). diff --git a/controllers/account/controllers/billingrecordquery_controller.go b/controllers/account/controllers/billingrecordquery_controller.go index 28b5417f4e7..1a5b86f47bd 100644 --- a/controllers/account/controllers/billingrecordquery_controller.go +++ b/controllers/account/controllers/billingrecordquery_controller.go @@ -38,7 +38,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/source" ) // BillingRecordQueryReconciler reconciles a BillingRecordQuery object @@ -137,7 +136,7 @@ func (r *BillingRecordQueryReconciler) SetupWithManager(mgr ctrl.Manager, rateOp r.AccountSystemNamespace = env.GetEnvWithDefault(ACCOUNTNAMESPACEENV, DEFAULTACCOUNTNAMESPACE) return ctrl.NewControllerManagedBy(mgr). For(&accountv1.BillingRecordQuery{}). - Watches(&source.Kind{Type: &accountv1.PriceQuery{}}, &handler.EnqueueRequestForObject{}). + Watches(&accountv1.PriceQuery{}, &handler.EnqueueRequestForObject{}). WithOptions(rateOpts). Complete(r) } diff --git a/controllers/account/controllers/debt_controller.go b/controllers/account/controllers/debt_controller.go index 73a509d5772..91fa144d317 100644 --- a/controllers/account/controllers/debt_controller.go +++ b/controllers/account/controllers/debt_controller.go @@ -34,10 +34,8 @@ import ( "github.com/labring/sealos/controllers/pkg/pay" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - "gorm.io/gorm" + "sigs.k8s.io/controller-runtime/pkg/handler" "github.com/labring/sealos/controllers/pkg/database/cockroach" @@ -136,11 +134,27 @@ func (r *DebtReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if payment.Status.Status != pay.PaymentSuccess { return ctrl.Result{RequeueAfter: 10 * time.Second}, nil } - reconcileErr = r.reconcile(ctx, payment.Spec.UserID) + reconcileErr = r.reconcile(ctx, payment.Spec.UserCR, payment.Spec.UserID) } else if client.IgnoreNotFound(err) != nil { return ctrl.Result{}, fmt.Errorf("failed to get payment %s: %v", req.Name, err) } else { - reconcileErr = r.reconcile(ctx, req.NamespacedName.Name) + cr, err := r.AccountV2.GetUserCr(&pkgtypes.UserQueryOpts{Owner: req.NamespacedName.Name}) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + r.Logger.Info("user cr not exist, skip", "user", req.NamespacedName.Name) + return ctrl.Result{}, nil + } + return ctrl.Result{RequeueAfter: 10 * time.Minute}, fmt.Errorf("failed to get user cr %s: %v", req.NamespacedName.Name, err) + } + user, err := r.AccountV2.GetUser(&pkgtypes.UserQueryOpts{Owner: req.NamespacedName.Name, UID: cr.UserUID}) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + r.Logger.Info("user not exist, skip", "user", req.NamespacedName.Name) + return ctrl.Result{}, nil + } + return ctrl.Result{RequeueAfter: 10 * time.Minute}, fmt.Errorf("failed to get user %s: %v", req.NamespacedName.Name, err) + } + reconcileErr = r.reconcile(ctx, req.NamespacedName.Name, user.ID) } if reconcileErr != nil { if reconcileErr == ErrAccountNotExist { @@ -152,46 +166,75 @@ func (r *DebtReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. return ctrl.Result{RequeueAfter: r.DebtDetectionCycle}, nil } -func (r *DebtReconciler) reconcile(ctx context.Context, owner string) error { +//func (r *DebtReconciler) getNamespaceOwner(namespace string) (string, error) { +// ns := &corev1.Namespace{} +// if err := r.Get(context.Background(), client.ObjectKey{Name: namespace}, ns); err != nil { +// return "", fmt.Errorf("failed to get namespace %s: %v", namespace, err) +// } +// if ns.Labels == nil { +// return "", fmt.Errorf("namespace %s labels is nil", namespace) +// } +// owner, ok := ns.Labels[userv1.UserAnnotationOwnerKey] +// if !ok { +// return "", fmt.Errorf("namespace %s owner is not exist", namespace) +// } +// return owner, nil +//} + +func (r *DebtReconciler) reconcile(ctx context.Context, userCr, userID string) error { debt := &accountv1.Debt{} - account, err := r.AccountV2.GetAccount(&pkgtypes.UserQueryOpts{Owner: owner}) + userQueryOpts := &pkgtypes.UserQueryOpts{Owner: userCr, ID: userID} + account, err := r.AccountV2.GetAccount(userQueryOpts) if account == nil { if errors.Is(err, gorm.ErrRecordNotFound) { + _, err = r.AccountV2.NewAccount(userQueryOpts) + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("failed to create account %v: %v", userQueryOpts, err) + } userOwner := &userv1.User{} - if err := r.Get(ctx, types.NamespacedName{Name: owner, Namespace: r.accountSystemNamespace}, userOwner); err != nil { + if err := r.Get(ctx, types.NamespacedName{Name: userCr, Namespace: r.accountSystemNamespace}, userOwner); err != nil { // if user not exist, skip if client.IgnoreNotFound(err) == nil { return nil } - return fmt.Errorf("failed to get user %s: %v", owner, err) + return fmt.Errorf("failed to get usercr %s: %v", userCr, err) } // if user not exist, skip if userOwner.CreationTimestamp.Add(20 * 24 * time.Hour).Before(time.Now()) { return nil } } - r.Logger.Error(fmt.Errorf("account %s not exist", owner), err.Error()) + if err != nil { + r.Logger.Error(fmt.Errorf("account %v not exist", userQueryOpts), err.Error()) + } return ErrAccountNotExist } if account.CreateRegionID == "" { if err = r.AccountV2.SetAccountCreateLocalRegion(account, r.LocalRegionID); err != nil { - return fmt.Errorf("failed to set account %s create region: %v", owner, err) + return fmt.Errorf("failed to set account %v create region: %v", userQueryOpts, err) } } // In a multi-region scenario, select the region where the account is created for SMS notification smsEnable := account.CreateRegionID == r.LocalRegionID //r.Logger.Info("reconcile debt", "account", owner, "balance", account.Balance, "deduction balance", account.DeductionBalance) - if err := r.Get(ctx, client.ObjectKey{Name: GetDebtName(owner), Namespace: r.accountSystemNamespace}, debt); client.IgnoreNotFound(err) != nil { + if err := r.Get(ctx, client.ObjectKey{Name: GetDebtName(userCr), Namespace: r.accountSystemNamespace}, debt); client.IgnoreNotFound(err) != nil { return err } else if err != nil { - if err := r.syncDebt(ctx, owner, debt); err != nil { + if err := r.syncDebt(ctx, userCr, userID, debt); err != nil { return err } //r.Logger.Info("create or update debt success", "debt", debt) } + // backward compatibility + if debt.Spec.UserID == "" { + debt.Spec.UserID = userID + if err := r.Update(ctx, debt); err != nil { + return fmt.Errorf("update debt %s failed: %v", debt.Name, err) + } + } - nsList, err := getOwnNsList(r.Client, getUsername(owner)) + nsList, err := getOwnNsList(r.Client, getUsername(userCr)) if err != nil { r.Logger.Error(err, "get own ns list error") return fmt.Errorf("get own ns list error: %v", err) @@ -359,11 +402,12 @@ func (r *DebtReconciler) reconcileDebtStatus(ctx context.Context, debt *accountv return nil } -func (r *DebtReconciler) syncDebt(ctx context.Context, owner string, debt *accountv1.Debt) error { +func (r *DebtReconciler) syncDebt(ctx context.Context, owner, userID string, debt *accountv1.Debt) error { debt.Name = GetDebtName(owner) debt.Namespace = r.accountSystemNamespace if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, debt, func() error { debt.Spec.UserName = owner + debt.Spec.UserID = userID return nil }); err != nil { return err @@ -463,7 +507,15 @@ func (r *DebtReconciler) sendSMSNotice(user string, oweAmount int64, noticeType if r.SmsConfig == nil && r.VmsConfig == nil && r.smtpConfig == nil { return nil } - outh, err := r.AccountV2.GetUserOauthProvider(&pkgtypes.UserQueryOpts{Owner: user}) + _user, err := r.AccountV2.GetUser(&pkgtypes.UserQueryOpts{Owner: user}) + if err != nil { + return fmt.Errorf("failed to get user: %w", err) + } + // skip abnormal user + if _user.Status != pkgtypes.UserStatusNormal { + return nil + } + outh, err := r.AccountV2.GetUserOauthProvider(&pkgtypes.UserQueryOpts{UID: _user.UID, ID: _user.ID}) if err != nil { return fmt.Errorf("failed to get user oauth provider: %w", err) } @@ -529,7 +581,9 @@ func (r *DebtReconciler) readNotice(ctx context.Context, namespaces []string, no } else if err != nil { continue } - if ntf.Labels != nil && ntf.Labels[readStatusLabel] == trueStatus { + if ntf.Labels == nil { + ntf.Labels = make(map[string]string) + } else if ntf.Labels[readStatusLabel] == trueStatus { continue } ntf.Labels[readStatusLabel] = trueStatus @@ -730,7 +784,7 @@ func (r *DebtReconciler) SetupWithManager(mgr ctrl.Manager, rateOpts controller. "accountSystemNamespace", r.accountSystemNamespace) return ctrl.NewControllerManagedBy(mgr). For(&userv1.User{}, builder.WithPredicates(predicate.And(UserOwnerPredicate{}))). - Watches(&source.Kind{Type: &accountv1.Payment{}}, &handler.EnqueueRequestForObject{}). + Watches(&accountv1.Payment{}, &handler.EnqueueRequestForObject{}). WithOptions(rateOpts). Complete(r) } diff --git a/controllers/account/controllers/namespace_controller.go b/controllers/account/controllers/namespace_controller.go index bf943949794..960e310a035 100644 --- a/controllers/account/controllers/namespace_controller.go +++ b/controllers/account/controllers/namespace_controller.go @@ -23,6 +23,8 @@ import ( "strings" "time" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "github.com/minio/madmin-go/v3" v1 "github.com/labring/sealos/controllers/account/api/v1" @@ -37,6 +39,8 @@ import ( objectstoragev1 "github/labring/sealos/controllers/objectstorage/api/v1" + kbv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1" + "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" @@ -100,7 +104,7 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( } logger.V(1).Info("debt status", "status", debtStatus) switch debtStatus { - case v1.SuspendDebtNamespaceAnnoStatus: + case v1.SuspendDebtNamespaceAnnoStatus, v1.TerminateSuspendDebtNamespaceAnnoStatus: if err := r.SuspendUserResource(ctx, req.NamespacedName.Name); err != nil { logger.Error(err, "suspend namespace resources failed") return ctrl.Result{}, err @@ -132,7 +136,7 @@ func (r *NamespaceReconciler) SuspendUserResource(ctx context.Context, namespace // suspend pod: deploy pod && clone unmanaged pod // delete infra cr pipelines := []func(context.Context, string) error{ - //r.suspendKBCluster, + r.suspendKBCluster, r.suspendOrphanPod, r.limitResourceQuotaCreate, r.deleteControlledPod, @@ -190,28 +194,32 @@ func GetLimit0ResourceQuota(namespace string) *corev1.ResourceQuota { return "a } -//func (r *NamespaceReconciler) suspendKBCluster(ctx context.Context, namespace string) error { -// kbClusterList := kbv1alpha1.ClusterList{} -// if err := r.Client.List(ctx, &kbClusterList, client.InNamespace(namespace)); err != nil { -// return err -// } -// for _, kbCluster := range kbClusterList.Items { -// if kbCluster.Status.Phase != kbv1alpha1.RunningClusterPhase { -// continue -// } -// ops := kbv1alpha1.OpsRequest{} -// ops.Namespace = kbCluster.Namespace -// ops.ObjectMeta.Name = "stop-" + kbCluster.Name + "-" + time.Now().Format("2006-01-02-15") -// ops.Spec.TTLSecondsAfterSucceed = 1 -// ops.Spec.ClusterRef = kbCluster.Name -// ops.Spec.Type = "Stop" -// err := r.Client.Create(ctx, &ops) -// if err != nil { -// r.Log.Error(err, "create ops request failed", "ops", ops.Name, "namespace", ops.Namespace) -// } -// } -// return nil -//} +func (r *NamespaceReconciler) suspendKBCluster(ctx context.Context, namespace string) error { + kbClusterList := kbv1alpha1.ClusterList{} + if err := r.Client.List(ctx, &kbClusterList, client.InNamespace(namespace)); err != nil { + return err + } + for _, kbCluster := range kbClusterList.Items { + if kbCluster.Status.Phase == kbv1alpha1.StoppedClusterPhase || kbCluster.Status.Phase == kbv1alpha1.StoppingClusterPhase { + continue + } + ops := kbv1alpha1.OpsRequest{} + ops.Namespace = kbCluster.Namespace + ops.ObjectMeta.Name = "stop-" + kbCluster.Name + "-" + time.Now().Format("2006-01-02-15") + ops.Spec.TTLSecondsAfterSucceed = 1 + abort := int32(60 * 60) + ops.Spec.TTLSecondsBeforeAbort = &abort + ops.Spec.ClusterRef = kbCluster.Name + ops.Spec.Type = "Stop" + _, err := controllerutil.CreateOrUpdate(ctx, r.Client, &ops, func() error { + return nil + }) + if err != nil { + r.Log.Error(err, "create ops request failed", "ops", ops.Name, "namespace", ops.Namespace) + } + } + return nil +} func (r *NamespaceReconciler) suspendOrphanPod(ctx context.Context, namespace string) error { podList := corev1.PodList{} @@ -315,7 +323,7 @@ func (r *NamespaceReconciler) resumePod(ctx context.Context, namespace string) e func (r *NamespaceReconciler) recreatePod(ctx context.Context, oldPod corev1.Pod, newPod *corev1.Pod) error { list := corev1.PodList{} - watcher, err := r.Client.Watch(ctx, &list) + watcher, err := r.Client.Watch(ctx, &list, client.InNamespace(oldPod.Namespace)) if err != nil { return fmt.Errorf("failed to start watch stream for pod %s: %w", oldPod.Name, err) } diff --git a/controllers/account/controllers/payment_controller.go b/controllers/account/controllers/payment_controller.go index 0fc3bcbbe2e..5f0ab3223b9 100644 --- a/controllers/account/controllers/payment_controller.go +++ b/controllers/account/controllers/payment_controller.go @@ -18,21 +18,22 @@ package controllers import ( "context" + "fmt" "os" + "sync" "time" - "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/manager" - "github.com/labring/sealos/controllers/pkg/pay" + pkgtypes "github.com/labring/sealos/controllers/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/builder" + "github.com/labring/sealos/controllers/pkg/pay" "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log" accountv1 "github.com/labring/sealos/controllers/account/api/v1" ) @@ -40,75 +41,282 @@ import ( // PaymentReconciler reconciles a Payment object type PaymentReconciler struct { client.Client - Scheme *runtime.Scheme - Logger logr.Logger - domain string + Account *AccountReconciler + WatchClient client.WithWatch + Scheme *runtime.Scheme + Logger logr.Logger + reconcileDuration time.Duration + createDuration time.Duration + domain string } +var ( + // Ensure PaymentReconciler implements the LeaderElectionRunnable and Runnable interface + _ manager.LeaderElectionRunnable = &PaymentReconciler{} + _ manager.Runnable = &PaymentReconciler{} +) + +const ( + EnvPaymentReconcileDuration = "PAYMENT_RECONCILE_DURATION" + EnvPaymentCreateDuration = "PAYMENT_CREATE_DURATION" + + defaultReconcileDuration = 10 * time.Second + defaultCreateDuration = 5 * time.Second +) + //+kubebuilder:rbac:groups=account.sealos.io,resources=payments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=account.sealos.io,resources=payments/status,verbs=get;update;patch //+kubebuilder:rbac:groups=account.sealos.io,resources=payments/finalizers,verbs=update -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -// TODO(user): Modify the Reconcile function to compare the state specified by -// the Payment object against the actual cluster state, and then -// perform operations to make the cluster state reflect the state specified by -// the user. -// -// For more details, check Reconcile and its Result here: -// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.12.2/pkg/reconcile -func (r *PaymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - r.Logger = log.FromContext(ctx) +// SetupWithManager sets up the controller with the Manager. +func (r *PaymentReconciler) SetupWithManager(mgr ctrl.Manager) error { + const controllerName = "payment_controller" + r.Logger = ctrl.Log.WithName(controllerName) + r.Logger.V(1).Info("init reconcile controller payment") + r.domain = os.Getenv("DOMAIN") + r.reconcileDuration = defaultReconcileDuration + r.createDuration = defaultCreateDuration + if duration := os.Getenv(EnvPaymentReconcileDuration); duration != "" { + reconcileDuration, err := time.ParseDuration(duration) + if err == nil { + r.reconcileDuration = reconcileDuration + } + } + if duration := os.Getenv(EnvPaymentCreateDuration); duration != "" { + createDuration, err := time.ParseDuration(duration) + if err == nil { + r.createDuration = createDuration + } + } + r.Logger.V(1).Info("reconcile duration", "reconcileDuration", r.reconcileDuration, "createDuration", r.createDuration) + if err := mgr.Add(r); err != nil { + return fmt.Errorf("add payment controller failed: %w", err) + } + return nil +} + +// LeaderElectionRunnable knows if a Runnable needs to be run in the leader election mode. +func (r *PaymentReconciler) NeedLeaderElection() bool { + return true +} - p := &accountv1.Payment{} - if err := r.Get(ctx, req.NamespacedName, p); err != nil { - r.Logger.Error(err, "get payment failed") - return ctrl.Result{}, client.IgnoreNotFound(err) +func (r *PaymentReconciler) Start(ctx context.Context) error { + var wg sync.WaitGroup + defer wg.Wait() + fc := func(wg *sync.WaitGroup, t *time.Ticker, reconcileFunc func(ctx context.Context) []error) { + wg.Add(1) + defer wg.Done() + for { + select { + case <-t.C: + if errs := reconcileFunc(ctx); len(errs) > 0 { + for _, err := range errs { + r.Logger.Error(err, "reconcile payments failed") + } + } + case <-ctx.Done(): + return + } + } + } + tickerReconcilePayment := time.NewTicker(r.reconcileDuration) + tickerNewPayment := time.NewTicker(r.createDuration) + go fc(&wg, tickerReconcilePayment, r.reconcilePayments) + go fc(&wg, tickerNewPayment, r.reconcileCreatePayments) + return nil +} + +func (r *PaymentReconciler) reconcilePayments(_ context.Context) (errs []error) { + paymentList := &accountv1.PaymentList{} + err := r.Client.List(context.Background(), paymentList, &client.ListOptions{}) + if err != nil { + errs = append(errs, fmt.Errorf("watch payment failed: %w", err)) + return + } + for _, payment := range paymentList.Items { + if err := r.reconcilePayment(&payment); err != nil { + errs = append(errs, fmt.Errorf("reconcile payment failed: payment: %s, user: %s, err: %w", payment.Name, payment.Spec.UserID, err)) + } } - if p.Status.TradeNO != "" { - return ctrl.Result{}, nil + return +} + +func (r *PaymentReconciler) reconcileCreatePayments(ctx context.Context) (errs []error) { + //paymentList := &accountv1.PaymentList{} + //listOpts := &client.ListOptions{ + // FieldSelector: fields.OneTermEqualSelector("status.tradeNO", ""), + //} + //// handler old payment + //err := r.Client.List(context.Background(), paymentList, listOpts) + //if err != nil { + // errs = append(errs, fmt.Errorf("watch payment failed: %w", err)) + // return + //} + //for _, payment := range paymentList.Items { + // if err := r.reconcileNewPayment(&payment); err != nil { + // errs = append(errs, fmt.Errorf("reconcile payment failed: payment: %s, user: %s, err: %w", payment.Name, payment.Spec.UserID, err)) + // } + //} + // watch new payment + watcher, err := r.WatchClient.Watch(context.Background(), &accountv1.PaymentList{}, &client.ListOptions{}) + if err != nil { + errs = append(errs, fmt.Errorf("watch payment failed: %w", err)) + return } - if p.Status.Status == "" { - p.Status.Status = "Created" - if err := r.Status().Update(ctx, p); err != nil { - r.Logger.Error(err, "update payment failed: %v", "payment", *p) - return ctrl.Result{Requeue: true}, err + select { + case <-ctx.Done(): + return + case event := <-watcher.ResultChan(): + if event.Object == nil { + break + } + payment, ok := event.Object.(*accountv1.Payment) + if !ok { + errs = append(errs, fmt.Errorf("convert payment failed: %v", event.Object)) + break + } + if err := r.reconcileNewPayment(payment); err != nil { + errs = append(errs, fmt.Errorf("reconcile payment failed: payment: %s, user: %s, err: %w", payment.Name, payment.Spec.UserID, err)) } } + return +} +func (r *PaymentReconciler) reconcilePayment(payment *accountv1.Payment) error { + if payment.Status.TradeNO == "" { + if err := r.reconcileNewPayment(payment); err != nil { + return fmt.Errorf("reconcile new payment failed: %w", err) + } + return nil + } + if payment.Status.Status == pay.PaymentSuccess { + if err := r.expiredOvertimePayment(payment); err != nil { + return fmt.Errorf("expired payment failed: %w", err) + } + return nil + } // get payment handler - payHandler, err := pay.NewPayHandler(p.Spec.PaymentMethod) + payHandler, err := pay.NewPayHandler(payment.Spec.PaymentMethod) if err != nil { - r.Logger.Error(err, "get payment Interface failed") - return ctrl.Result{}, err + return fmt.Errorf("get payment Interface failed: %w", err) } - // get tradeNO and codeURL - tradeNO, codeURL, err := payHandler.CreatePayment(p.Spec.Amount/10000, p.Spec.UserID, "sealos cloud pay [domain="+r.domain+"]") + // TODO The GetPaymentDetails may cause issues when using Stripe + status, orderAmount, err := payHandler.GetPaymentDetails(payment.Status.TradeNO) if err != nil { - r.Logger.Error(err, "get tradeNO and codeURL failed") - return ctrl.Result{Requeue: true, RequeueAfter: time.Second}, err + return fmt.Errorf("get payment details failed: %w", err) } - p.Status.CodeURL = codeURL - p.Status.TradeNO = tradeNO + switch status { + case pay.PaymentSuccess: + user, err := r.Account.AccountV2.GetUser(&pkgtypes.UserQueryOpts{ID: payment.Spec.UserID}) + if err != nil { + return fmt.Errorf("get user failed: %w", err) + } + //1¥ = 100WechatPayAmount; 1 WechatPayAmount = 10000 SealosAmount + payAmount := orderAmount * 10000 + gift := getAmountWithDiscount(payAmount, r.Account.DefaultDiscount) + if err = r.Account.AccountV2.Payment(&pkgtypes.Payment{ + PaymentRaw: pkgtypes.PaymentRaw{ + UserUID: user.UID, + Amount: payAmount, + Gift: gift, + CreatedAt: payment.CreationTimestamp.Time, + RegionUserOwner: getUsername(payment.Namespace), + Method: payment.Spec.PaymentMethod, + TradeNO: payment.Status.TradeNO, + CodeURL: payment.Status.CodeURL, + }, + }); err != nil { + return fmt.Errorf("payment failed: %w", err) + } + payment.Status.Status = pay.PaymentSuccess + if err := r.Status().Update(context.Background(), payment); err != nil { + return fmt.Errorf("update payment failed: %w", err) + } + //case pay.PaymentFailed, pay.PaymentExpired: + default: + if err := r.expiredOvertimePayment(payment); err != nil { + return fmt.Errorf("expired payment failed: %w", err) + } + } + return nil +} - if err := r.Status().Update(ctx, p); err != nil { - r.Logger.Error(err, "update payment failed: %v", "payment", *p) - return ctrl.Result{}, err +func (r *PaymentReconciler) expiredOvertimePayment(payment *accountv1.Payment) error { + if payment.CreationTimestamp.Time.Add(10 * time.Minute).After(time.Now()) { + return nil + } + payHandler, err := pay.NewPayHandler(payment.Spec.PaymentMethod) + if err != nil { + return fmt.Errorf("get payment Interface failed: %w", err) + } + currentStatus, _, err := payHandler.GetPaymentDetails(payment.Status.TradeNO) + if err != nil { + return fmt.Errorf("get payment details failed: %w", err) } - //qrterminal.Generate(codeURL, qrterminal.L, os.Stdout) - return ctrl.Result{}, nil + if payment.Status.Status != pay.PaymentSuccess { + // skip if payment is success paid + if currentStatus == pay.PaymentSuccess { + return nil + } + if err = payHandler.ExpireSession(payment.Status.TradeNO); err != nil { + r.Logger.Error(err, "cancel payment failed") + } + } + if err = r.Delete(context.Background(), payment); err != nil { + r.Logger.Error(err, "delete payment failed") + } + r.Logger.Info("payment expired", "payment", payment) + return nil } -// SetupWithManager sets up the controller with the Manager. -func (r *PaymentReconciler) SetupWithManager(mgr ctrl.Manager, rateOpts controller.Options) error { - const controllerName = "payment_controller" - r.Logger = ctrl.Log.WithName(controllerName) - r.Logger.V(1).Info("init reconcile controller payment") - r.domain = os.Getenv("DOMAIN") - return ctrl.NewControllerManagedBy(mgr). - For(&accountv1.Payment{}, builder.WithPredicates(OnlyCreatePredicate{})). - WithOptions(rateOpts). - Complete(r) +func (r *PaymentReconciler) reconcileNewPayment(payment *accountv1.Payment) error { + if payment.Status.TradeNO != "" { + return nil + } + // backward compatibility + if payment.Spec.UserCR == "" { + if payment.Spec.UserID == "" { + return fmt.Errorf("user ID is empty") + } + payment.Spec.UserCR = payment.Spec.UserID + user, err := r.Account.AccountV2.GetUser(&pkgtypes.UserQueryOpts{Owner: payment.Spec.UserCR}) + if err != nil { + return fmt.Errorf("get user failed: %w", err) + } + if user == nil { + return fmt.Errorf("user not found") + } + payment.Spec.UserID = user.ID + } + if err := r.Update(context.Background(), payment); err != nil { + return fmt.Errorf("create payment failed: %w", err) + } + // get user ID + account, err := r.Account.AccountV2.GetAccount(&pkgtypes.UserQueryOpts{ID: payment.Spec.UserID, IgnoreEmpty: true}) + if err != nil { + return fmt.Errorf("get account failed: %w", err) + } + if account == nil { + _, err := r.Account.AccountV2.NewAccount(&pkgtypes.UserQueryOpts{ID: payment.Spec.UserID}) + if err != nil { + return fmt.Errorf("create account failed: %w", err) + } + } + // get payment handler + payHandler, err := pay.NewPayHandler(payment.Spec.PaymentMethod) + if err != nil { + return fmt.Errorf("get payment Interface failed: %w", err) + } + tradeNO, codeURL, err := payHandler.CreatePayment(payment.Spec.Amount/10000, payment.Spec.UserID, "sealos cloud pay [domain="+r.domain+"]") + if err != nil { + return fmt.Errorf("get tradeNO and codeURL failed: %w", err) + } + payment.Status.CodeURL = codeURL + payment.Status.TradeNO = tradeNO + payment.Status.Status = pay.PaymentProcessing + if err = r.Status().Update(context.Background(), payment); err != nil { + return fmt.Errorf("update payment failed: %w", err) + } + return nil } diff --git a/controllers/account/controllers/suite_test.go b/controllers/account/controllers/suite_test.go index b5e6d665727..92735bbe166 100644 --- a/controllers/account/controllers/suite_test.go +++ b/controllers/account/controllers/suite_test.go @@ -30,7 +30,6 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" //+kubebuilder:scaffold:imports @@ -46,9 +45,7 @@ var testEnv *envtest.Environment func TestAPIs(t *testing.T) { RegisterFailHandler(Fail) - RunSpecsWithDefaultAndCustomReporters(t, - "Controller Suite", - []Reporter{printer.NewlineReporter{}}) + RunSpecsWithDefaultAndCustomReporters(t, "Controller Suite", []Reporter{}) } var _ = BeforeSuite(func() { diff --git a/controllers/account/deploy/Kubefile b/controllers/account/deploy/Kubefile index 85017d277f2..dac1e1b5124 100644 --- a/controllers/account/deploy/Kubefile +++ b/controllers/account/deploy/Kubefile @@ -10,6 +10,7 @@ ENV cloudDomain="cloud.sealos.io" ENV cloudPort="" ENV MONGO_URI "mongodb://mongo:27017/resources" ENV GLOBAL_COCKROACH_URI "" +ENV ACCOUNT_API_JWT_SECRET="secret" ENV LOCAL_COCKROACH_URI "" ENV LOCAL_REGION "" ENV OSNamespace="objectstorage-system" diff --git a/controllers/account/deploy/manifests/account-manager-config.yaml.tmpl b/controllers/account/deploy/manifests/account-manager-config.yaml.tmpl index f407d48bcc5..e13edd4739f 100644 --- a/controllers/account/deploy/manifests/account-manager-config.yaml.tmpl +++ b/controllers/account/deploy/manifests/account-manager-config.yaml.tmpl @@ -16,6 +16,7 @@ data: LOCAL_REGION: '{{ .LOCAL_REGION }}' DOMAIN: '{{ .cloudDomain }}' PORT: '{{ .cloudPort }}' + ACCOUNT_API_JWT_SECRET: '{{ .ACCOUNT_API_JWT_SECRET }}' BASE_BALANCE: '{{ .BASE_BALANCE | default "ri79LzQiQrs6CVa1ctE308+AseBXbOua0RIMCXAH5hc3irs=" }}' diff --git a/controllers/account/deploy/manifests/deploy.yaml.tmpl b/controllers/account/deploy/manifests/deploy.yaml similarity index 97% rename from controllers/account/deploy/manifests/deploy.yaml.tmpl rename to controllers/account/deploy/manifests/deploy.yaml index bbf424605b4..3ed178e2e76 100644 --- a/controllers/account/deploy/manifests/deploy.yaml.tmpl +++ b/controllers/account/deploy/manifests/deploy.yaml @@ -1,3 +1,17 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + apiVersion: v1 kind: Namespace metadata: @@ -362,6 +376,8 @@ spec: properties: userName: type: string + userID: + type: string type: object status: description: DebtStatus defines the observed state of Debt @@ -521,6 +537,9 @@ spec: userID: description: UserID is the user id who want to recharge type: string + userCR: + description: UserCr is the user cr name who want to recharge + type: string type: object status: description: PaymentStatus defines the observed state of Payment diff --git a/controllers/account/go.mod b/controllers/account/go.mod index 1d31a53ae64..ea8c2580a8e 100644 --- a/controllers/account/go.mod +++ b/controllers/account/go.mod @@ -1,41 +1,43 @@ module github.com/labring/sealos/controllers/account -go 1.20 +go 1.22 + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) require ( github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5 github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 github.com/alibabacloud-go/tea v1.2.1 github.com/alibabacloud-go/tea-utils/v2 v2.0.4 + github.com/apecloud/kubeblocks v0.8.4 github.com/astaxie/beego v1.12.3 github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df - github.com/go-logr/logr v1.2.4 + github.com/go-logr/logr v1.4.1 github.com/google/uuid v1.6.0 - github.com/labring/sealos/controllers/pkg v0.0.0-00010101000000-000000000000 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b github.com/labring/sealos/controllers/user v0.0.0 github.com/matoous/go-nanoid/v2 v2.0.0 github.com/minio/madmin-go/v3 v3.0.35 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.27.8 + github.com/onsi/ginkgo v1.16.4 + github.com/onsi/gomega v1.30.0 github.com/volcengine/volc-sdk-golang v1.0.159 go.mongodb.org/mongo-driver v1.12.1 golang.org/x/sync v0.6.0 gorm.io/gorm v1.25.5 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.2 - sigs.k8s.io/controller-runtime v0.15.2 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v12.0.0+incompatible + sigs.k8s.io/controller-runtime v0.17.2 ) require ( - cloud.google.com/go/compute v1.19.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect @@ -47,30 +49,31 @@ require ( github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/clbanning/mxj/v2 v2.5.7 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.4 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -78,22 +81,25 @@ require ( github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/minio-go/v7 v7.0.64 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.6.6 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/prom2json v1.3.3 // indirect github.com/rs/xid v1.5.0 // indirect github.com/safchain/ethtool v0.3.0 // indirect @@ -101,8 +107,13 @@ require ( github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect github.com/shirou/gopsutil/v3 v3.23.6 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/stripe/stripe-go/v74 v74.30.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/tinylib/msgp v1.1.8 // indirect github.com/tjfoc/gmsm v1.3.2 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect @@ -116,16 +127,17 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/net v0.22.0 // indirect - golang.org/x/oauth2 v0.9.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc v1.57.0 // indirect + golang.org/x/time v0.5.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect @@ -136,26 +148,17 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/postgres v1.5.4 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace ( github.com/labring/sealos/controllers/pkg => ../pkg github.com/labring/sealos/controllers/user => ../../controllers/user ) - -replace ( - k8s.io/api => k8s.io/api v0.25.6 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.6 - k8s.io/apimachinery => k8s.io/apimachinery v0.25.6 - k8s.io/client-go => k8s.io/client-go v0.25.6 - k8s.io/component-base => k8s.io/component-base v0.25.6 - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.13.0 -) diff --git a/controllers/account/go.sum b/controllers/account/go.sum index b553534ea27..26725de25ff 100644 --- a/controllers/account/go.sum +++ b/controllers/account/go.sum @@ -3,6 +3,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -13,16 +14,15 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -34,23 +34,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -110,6 +95,8 @@ github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6q github.com/aliyun/credentials-go v1.3.1 h1:uq/0v7kWrxmoLGpqjx7vtQ/s03f0zR//0br/xWDTE28= github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apecloud/kubeblocks v0.8.4 h1:8esK2e9iiziPXTlGXmX2uFTU/YGFXFvyvqnCBODqWM4= +github.com/apecloud/kubeblocks v0.8.4/go.mod h1:xQpzfMy4V+WJI5IKBWB02qsKAlVR3nAE71CPkAs2uOs= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= @@ -131,7 +118,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -155,6 +141,7 @@ github.com/clbanning/mxj/v2 v2.5.7/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -166,11 +153,11 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 h1:4GI5eviCwbPxDE311KryyyPUTO7IDVyHGp3Iyl+fEZY= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49/go.mod h1:sbm1DAsayX+XsXCOC2CFAAU9JZhX0SPKwnybDjSd0Ls= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= @@ -182,32 +169,35 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -224,31 +214,32 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -281,8 +272,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -292,8 +283,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -316,6 +307,7 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -323,6 +315,9 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -331,6 +326,7 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -363,6 +359,8 @@ github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= @@ -370,6 +368,7 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -377,15 +376,16 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -418,6 +418,7 @@ github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/q github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -434,6 +435,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE= github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= @@ -465,12 +468,15 @@ github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEp github.com/minio/minio-go/v7 v7.0.64 h1:Zdza8HwOzkld0ZG/og50w56fKi6AAyfqfifmasD9n2Q= github.com/minio/minio-go/v7 v7.0.64/go.mod h1:R4WVUR6ZTedlCcGwZRauLMIKjgyaWxhs4Mqi/OMPmEc= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -501,15 +507,16 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= @@ -517,6 +524,8 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= @@ -529,8 +538,10 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= @@ -542,29 +553,29 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo= github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -574,7 +585,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -584,6 +596,8 @@ github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6o github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-io/sio-go v0.3.1 h1:dNvY9awjabXTYGsTF1PiCySl9Ltofk9GA3VdWlo7rRc= github.com/secure-io/sio-go v0.3.1/go.mod h1:+xbkjDzPjwh4Axd07pRKSNriS9SCiYksWnZqdnfpQxs= +github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI= +github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE= github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= github.com/shirou/gopsutil/v3 v3.23.6 h1:5y46WPI9QBKBbK7EEccUPNXpJpNrvPuTD0O2zHEHT08= @@ -605,10 +619,17 @@ github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -627,11 +648,14 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= @@ -658,9 +682,6 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -684,20 +705,20 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -714,6 +735,7 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -738,6 +760,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -752,6 +775,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -761,6 +785,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -800,14 +826,16 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -818,16 +846,21 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= -golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -891,15 +924,21 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -907,7 +946,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -934,6 +972,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -950,8 +989,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -998,22 +1037,30 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -1034,14 +1081,18 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1072,11 +1123,17 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1089,13 +1146,16 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1147,7 +1207,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1162,32 +1221,34 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.25.6 h1:MwdaCpHtGVSM5SiA6Hm4g2w5voMNiPCwBjOqz9YTlrg= -k8s.io/apiextensions-apiserver v0.25.6/go.mod h1:aXw8Xmhf6/gfGx3y0xkj8o8evTZbfOFqZeWIigg4XsE= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/component-base v0.25.6 h1:v3ci6FbXFcxpjyQJaaLq0MgzT3vyFzwUDWtO+KRv9Bk= -k8s.io/component-base v0.25.6/go.mod h1:k7DfcfJ8cOI6A2xTCfU5LxsnXV+lWw1ME8cRCHzIh6o= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= +k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI= +k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/account/main.go b/controllers/account/main.go index b69218aa2cc..291aa96c392 100644 --- a/controllers/account/main.go +++ b/controllers/account/main.go @@ -22,36 +22,29 @@ import ( "os" "time" - "github.com/labring/sealos/controllers/pkg/utils/env" - - "github.com/labring/sealos/controllers/pkg/types" - - "github.com/labring/sealos/controllers/pkg/database/cockroach" - - "sigs.k8s.io/controller-runtime/pkg/webhook" - - "sigs.k8s.io/controller-runtime/pkg/client" - "github.com/labring/sealos/controllers/account/controllers/cache" - - "github.com/labring/sealos/controllers/pkg/database/mongo" - - "github.com/labring/sealos/controllers/pkg/resources" - "github.com/labring/sealos/controllers/pkg/database" - + "github.com/labring/sealos/controllers/pkg/database/cockroach" + "github.com/labring/sealos/controllers/pkg/database/mongo" notificationv1 "github.com/labring/sealos/controllers/pkg/notification/api/v1" + "github.com/labring/sealos/controllers/pkg/resources" + "github.com/labring/sealos/controllers/pkg/types" + "github.com/labring/sealos/controllers/pkg/utils/env" rate "github.com/labring/sealos/controllers/pkg/utils/rate" userv1 "github.com/labring/sealos/controllers/user/api/v1" + kbv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + "sigs.k8s.io/controller-runtime/pkg/webhook" accountv1 "github.com/labring/sealos/controllers/account/api/v1" "github.com/labring/sealos/controllers/account/controllers" @@ -69,7 +62,7 @@ func init() { utilruntime.Must(accountv1.AddToScheme(scheme)) utilruntime.Must(userv1.AddToScheme(scheme)) utilruntime.Must(notificationv1.AddToScheme(scheme)) - //utilruntime.Must(kbv1alpha1.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(kbv1alpha1.SchemeBuilder.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme } @@ -88,7 +81,7 @@ func main() { flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.BoolVar(&development, "development", false, "Enable development mode.") - flag.BoolVar(&enableLeaderElection, "leader-elect", false, + flag.BoolVar(&enableLeaderElection, "leader-elect", true, "Enable leader election for controller manager. "+ "Enabling this will ensure there is only one active controller manager.") flag.IntVar(&concurrent, "concurrent", 5, "The number of concurrent cluster reconciles.") @@ -110,9 +103,10 @@ func main() { //} mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "a63686c3.sealos.io", @@ -213,12 +207,6 @@ func main() { if err = (accountReconciler).SetupWithManager(mgr, rateOpts); err != nil { setupManagerError(err, "Account") } - if err = (&controllers.PaymentReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr, rateOpts); err != nil { - setupManagerError(err, "Payment") - } if err = (&controllers.DebtReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), @@ -281,6 +269,16 @@ func main() { if err = (billingInfoQueryReconciler).SetupWithManager(mgr); err != nil { setupManagerError(err, "BillingInfoQuery") } + + if err = (&controllers.PaymentReconciler{ + Account: accountReconciler, + WatchClient: watchClient, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupManagerError(err, "Payment") + } + //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { diff --git a/controllers/app/cmd/main.go b/controllers/app/cmd/main.go index 0aa6096fc89..fa7fb7dcddd 100644 --- a/controllers/app/cmd/main.go +++ b/controllers/app/cmd/main.go @@ -20,8 +20,6 @@ import ( "flag" "os" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/apimachinery/pkg/runtime" @@ -30,6 +28,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" appv1 "github.com/labring/sealos/controllers/app/api/v1" //+kubebuilder:scaffold:imports @@ -70,9 +69,10 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "f3e714c5.sealos.io", diff --git a/controllers/app/go.mod b/controllers/app/go.mod index ed40b7d1b1e..8f0a408564c 100644 --- a/controllers/app/go.mod +++ b/controllers/app/go.mod @@ -1,79 +1,79 @@ module github.com/labring/sealos/controllers/app -go 1.20 +go 1.21 + +toolchain go1.22.4 + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) require ( - k8s.io/apimachinery v0.25.0 - k8s.io/client-go v0.25.0 - sigs.k8s.io/controller-runtime v0.13.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.0.0-00010101000000-000000000000 ) require ( - cloud.google.com/go v0.97.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.8.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.25.0 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/api v0.29.0 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/controllers/app/go.sum b/controllers/app/go.sum index 7441f108840..9e3d9a8235f 100644 --- a/controllers/app/go.sum +++ b/controllers/app/go.sum @@ -1,794 +1,200 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= -github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0= -k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU= -k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0= -k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= -k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/db/adminer/controllers/adminer_controller.go b/controllers/db/adminer/controllers/adminer_controller.go index 74c7e94f567..cff6af96d66 100644 --- a/controllers/db/adminer/controllers/adminer_controller.go +++ b/controllers/db/adminer/controllers/adminer_controller.go @@ -27,13 +27,11 @@ import ( networkingv1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" @@ -528,24 +526,6 @@ func getSecretNamespace() string { return secretNamespace } -func NewCache() cache.NewCacheFunc { - cacheLabelSelector := cache.ObjectSelector{ - Label: labels.SelectorFromSet(labels.Set{ - label.AppManagedBy: label.DefaultManagedBy, - label.AppPartOf: AdminerPartOf, - }), - } - - return cache.BuilderWithOptions(cache.Options{ - SelectorsByObject: cache.SelectorsByObject{ - &appsv1.Deployment{}: cacheLabelSelector, - &corev1.Service{}: cacheLabelSelector, - &corev1.Secret{}: cacheLabelSelector, - &networkingv1.Ingress{}: cacheLabelSelector, - }, - }) -} - // SetupWithManager sets up the controller with the Manager. func (r *AdminerReconciler) SetupWithManager(mgr ctrl.Manager) error { r.recorder = mgr.GetEventRecorderFor("sealos-db-adminer-controller") diff --git a/controllers/db/adminer/controllers/suite_test.go b/controllers/db/adminer/controllers/suite_test.go index 4702dc6dece..c47124585f5 100644 --- a/controllers/db/adminer/controllers/suite_test.go +++ b/controllers/db/adminer/controllers/suite_test.go @@ -26,7 +26,6 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" @@ -44,9 +43,7 @@ var testEnv *envtest.Environment func TestAPIs(t *testing.T) { RegisterFailHandler(Fail) - RunSpecsWithDefaultAndCustomReporters(t, - "Controller Suite", - []Reporter{printer.NewlineReporter{}}) + RunSpecsWithDefaultAndCustomReporters(t, "Controller Suite", []Reporter{}) } var _ = BeforeSuite(func() { diff --git a/controllers/db/adminer/go.mod b/controllers/db/adminer/go.mod index 50b660d30b6..5a5776c2b91 100644 --- a/controllers/db/adminer/go.mod +++ b/controllers/db/adminer/go.mod @@ -1,75 +1,78 @@ module github.com/labring/sealos/controllers/db/adminer -go 1.20 +go 1.22 + +toolchain go1.22.4 require ( github.com/jaevor/go-nanoid v1.3.0 github.com/labring/sealos/controllers/pkg v0.0.0-00010101000000-000000000000 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.27.6 - k8s.io/api v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/onsi/gomega v1.30.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.17.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/labring/sealos/controllers/pkg => ../../pkg diff --git a/controllers/db/adminer/go.sum b/controllers/db/adminer/go.sum index 2a4704ecade..685aa7856f2 100644 --- a/controllers/db/adminer/go.sum +++ b/controllers/db/adminer/go.sum @@ -1,123 +1,88 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jaevor/go-nanoid v1.3.0 h1:nD+iepesZS6pr3uOVf20vR9GdGgJW1HPaR46gtrxzkg= github.com/jaevor/go-nanoid v1.3.0/go.mod h1:SI+jFaPuddYkqkVQoNGHs81navCtH388TcrH0RqFKgY= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -132,96 +97,68 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -230,76 +167,44 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -308,40 +213,35 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= -k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo= -k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= +k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= +k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= +k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc= +k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o= +k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= +k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= +k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/db/adminer/main.go b/controllers/db/adminer/main.go index 42e64887686..d68deddd257 100644 --- a/controllers/db/adminer/main.go +++ b/controllers/db/adminer/main.go @@ -20,19 +20,26 @@ import ( "flag" "os" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" adminerv1 "github.com/labring/sealos/controllers/db/adminer/api/v1" "github.com/labring/sealos/controllers/db/adminer/controllers" + "github.com/labring/sealos/controllers/pkg/utils/label" //+kubebuilder:scaffold:imports ) @@ -64,10 +71,16 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + cacheObjLabelSelector := labels.SelectorFromSet(labels.Set{ + label.AppManagedBy: label.DefaultManagedBy, + label.AppPartOf: controllers.AdminerPartOf, + }) + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "50686b4e.sealos.io", @@ -84,7 +97,15 @@ func main() { // LeaderElectionReleaseOnCancel: true, // add custom cache for memory footprint optimization - NewCache: controllers.NewCache(), + NewCache: func(config *rest.Config, opts cache.Options) (cache.Cache, error) { + opts.ByObject = map[client.Object]cache.ByObject{ + &appsv1.Deployment{}: {Label: cacheObjLabelSelector}, + &corev1.Service{}: {Label: cacheObjLabelSelector}, + &corev1.Secret{}: {Label: cacheObjLabelSelector}, + &networkingv1.Ingress{}: {Label: cacheObjLabelSelector}, + } + return cache.New(config, opts) + }, }) if err != nil { setupLog.Error(err, "unable to start manager") diff --git a/controllers/devbox/.dockerignore b/controllers/devbox/.dockerignore new file mode 100644 index 00000000000..c95e1150140 --- /dev/null +++ b/controllers/devbox/.dockerignore @@ -0,0 +1,3 @@ +# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file +# Ignore build and test binaries. +#bin/ diff --git a/controllers/devbox/.gitignore b/controllers/devbox/.gitignore new file mode 100644 index 00000000000..ada68ff086c --- /dev/null +++ b/controllers/devbox/.gitignore @@ -0,0 +1,27 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +bin/* +Dockerfile.cross + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Go workspace file +go.work + +# Kubernetes Generated files - skip generated files, except for vendored files +!vendor/**/zz_generated.* + +# editor and IDE paraphernalia +.idea +.vscode +*.swp +*.swo +*~ diff --git a/controllers/devbox/Dockerfile b/controllers/devbox/Dockerfile new file mode 100644 index 00000000000..550f17400f2 --- /dev/null +++ b/controllers/devbox/Dockerfile @@ -0,0 +1,22 @@ +# Copyright © 2023 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM gcr.io/distroless/static:nonroot +ARG TARGETARCH + +WORKDIR / +USER 65532:65532 + +COPY bin/controller-devbox-$TARGETARCH /manager +ENTRYPOINT ["/manager"] diff --git a/controllers/devbox/Makefile b/controllers/devbox/Makefile new file mode 100644 index 00000000000..1406744c42e --- /dev/null +++ b/controllers/devbox/Makefile @@ -0,0 +1,146 @@ + +# Image URL to use all building/pushing image targets +IMG ?= ghcr.io/labring/sealos-devbox-controller:latest +TARGETARCH ?= amd64 + +# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. +ENVTEST_K8S_VERSION = 1.24.1 + +# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) +ifeq (,$(shell go env GOBIN)) +GOBIN=$(shell go env GOPATH)/bin +else +GOBIN=$(shell go env GOBIN) +endif + +# Setting SHELL to bash allows bash commands to be executed by recipes. +# This is a requirement for 'setup-envtest.sh' in the test target. +# Options are set to exit when a recipe line exits non-zero or a piped command fails. +SHELL = /usr/bin/env bash -o pipefail +.SHELLFLAGS = -ec + +.PHONY: all +all: build + +##@ General + +# The help target prints out all targets with their descriptions organized +# beneath their categories. The categories are represented by '##@' and the +# target descriptions by '##'. The awk commands is responsible for reading the +# entire set of makefiles included in this invocation, looking for lines of the +# file as xyz: ## something, and then pretty-format the target and help. Then, +# if there's a line with ##@ something, that gets pretty-printed as a category. +# More info on the usage of ANSI control characters for devbox formatting: +# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters +# More info on the awk command: +# http://linuxcommand.org/lc3_adv_awk.php + +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +##@ Development + +.PHONY: manifests +manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. + $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases + +.PHONY: generate +generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. + $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." + +.PHONY: fmt +fmt: ## Run go fmt against code. + go fmt ./... + +.PHONY: vet +vet: ## Run go vet against code. + go vet ./... + +.PHONY: test +test: manifests generate fmt vet envtest ## Run tests. + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out + +##@ Build + +.PHONY: build +build: ## Build manager binary. + CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -ldflags "-s -w" -trimpath -o bin/manager cmd/main.go + +.PHONY: run +run: manifests generate fmt vet ## Run a controller from your host. + go run ./cmd/main.go + +.PHONY: debug +debug: + go run ./cmd/main.go --debug + +.PHONY: docker-build +docker-build: ## Build docker image with the manager. + mv bin/manager bin/controller-devbox-${TARGETARCH} + chmod +x bin/controller-devbox-${TARGETARCH} + docker build -t ${IMG} . --build-arg TARGETARCH=${TARGETARCH} + +.PHONY: docker-push +docker-push: ## Push docker image with the manager. + docker push ${IMG} + +##@ Deployment + +ifndef ignore-not-found + ignore-not-found = false +endif + +.PHONY: install +install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/crd | kubectl apply -f - + +.PHONY: uninstall +uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/crd | kubectl delete --ignore-not-found=$(ignore-not-found) -f - + +.PHONY: pre-deploy +pre-deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + $(KUSTOMIZE) build config/default > deploy/manifests/deploy.yaml + +.PHONY: deploy +deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + $(KUSTOMIZE) build config/default | kubectl apply -f - + +.PHONY: undeploy +undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - + +##@ Build Dependencies + +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p $(LOCALBIN) + +## Tool Binaries +KUSTOMIZE ?= $(LOCALBIN)/kustomize +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +ENVTEST ?= $(LOCALBIN)/setup-envtest + +## Tool Versions +KUSTOMIZE_VERSION ?= v5.3.0 +CONTROLLER_TOOLS_VERSION ?= v0.14.0 + +KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" +.PHONY: kustomize +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. +$(KUSTOMIZE): $(LOCALBIN) + curl -s $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN) + +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. +$(CONTROLLER_GEN): $(LOCALBIN) + GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) + +.PHONY: envtest +envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. +$(ENVTEST): $(LOCALBIN) + GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest diff --git a/controllers/devbox/PROJECT b/controllers/devbox/PROJECT new file mode 100644 index 00000000000..b93fe52f916 --- /dev/null +++ b/controllers/devbox/PROJECT @@ -0,0 +1,54 @@ +# Code generated by tool. DO NOT EDIT. +# This file is used to track the info used to scaffold your project +# and allow the plugins properly work. +# More info: https://book.kubebuilder.io/reference/project-config.html +domain: sealos.io +layout: +- go.kubebuilder.io/v4 +projectName: devbox +repo: github.com/labring/sealos/controllers/devbox +resources: +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: sealos.io + group: devbox + kind: Devbox + path: github.com/labring/sealos/controllers/devbox/api/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + domain: sealos.io + group: devbox + kind: Runtime + path: github.com/labring/sealos/controllers/devbox/api/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + domain: sealos.io + group: devbox + kind: RuntimeClass + path: github.com/labring/sealos/controllers/devbox/api/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: sealos.io + group: devbox + kind: DevBoxRelease + path: github.com/labring/sealos/controllers/devbox/api/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: sealos.io + group: devbox + kind: OperationRequest + path: github.com/labring/sealos/controllers/devbox/api/v1alpha1 + version: v1alpha1 +version: "3" diff --git a/controllers/devbox/README.md b/controllers/devbox/README.md new file mode 100644 index 00000000000..971bb39e44a --- /dev/null +++ b/controllers/devbox/README.md @@ -0,0 +1,115 @@ +# devbox +// TODO(user): Add simple overview of use/purpose + +## Description +// TODO(user): An in-depth paragraph about your project and overview of use + +## Getting Started + +### Prerequisites +- go version v1.22.0+ +- docker version 17.03+. +- kubectl version v1.11.3+. +- Access to a Kubernetes v1.11.3+ cluster. + +### To Deploy on the cluster +**Build and push your image to the location specified by `IMG`:** + +```sh +make docker-build docker-push IMG=/devbox:tag +``` + +**NOTE:** This image ought to be published in the personal registry you specified. +And it is required to have access to pull the image from the working environment. +Make sure you have the proper permission to the registry if the above commands don’t work. + +**Install the CRDs into the cluster:** + +```sh +make install +``` + +**Deploy the Manager to the cluster with the image specified by `IMG`:** + +```sh +make deploy IMG=/devbox:tag +``` + +> **NOTE**: If you encounter RBAC errors, you may need to grant yourself cluster-admin +privileges or be logged in as admin. + +**Create instances of your solution** +You can apply the samples (examples) from the config/sample: + +```sh +kubectl apply -k config/samples/ +``` + +>**NOTE**: Ensure that the samples has default values to test it out. + +### To Uninstall +**Delete the instances (CRs) from the cluster:** + +```sh +kubectl delete -k config/samples/ +``` + +**Delete the APIs(CRDs) from the cluster:** + +```sh +make uninstall +``` + +**UnDeploy the controller from the cluster:** + +```sh +make undeploy +``` + +## Project Distribution + +Following are the steps to build the installer and distribute this project to users. + +1. Build the installer for the image built and published in the registry: + +```sh +make build-installer IMG=/devbox:tag +``` + +NOTE: The makefile target mentioned above generates an 'install.yaml' +file in the dist directory. This file contains all the resources built +with Kustomize, which are necessary to install this project without +its dependencies. + +2. Using the installer + +Users can just run kubectl apply -f to install the project, i.e.: + +```sh +kubectl apply -f https://raw.githubusercontent.com//devbox//dist/install.yaml +``` + +## Contributing +// TODO(user): Add detailed information on how you would like others to contribute to this project + +**NOTE:** Run `make help` for more information on all potential `make` targets + +More information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html) + +## License + +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +# devbox-controller diff --git a/controllers/devbox/api/v1alpha1/devbox_types.go b/controllers/devbox/api/v1alpha1/devbox_types.go new file mode 100644 index 00000000000..facdbe59f9b --- /dev/null +++ b/controllers/devbox/api/v1alpha1/devbox_types.go @@ -0,0 +1,218 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ResourceName string + +const ( + // ResourceCPU CPU, in cores. (500m = .5 cores) + ResourceCPU ResourceName = "cpu" + // ResourceMemory Memory, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024) + ResourceMemory ResourceName = "memory" + // FinalizerName is the finalizer for Devbox + FinalizerName = "devbox.sealos.io/finalizer" + DevBoxPartOf = "devbox" +) + +type DevboxState string + +const ( + // DevboxStateRunning means the Devbox is running + DevboxStateRunning DevboxState = "Running" + // DevboxStatePending means the Devbox is pending + DevboxStatePending DevboxState = "Pending" + // DevboxStateStopped means the Devbox is stopped + DevboxStateStopped DevboxState = "Stopped" +) + +type NetworkType string + +const ( + NetworkTypeNodePort NetworkType = "NodePort" + NetworkTypeTailnet NetworkType = "Tailnet" +) + +type ResourceList map[ResourceName]resource.Quantity + +type RuntimeRef struct { + // +kubebuilder:validation:Required + Name string `json:"name"` + // +kubebuilder:validation:Optional + Namespace string `json:"namespace,omitempty"` +} + +type NetworkSpec struct { + // +kubebuilder:validation:Required + // +kubebuilder:validation:Enum=NodePort;Tailnet + Type NetworkType `json:"type"` + // +kubebuilder:validation:Optional + ExtraPorts []corev1.ContainerPort `json:"extraPorts"` +} + +// DevboxSpec defines the desired state of Devbox +type DevboxSpec struct { + // +kubebuilder:validation:Required + // +kubebuilder:validation:Enum=Running;Stopped + State DevboxState `json:"state"` + // +kubebuilder:validation:Required + Resource ResourceList `json:"resource"` + + // +kubebuilder:validation:Optional + // +kubebuilder:default=false + Squash bool `json:"squash"` + + // +kubebuilder:validation:Required + RuntimeRef RuntimeRef `json:"runtimeRef"` + + // +kubebuilder:validation:Required + NetworkSpec NetworkSpec `json:"network,omitempty"` + + // todo add rewrite labels and annotations... + // +kubebuilder:validation:Optional + ExtraLabels map[string]string `json:"extraLabels,omitempty"` + // +kubebuilder:validation:Optional + ExtraAnnotations map[string]string `json:"extraAnnotations,omitempty"` + + // +kubebuilder:validation:Optional + Command []string `json:"command,omitempty"` + // +kubebuilder:validation:Optional + Args []string `json:"args,omitempty"` + // +kubebuilder:validation:Optional + WorkingDir string `json:"workingDir,omitempty"` + // todo add rewrite env... + // +kubebuilder:validation:Optional + ExtraEnvs []corev1.EnvVar `json:"extraEnvs"` + + // todo add rewrite volumes and volume mounts.. + // +kubebuilder:validation:Optional + ExtraVolumes []corev1.Volume `json:"extraVolumes,omitempty"` + // +kubebuilder:validation:Optional + ExtraVolumeMounts []corev1.VolumeMount `json:"extraVolumeMounts,omitempty"` + + // +kubebuilder:validation:Optional + Tolerations []corev1.Toleration `json:"tolerations,omitempty"` + // +kubebuilder:validation:Optional + Affinity *corev1.Affinity `json:"affinity,omitempty"` +} + +type NetworkStatus struct { + // +kubebuilder:default=NodePort + // +kubebuilder:validation:Enum=NodePort;Tailnet + Type NetworkType `json:"type"` + + // +kubebuilder:validation:Optional + NodePort int32 `json:"nodePort"` + + // todo TailNet + // +kubebuilder:validation:Optional + TailNet string `json:"tailnet"` +} + +type CommitStatus string + +const ( + CommitStatusSuccess CommitStatus = "Success" + CommitStatusFailed CommitStatus = "Failed" + CommitStatusUnknown CommitStatus = "Unknown" + CommitStatusPending CommitStatus = "Pending" +) + +type CommitHistory struct { + // Image is the image of the commit + Image string `json:"image"` + // Time is the time when the commit is created + Time metav1.Time `json:"time"` + // Pod is the pod name + Pod string `json:"pod"` + // status will be set based on expectedStatus after devbox pod delete or stop. if expectedStatus is still pending, it means the pod is not running successfully, so we need to set it to `failed` + Status CommitStatus `json:"status"` + // predicatedStatus default `pending`, will be set to `success` if pod status is running successfully. + PredicatedStatus CommitStatus `json:"predicatedStatus"` + // Node is the node name + Node string `json:"node"` + // ContainerID is the container id + ContainerID string `json:"containerID"` +} + +type DevboxPhase string + +const ( + // DevboxPhaseRunning means Devbox is run and run success + DevboxPhaseRunning DevboxPhase = "Running" + // DevboxPhasePending means Devbox is run but not run success + DevboxPhasePending DevboxPhase = "Pending" + //DevboxPhaseStopped means Devbox is stop and stopped success + DevboxPhaseStopped DevboxPhase = "Stopped" + //DevboxPhaseStopping means Devbox is stop and not stopped success + DevboxPhaseStopping DevboxPhase = "Stopping" + //DevboxPhaseError means Devbox is error + DevboxPhaseError DevboxPhase = "Error" +) + +// DevboxStatus defines the observed state of Devbox +type DevboxStatus struct { + // +kubebuilder:validation:Optional + DevboxPodPhase corev1.PodPhase `json:"podPhase"` + // +kubebuilder:validation:Optional + Network NetworkStatus `json:"network"` + // +kubebuilder:validation:Optional + CommitHistory []*CommitHistory `json:"commitHistory"` + // +kubebuilder:validation:Optional + Phase DevboxPhase `json:"phase"` + + // +kubebuilder:validation:Optional + State corev1.ContainerState `json:"state"` + // +kubebuilder:validation:Optional + LastTerminationState corev1.ContainerState `json:"lastState"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="State",type="string",JSONPath=".spec.state" +// +kubebuilder:printcolumn:name="RuntimeRef",type="string",JSONPath=".spec.runtimeRef.name" +// +kubebuilder:printcolumn:name="PodPhase",type="string",JSONPath=".status.podPhase" +// +kubebuilder:printcolumn:name="NetworkType",type="string",JSONPath=".status.network.type" +// +kubebuilder:printcolumn:name="NodePort",type="integer",JSONPath=".status.network.nodePort" +// +kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase" + +// Devbox is the Schema for the devboxes API +type Devbox struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec DevboxSpec `json:"spec,omitempty"` + Status DevboxStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// DevboxList contains a list of Devbox +type DevboxList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Devbox `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Devbox{}, &DevboxList{}) +} diff --git a/controllers/devbox/api/v1alpha1/devboxrelease_types.go b/controllers/devbox/api/v1alpha1/devboxrelease_types.go new file mode 100644 index 00000000000..7ac9e126773 --- /dev/null +++ b/controllers/devbox/api/v1alpha1/devboxrelease_types.go @@ -0,0 +1,80 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DevBoxReleaseSpec defines the desired state of DevBoxRelease +type DevBoxReleaseSpec struct { + // +kubebuilder:validation:Required + DevboxName string `json:"devboxName"` + // +kubebuilder:validation:Required + NewTag string `json:"newTag"` + // +kubebuilder:validation:Optional + Notes string `json:"notes,omitempty"` +} + +type DevboxReleasePhase string + +const ( + // DevboxReleasePhaseSuccess means the Devbox has been tagged + DevboxReleasePhaseSuccess DevboxReleasePhase = "Success" + // DevboxReleasePhasePending means the Devbox has not been tagged + DevboxReleasePhasePending DevboxReleasePhase = "Pending" + // DevboxReleasePhaseFailed means the Devbox has not been tagged + DevboxReleasePhaseFailed DevboxReleasePhase = "Failed" +) + +// DevBoxReleaseStatus defines the observed state of DevBoxRelease +type DevBoxReleaseStatus struct { + // +kubebuilder:validation:Optional + // +kubebuilder:default=Pending + Phase DevboxReleasePhase `json:"phase"` + // +kubebuilder:validation:Optional + OriginalImage string `json:"originalImage"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="DevboxName",type="string",JSONPath=".spec.devboxName" +// +kubebuilder:printcolumn:name="NewTag",type="string",JSONPath=".spec.newTag" +// +kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase" +// +kubebuilder:printcolumn:name="OriginalImage",type="string",JSONPath=".status.originalImage" + +// DevBoxRelease is the Schema for the devboxreleases API +type DevBoxRelease struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec DevBoxReleaseSpec `json:"spec,omitempty"` + Status DevBoxReleaseStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// DevBoxReleaseList contains a list of DevBoxRelease +type DevBoxReleaseList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []DevBoxRelease `json:"items"` +} + +func init() { + SchemeBuilder.Register(&DevBoxRelease{}, &DevBoxReleaseList{}) +} diff --git a/controllers/devbox/api/v1alpha1/groupversion_info.go b/controllers/devbox/api/v1alpha1/groupversion_info.go new file mode 100644 index 00000000000..ada13a8d577 --- /dev/null +++ b/controllers/devbox/api/v1alpha1/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1alpha1 contains API Schema definitions for the devbox v1alpha1 API group +// +kubebuilder:object:generate=true +// +groupName=devbox.sealos.io +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "devbox.sealos.io", Version: "v1alpha1"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/controllers/devbox/api/v1alpha1/operationrequest_types.go b/controllers/devbox/api/v1alpha1/operationrequest_types.go new file mode 100644 index 00000000000..92b236e54ad --- /dev/null +++ b/controllers/devbox/api/v1alpha1/operationrequest_types.go @@ -0,0 +1,61 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// OperationRequestSpec defines the desired state of OperationRequest +type OperationRequestSpec struct { +} + +// OperationRequestStatus defines the observed state of OperationRequest +type OperationRequestStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file + //+kubebuilder:default:=Pending + //+kubebuilder:validation:Enum=Pending;Processing;Completed;Failed +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// OperationRequest is the Schema for the operationrequests API +type OperationRequest struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec OperationRequestSpec `json:"spec,omitempty"` + Status OperationRequestStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// OperationRequestList contains a list of OperationRequest +type OperationRequestList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []OperationRequest `json:"items"` +} + +func init() { + SchemeBuilder.Register(&OperationRequest{}, &OperationRequestList{}) +} diff --git a/controllers/devbox/api/v1alpha1/runtime_types.go b/controllers/devbox/api/v1alpha1/runtime_types.go new file mode 100644 index 00000000000..436e94bb269 --- /dev/null +++ b/controllers/devbox/api/v1alpha1/runtime_types.go @@ -0,0 +1,118 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Config struct { + // +kubebuilder:validation:Optional + // +kubebuilder:default=sealos + User string `json:"user"` + + // +kubebuilder:validation:Required + Image string `json:"image"` + + // +kubebuilder:validation:Optional + Labels map[string]string `json:"labels,omitempty"` + // +kubebuilder:validation:Optional + Annotations map[string]string `json:"annotations,omitempty"` + + // +kubebuilder:validation:Optional + Command []string `json:"command,omitempty"` + // kubebuilder:validation:Optional + Args []string `json:"args,omitempty"` + // +kubebuilder:validation:Optional + // +kubebuilder:default=/home/sealos/project + WorkingDir string `json:"workingDir,omitempty"` + // +kubebuilder:validation:Optional + Env []corev1.EnvVar `json:"env,omitempty"` + + // +kubebuilder:validation:Optional + // +kubebuilder:default={/bin/bash,-c} + ReleaseCommand []string `json:"releaseCommand,omitempty"` + // +kubebuilder:validation:Optional + // +kubebuilder:default={/home/sealos/project/entrypoint.sh} + ReleaseArgs []string `json:"releaseArgs,omitempty"` + + // +kubebuilder:validation:Optional + // +kubebuilder:default={{name:"devbox-ssh-port",containerPort:22,protocol:TCP}} + Ports []corev1.ContainerPort `json:"ports,omitempty"` + + // +kubebuilder:validation:Optional + VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"` + // +kubebuilder:validation:Optional + Volumes []corev1.Volume `json:"volumes,omitempty"` +} + +type Component struct { + // +kubebuilder:validation:Required + Name string `json:"name"` + // +kubebuilder:validation:Required + Version string `json:"version"` +} + +// RuntimeSpec defines the desired state of Runtime +type RuntimeSpec struct { + // +kubebuilder:validation:Required + Version string `json:"version"` + // +kubebuilder:validation:Required + ClassRef string `json:"classRef"` + + // +kubebuilder:validation:Optional + Components []Component `json:"components,omitempty"` + // +kubebuilder:validation:Optional + Category []string `json:"category,omitempty"` + // +kube:validation:Optional + Description string `json:"description,omitempty"` + + // +kubebuilder:validation:Required + Config Config `json:"config"` +} + +// RuntimeStatus defines the observed state of Runtime +type RuntimeStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// Runtime is the Schema for the runtimes API +type Runtime struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec RuntimeSpec `json:"spec,omitempty"` + Status RuntimeStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// RuntimeList contains a list of Runtime +type RuntimeList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Runtime `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Runtime{}, &RuntimeList{}) +} diff --git a/controllers/devbox/api/v1alpha1/runtimeclass_types.go b/controllers/devbox/api/v1alpha1/runtimeclass_types.go new file mode 100644 index 00000000000..8d8599e5ebd --- /dev/null +++ b/controllers/devbox/api/v1alpha1/runtimeclass_types.go @@ -0,0 +1,71 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type RuntimeClassKind string + +const ( + RuntimeClassOSKind RuntimeClassKind = "OS" + RuntimeClassLanguageKind RuntimeClassKind = "Language" + RuntimeClassFrameworkKind RuntimeClassKind = "Framework" +) + +// RuntimeClassSpec defines the desired state of RuntimeClass +type RuntimeClassSpec struct { + // +kubebuilder:validation:Required + // +kubebuilder:validation:Enum=OS;Language;Framework + Kind RuntimeClassKind `json:"kind"` + // +kubebuilder:validation:Required + Title string `json:"title"` + // +kubebuilder:validation:Optional + Description string `json:"description"` +} + +// RuntimeClassStatus defines the observed state of RuntimeClass +type RuntimeClassStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// RuntimeClass is the Schema for the runtimeclasses API +type RuntimeClass struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec RuntimeClassSpec `json:"spec,omitempty"` + Status RuntimeClassStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// RuntimeClassList contains a list of RuntimeClass +type RuntimeClassList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []RuntimeClass `json:"items"` +} + +func init() { + SchemeBuilder.Register(&RuntimeClass{}, &RuntimeClassList{}) +} diff --git a/controllers/devbox/api/v1alpha1/zz_generated.deepcopy.go b/controllers/devbox/api/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..a62954292b7 --- /dev/null +++ b/controllers/devbox/api/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,739 @@ +//go:build !ignore_autogenerated + +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CommitHistory) DeepCopyInto(out *CommitHistory) { + *out = *in + in.Time.DeepCopyInto(&out.Time) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommitHistory. +func (in *CommitHistory) DeepCopy() *CommitHistory { + if in == nil { + return nil + } + out := new(CommitHistory) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Component) DeepCopyInto(out *Component) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Component. +func (in *Component) DeepCopy() *Component { + if in == nil { + return nil + } + out := new(Component) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Config) DeepCopyInto(out *Config) { + *out = *in + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Command != nil { + in, out := &in.Command, &out.Command + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Args != nil { + in, out := &in.Args, &out.Args + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Env != nil { + in, out := &in.Env, &out.Env + *out = make([]v1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ReleaseCommand != nil { + in, out := &in.ReleaseCommand, &out.ReleaseCommand + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ReleaseArgs != nil { + in, out := &in.ReleaseArgs, &out.ReleaseArgs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Ports != nil { + in, out := &in.Ports, &out.Ports + *out = make([]v1.ContainerPort, len(*in)) + copy(*out, *in) + } + if in.VolumeMounts != nil { + in, out := &in.VolumeMounts, &out.VolumeMounts + *out = make([]v1.VolumeMount, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Volumes != nil { + in, out := &in.Volumes, &out.Volumes + *out = make([]v1.Volume, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Config. +func (in *Config) DeepCopy() *Config { + if in == nil { + return nil + } + out := new(Config) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevBoxRelease) DeepCopyInto(out *DevBoxRelease) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevBoxRelease. +func (in *DevBoxRelease) DeepCopy() *DevBoxRelease { + if in == nil { + return nil + } + out := new(DevBoxRelease) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DevBoxRelease) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevBoxReleaseList) DeepCopyInto(out *DevBoxReleaseList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DevBoxRelease, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevBoxReleaseList. +func (in *DevBoxReleaseList) DeepCopy() *DevBoxReleaseList { + if in == nil { + return nil + } + out := new(DevBoxReleaseList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DevBoxReleaseList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevBoxReleaseSpec) DeepCopyInto(out *DevBoxReleaseSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevBoxReleaseSpec. +func (in *DevBoxReleaseSpec) DeepCopy() *DevBoxReleaseSpec { + if in == nil { + return nil + } + out := new(DevBoxReleaseSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevBoxReleaseStatus) DeepCopyInto(out *DevBoxReleaseStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevBoxReleaseStatus. +func (in *DevBoxReleaseStatus) DeepCopy() *DevBoxReleaseStatus { + if in == nil { + return nil + } + out := new(DevBoxReleaseStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Devbox) DeepCopyInto(out *Devbox) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Devbox. +func (in *Devbox) DeepCopy() *Devbox { + if in == nil { + return nil + } + out := new(Devbox) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Devbox) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevboxList) DeepCopyInto(out *DevboxList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Devbox, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevboxList. +func (in *DevboxList) DeepCopy() *DevboxList { + if in == nil { + return nil + } + out := new(DevboxList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DevboxList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevboxSpec) DeepCopyInto(out *DevboxSpec) { + *out = *in + if in.Resource != nil { + in, out := &in.Resource, &out.Resource + *out = make(ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + out.RuntimeRef = in.RuntimeRef + in.NetworkSpec.DeepCopyInto(&out.NetworkSpec) + if in.ExtraLabels != nil { + in, out := &in.ExtraLabels, &out.ExtraLabels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.ExtraAnnotations != nil { + in, out := &in.ExtraAnnotations, &out.ExtraAnnotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Command != nil { + in, out := &in.Command, &out.Command + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Args != nil { + in, out := &in.Args, &out.Args + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExtraEnvs != nil { + in, out := &in.ExtraEnvs, &out.ExtraEnvs + *out = make([]v1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ExtraVolumes != nil { + in, out := &in.ExtraVolumes, &out.ExtraVolumes + *out = make([]v1.Volume, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ExtraVolumeMounts != nil { + in, out := &in.ExtraVolumeMounts, &out.ExtraVolumeMounts + *out = make([]v1.VolumeMount, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]v1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Affinity != nil { + in, out := &in.Affinity, &out.Affinity + *out = new(v1.Affinity) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevboxSpec. +func (in *DevboxSpec) DeepCopy() *DevboxSpec { + if in == nil { + return nil + } + out := new(DevboxSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevboxStatus) DeepCopyInto(out *DevboxStatus) { + *out = *in + out.Network = in.Network + if in.CommitHistory != nil { + in, out := &in.CommitHistory, &out.CommitHistory + *out = make([]*CommitHistory, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(CommitHistory) + (*in).DeepCopyInto(*out) + } + } + } + in.State.DeepCopyInto(&out.State) + in.LastTerminationState.DeepCopyInto(&out.LastTerminationState) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevboxStatus. +func (in *DevboxStatus) DeepCopy() *DevboxStatus { + if in == nil { + return nil + } + out := new(DevboxStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { + *out = *in + if in.ExtraPorts != nil { + in, out := &in.ExtraPorts, &out.ExtraPorts + *out = make([]v1.ContainerPort, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. +func (in *NetworkSpec) DeepCopy() *NetworkSpec { + if in == nil { + return nil + } + out := new(NetworkSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. +func (in *NetworkStatus) DeepCopy() *NetworkStatus { + if in == nil { + return nil + } + out := new(NetworkStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperationRequest) DeepCopyInto(out *OperationRequest) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperationRequest. +func (in *OperationRequest) DeepCopy() *OperationRequest { + if in == nil { + return nil + } + out := new(OperationRequest) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperationRequest) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperationRequestList) DeepCopyInto(out *OperationRequestList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OperationRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperationRequestList. +func (in *OperationRequestList) DeepCopy() *OperationRequestList { + if in == nil { + return nil + } + out := new(OperationRequestList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperationRequestList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperationRequestSpec) DeepCopyInto(out *OperationRequestSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperationRequestSpec. +func (in *OperationRequestSpec) DeepCopy() *OperationRequestSpec { + if in == nil { + return nil + } + out := new(OperationRequestSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperationRequestStatus) DeepCopyInto(out *OperationRequestStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperationRequestStatus. +func (in *OperationRequestStatus) DeepCopy() *OperationRequestStatus { + if in == nil { + return nil + } + out := new(OperationRequestStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in ResourceList) DeepCopyInto(out *ResourceList) { + { + in := &in + *out = make(ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceList. +func (in ResourceList) DeepCopy() ResourceList { + if in == nil { + return nil + } + out := new(ResourceList) + in.DeepCopyInto(out) + return *out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Runtime) DeepCopyInto(out *Runtime) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Runtime. +func (in *Runtime) DeepCopy() *Runtime { + if in == nil { + return nil + } + out := new(Runtime) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Runtime) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeClass) DeepCopyInto(out *RuntimeClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeClass. +func (in *RuntimeClass) DeepCopy() *RuntimeClass { + if in == nil { + return nil + } + out := new(RuntimeClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RuntimeClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeClassList) DeepCopyInto(out *RuntimeClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]RuntimeClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeClassList. +func (in *RuntimeClassList) DeepCopy() *RuntimeClassList { + if in == nil { + return nil + } + out := new(RuntimeClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RuntimeClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeClassSpec) DeepCopyInto(out *RuntimeClassSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeClassSpec. +func (in *RuntimeClassSpec) DeepCopy() *RuntimeClassSpec { + if in == nil { + return nil + } + out := new(RuntimeClassSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeClassStatus) DeepCopyInto(out *RuntimeClassStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeClassStatus. +func (in *RuntimeClassStatus) DeepCopy() *RuntimeClassStatus { + if in == nil { + return nil + } + out := new(RuntimeClassStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeList) DeepCopyInto(out *RuntimeList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Runtime, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeList. +func (in *RuntimeList) DeepCopy() *RuntimeList { + if in == nil { + return nil + } + out := new(RuntimeList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RuntimeList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeRef) DeepCopyInto(out *RuntimeRef) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeRef. +func (in *RuntimeRef) DeepCopy() *RuntimeRef { + if in == nil { + return nil + } + out := new(RuntimeRef) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeSpec) DeepCopyInto(out *RuntimeSpec) { + *out = *in + if in.Components != nil { + in, out := &in.Components, &out.Components + *out = make([]Component, len(*in)) + copy(*out, *in) + } + if in.Category != nil { + in, out := &in.Category, &out.Category + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.Config.DeepCopyInto(&out.Config) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeSpec. +func (in *RuntimeSpec) DeepCopy() *RuntimeSpec { + if in == nil { + return nil + } + out := new(RuntimeSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RuntimeStatus) DeepCopyInto(out *RuntimeStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuntimeStatus. +func (in *RuntimeStatus) DeepCopy() *RuntimeStatus { + if in == nil { + return nil + } + out := new(RuntimeStatus) + in.DeepCopyInto(out) + return out +} diff --git a/controllers/devbox/cmd/main.go b/controllers/devbox/cmd/main.go new file mode 100644 index 00000000000..8dd3f3d7f0d --- /dev/null +++ b/controllers/devbox/cmd/main.go @@ -0,0 +1,207 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "crypto/tls" + "flag" + "os" + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + // to ensure that exec-entrypoint and run can make use of them. + _ "k8s.io/client-go/plugin/pkg/client/auth" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/healthz" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/metrics/filters" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + "sigs.k8s.io/controller-runtime/pkg/webhook" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" + "github.com/labring/sealos/controllers/devbox/internal/controller" + "github.com/labring/sealos/controllers/devbox/internal/controller/utils/registry" + // +kubebuilder:scaffold:imports +) + +var ( + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + + utilruntime.Must(devboxv1alpha1.AddToScheme(scheme)) + // +kubebuilder:scaffold:scheme +} + +func main() { + var metricsAddr string + var enableLeaderElection bool + var probeAddr string + var secureMetrics bool + var enableHTTP2 bool + var tlsOpts []func(*tls.Config) + var registryAddr string + var registryUser string + var registryPassword string + var authAddr string + var ephemeralStorage string + var debugMode bool + flag.StringVar(®istryAddr, "registry-addr", "sealos.hub:5000", "The address of the registry") + flag.StringVar(®istryUser, "registry-user", "admin", "The user of the registry") + flag.StringVar(®istryPassword, "registry-password", "passw0rd", "The password of the registry") + flag.StringVar(&authAddr, "auth-addr", "sealos.hub:5000", "The address of the auth") + flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+ + "Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.") + flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + flag.BoolVar(&secureMetrics, "metrics-secure", true, + "If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead.") + flag.BoolVar(&enableHTTP2, "enable-http2", false, + "If set, HTTP/2 will be enabled for the metrics and webhook servers") + flag.BoolVar(&debugMode, "debug", false, "If set, debug mode will be enabled") + flag.StringVar(&ephemeralStorage, "ephemeral-storage", "2000Mi", "The maximum value of equatorial storage in devbox.") + opts := zap.Options{ + Development: true, + } + opts.BindFlags(flag.CommandLine) + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + + // if the enable-http2 flag is false (the default), http/2 should be disabled + // due to its vulnerabilities. More specifically, disabling http/2 will + // prevent from being vulnerable to the HTTP/2 Stream Cancellation and + // Rapid Reset CVEs. For more information see: + // - https://github.com/advisories/GHSA-qppj-fm5r-hxr3 + // - https://github.com/advisories/GHSA-4374-p667-p6c8 + disableHTTP2 := func(c *tls.Config) { + setupLog.Info("disabling http/2") + c.NextProtos = []string{"http/1.1"} + } + + if !enableHTTP2 { + tlsOpts = append(tlsOpts, disableHTTP2) + } + + webhookServer := webhook.NewServer(webhook.Options{ + TLSOpts: tlsOpts, + }) + + // Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server. + // More info: + // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.4/pkg/metrics/server + // - https://book.kubebuilder.io/reference/metrics.html + metricsServerOptions := metricsserver.Options{ + BindAddress: metricsAddr, + SecureServing: secureMetrics, + // TODO(user): TLSOpts is used to allow configuring the TLS config used for the server. If certificates are + // not provided, self-signed certificates will be generated by default. This option is not recommended for + // production environments as self-signed certificates do not offer the same level of trust and security + // as certificates issued by a trusted Certificate Authority (CA). The primary risk is potentially allowing + // unauthorized access to sensitive metrics data. Consider replacing with CertDir, CertName, and KeyName + // to provide certificates, ensuring the server communicates using trusted and secure certificates. + TLSOpts: tlsOpts, + } + + if secureMetrics { + // FilterProvider is used to protect the metrics endpoint with authn/authz. + // These configurations ensure that only authorized users and service accounts + // can access the metrics endpoint. The RBAC are configured in 'config/rbac/kustomization.yaml'. More info: + // https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.4/pkg/metrics/filters#WithAuthenticationAndAuthorization + metricsServerOptions.FilterProvider = filters.WithAuthenticationAndAuthorization + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Metrics: metricsServerOptions, + WebhookServer: webhookServer, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "b6694722.sealos.io", + // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily + // when the Manager ends. This requires the binary to immediately end when the + // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly + // speeds up voluntary leader transitions as the new leader don't have to wait + // LeaseDuration time first. + // + // In the default scaffold provided, the program ends immediately after + // the manager stops, so would be fine to enable this option. However, + // if you are doing or is intended to do any operation such as perform cleanups + // after the manager stops then its usage might be unsafe. + // LeaderElectionReleaseOnCancel: true, + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (&controller.DevboxReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + CommitImageRegistry: registryAddr, + Recorder: mgr.GetEventRecorderFor("devbox-controller"), + EquatorialStorage: ephemeralStorage, + DebugMode: debugMode, + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Devbox") + os.Exit(1) + } + + if err = (&controller.DevBoxReleaseReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Registry: ®istry.Client{ + Username: registryUser, + Password: registryPassword, + }, + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "DevBoxRelease") + os.Exit(1) + } + //if err = (&controller.OperationRequestReconciler{ + // CommitImageRegistry: registryAddr, + // Client: mgr.GetClient(), + // Scheme: mgr.GetScheme(), + //}).SetupWithManager(mgr); err != nil { + // setupLog.Error(err, "unable to create controller", "controller", "OperationRequest") + // os.Exit(1) + //} + // +kubebuilder:scaffold:builder + + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + os.Exit(1) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + os.Exit(1) + } + + setupLog.Info("starting manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } +} diff --git a/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxes.yaml b/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxes.yaml new file mode 100644 index 00000000000..7c585d60f50 --- /dev/null +++ b/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxes.yaml @@ -0,0 +1,2921 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: devboxes.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: Devbox + listKind: DevboxList + plural: devboxes + singular: devbox + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.state + name: State + type: string + - jsonPath: .spec.runtimeRef.name + name: RuntimeRef + type: string + - jsonPath: .status.podPhase + name: PodPhase + type: string + - jsonPath: .status.network.type + name: NetworkType + type: string + - jsonPath: .status.network.nodePort + name: NodePort + type: integer + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Devbox is the Schema for the devboxes API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: DevboxSpec defines the desired state of Devbox + properties: + affinity: + description: Affinity is a group of affinity scheduling rules. + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node matches the corresponding matchExpressions; the + node(s) with the highest sum are the most preferred. + items: + description: |- + An empty preferred scheduling term matches all objects with implicit weight 0 + (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an update), the system + may or may not try to eventually evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: |- + A null or empty node selector term matches no objects. The requirements of + them are ANDed. + The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: |- + weight associated with matching the corresponding podAffinityTerm, + in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod label update), the + system may or may not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes corresponding to each + podAffinityTerm are intersected, i.e. all terms must be satisfied. + items: + description: |- + Defines a set of pods (namely those matching the labelSelector + relative to the given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node whose value of + the label with key matches that of any node on which + a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the anti-affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: |- + weight associated with matching the corresponding podAffinityTerm, + in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the anti-affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the anti-affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod label update), the + system may or may not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes corresponding to each + podAffinityTerm are intersected, i.e. all terms must be satisfied. + items: + description: |- + Defines a set of pods (namely those matching the labelSelector + relative to the given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node whose value of + the label with key matches that of any node on which + a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + args: + items: + type: string + type: array + command: + items: + type: string + type: array + extraAnnotations: + additionalProperties: + type: string + type: object + extraEnvs: + description: todo add rewrite env... + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: |- + Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in the container and + any service environment variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. Double $$ are reduced + to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + Escaped references will never be expanded, regardless of whether the variable + exists or not. + Defaults to "". + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: |- + Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['']`, `metadata.annotations['']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + extraLabels: + additionalProperties: + type: string + description: todo add rewrite labels and annotations... + type: object + extraVolumeMounts: + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: |- + Path within the container at which the volume should be mounted. Must + not contain ':'. + type: string + mountPropagation: + description: |- + mountPropagation determines how mounts are propagated from the host + to container and the other way around. + When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: |- + Mounted read-only if true, read-write otherwise (false or unspecified). + Defaults to false. + type: boolean + subPath: + description: |- + Path within the volume from which the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: |- + Expanded path within the volume from which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). + SubPathExpr and SubPath are mutually exclusive. + type: string + required: + - mountPath + - name + type: object + type: array + extraVolumes: + description: todo add rewrite volumes and volume mounts.. + items: + description: Volume represents a named volume in a pod that may + be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: |- + awsElasticBlockStore represents an AWS Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + format: int32 + type: integer + readOnly: + description: |- + readOnly value true will force the readOnly setting in VolumeMounts. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: boolean + volumeID: + description: |- + volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount on + the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: None, + Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in the + blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the blob + storage + type: string + fsType: + description: |- + fsType is Filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service mount + on the host and bind mount to the pod. + properties: + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that contains + Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host that + shares a pod's lifetime + properties: + monitors: + description: |- + monitors is Required: Monitors is a collection of Ceph monitors + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: boolean + secretFile: + description: |- + secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + secretRef: + description: |- + secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is optional: User is the rados user name, default is admin + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + required: + - monitors + type: object + cinder: + description: |- + cinder represents a cinder volume attached and mounted on kubelets host machine. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: boolean + secretRef: + description: |- + secretRef is optional: points to a secret object containing parameters used to connect + to OpenStack. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: |- + volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should populate + this volume + properties: + defaultMode: + description: |- + defaultMode is optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap or its + keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents ephemeral + storage that is handled by certain external CSI drivers (Beta + feature). + properties: + driver: + description: |- + driver is the name of the CSI driver that handles this volume. + Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: |- + fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated CSI driver + which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: |- + nodePublishSecretRef is a reference to the secret object containing + sensitive information to pass to the CSI driver to complete the CSI + NodePublishVolume and NodeUnpublishVolume calls. + This field is optional, and may be empty if no secret is required. If the + secret object contains more than one secret, all secret references are passed. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: |- + readOnly specifies a read-only configuration for the volume. + Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: |- + volumeAttributes stores driver-specific properties that are passed to the CSI + driver. Consult your driver's documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the pod + that should populate this volume + properties: + defaultMode: + description: |- + Optional: mode bits to use on created files by default. Must be a + Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: Items is a list of downward API volume file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the pod: + only annotations, labels, name and namespace are + supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative path + name of the file to be created. Must not be absolute + or contain the ''..'' path. Must be utf-8 encoded. + The first item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: |- + emptyDir represents a temporary directory that shares a pod's lifetime. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + properties: + medium: + description: |- + medium represents what type of storage medium should back this directory. + The default is "" which means to use the node's default medium. + Must be an empty string (default) or Memory. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: |- + sizeLimit is the total amount of local storage required for this EmptyDir volume. + The size limit is also applicable for memory medium. + The maximum usage on memory medium EmptyDir would be the minimum value between + the SizeLimit specified here and the sum of memory limits of all containers in a pod. + The default is nil which means that the limit is undefined. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: |- + ephemeral represents a volume that is handled by a cluster storage driver. + The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, + and deleted when the pod is removed. + + + Use this if: + a) the volume is only needed while the pod runs, + b) features of normal volumes like restoring from snapshot or capacity + tracking are needed, + c) the storage driver is specified through a storage class, and + d) the storage driver supports dynamic volume provisioning through + a PersistentVolumeClaim (see EphemeralVolumeSource for more + information on the connection between this volume type + and PersistentVolumeClaim). + + + Use PersistentVolumeClaim or one of the vendor-specific + APIs for volumes that persist for longer than the lifecycle + of an individual pod. + + + Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to + be used that way - see the documentation of the driver for + more information. + + + A pod can use both types of ephemeral volumes and + persistent volumes at the same time. + properties: + volumeClaimTemplate: + description: |- + Will be used to create a stand-alone PVC to provision the volume. + The pod in which this EphemeralVolumeSource is embedded will be the + owner of the PVC, i.e. the PVC will be deleted together with the + pod. The name of the PVC will be `-` where + `` is the name from the `PodSpec.Volumes` array + entry. Pod validation will reject the pod if the concatenated name + is not valid for a PVC (for example, too long). + + + An existing PVC with that name that is not owned by the pod + will *not* be used for the pod to avoid using an unrelated + volume by mistake. Starting the pod is then blocked until + the unrelated PVC is removed. If such a pre-created PVC is + meant to be used by the pod, the PVC has to updated with an + owner reference to the pod once the pod exists. Normally + this should not be necessary, but it may be useful when + manually reconstructing a broken cluster. + + + This field is read-only and no changes will be made by Kubernetes + to the PVC after it has been created. + + + Required, must not be nil. + properties: + metadata: + description: |- + May contain labels and annotations that will be copied into the PVC + when creating it. No other fields are allowed and will be rejected during + validation. + type: object + spec: + description: |- + The specification for the PersistentVolumeClaim. The entire content is + copied unchanged into the PVC that gets created from this + template. The same fields as in a PersistentVolumeClaim + are also valid here. + properties: + accessModes: + description: |- + accessModes contains the desired access modes the volume should have. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 + items: + type: string + type: array + dataSource: + description: |- + dataSource field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) + If the provisioner or an external controller can support the specified data source, + it will create a new volume based on the contents of the specified data source. + When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, + and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. + If the namespace is specified, then dataSourceRef will not be copied to dataSource. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: |- + dataSourceRef specifies the object from which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty API group (non + core object) or a PersistentVolumeClaim object. + When this field is specified, volume binding will only succeed if the type of + the specified object matches some installed volume populator or dynamic + provisioner. + This field will replace the functionality of the dataSource field and as such + if both fields are non-empty, they must have the same value. For backwards + compatibility, when namespace isn't specified in dataSourceRef, + both fields (dataSource and dataSourceRef) will be set to the same + value automatically if one of them is empty and the other is non-empty. + When namespace is specified in dataSourceRef, + dataSource isn't set to the same value and must be empty. + There are three important differences between dataSource and dataSourceRef: + * While dataSource only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim objects. + * While dataSource ignores disallowed values (dropping them), dataSourceRef + preserves all values, and generates an error if a disallowed value is + specified. + * While dataSource only allows local objects, dataSourceRef allows objects + in any namespaces. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. + (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + namespace: + description: |- + Namespace is the namespace of resource being referenced + Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. + (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: |- + resources represents the minimum resources the volume should have. + If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements + that are lower than previous value but must still be higher than capacity recorded in the + status field of the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + properties: + claims: + description: |- + Claims lists the names of resources, defined in spec.resourceClaims, + that are used by this container. + + + This is an alpha field and requires enabling the + DynamicResourceAllocation feature gate. + + + This field is immutable. It can only be set for containers. + items: + description: ResourceClaim references one + entry in PodSpec.ResourceClaims. + properties: + name: + description: |- + Name must match the name of one entry in pod.spec.resourceClaims of + the Pod where this field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Limits describes the maximum amount of compute resources allowed. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Requests describes the minimum amount of compute resources required. + If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. Requests cannot exceed Limits. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + type: object + selector: + description: selector is a label query over volumes + to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: |- + storageClassName is the name of the StorageClass required by the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 + type: string + volumeMode: + description: |- + volumeMode defines what type of volume is required by the claim. + Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that is + attached to a kubelet's host machine and then exposed to the + pod. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: |- + wwids Optional: FC volume world wide identifiers (wwids) + Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + items: + type: string + type: array + type: object + flexVolume: + description: |- + flexVolume represents a generic volume resource that is + provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use for + this volume. + type: string + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds extra + command options if any.' + type: object + readOnly: + description: |- + readOnly is Optional: defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef is Optional: secretRef is reference to the secret object containing + sensitive information to pass to the plugin scripts. This may be + empty if no secret object is specified. If the secret object + contains more than one secret, all secrets are passed to the plugin + scripts. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached to + a kubelet's host machine. This depends on the Flocker control + service being running + properties: + datasetName: + description: |- + datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker + should be considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. This + is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: |- + gcePersistentDisk represents a GCE Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + properties: + fsType: + description: |- + fsType is filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + format: int32 + type: integer + pdName: + description: |- + pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: boolean + required: + - pdName + type: object + gitRepo: + description: |- + gitRepo represents a git repository at a particular revision. + DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + into the Pod's container. + properties: + directory: + description: |- + directory is the target directory name. + Must not contain or start with '..'. If '.' is supplied, the volume directory will be the + git repository. Otherwise, if specified, the volume will contain the git repository in + the subdirectory with the given name. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: |- + glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/glusterfs/README.md + properties: + endpoints: + description: |- + endpoints is the endpoint name that details Glusterfs topology. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + path: + description: |- + path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + readOnly: + description: |- + readOnly here will force the Glusterfs volume to be mounted with read-only permissions. + Defaults to false. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: |- + hostPath represents a pre-existing file or directory on the host + machine that is directly exposed to the container. This is generally + used for system agents or other privileged things that are allowed + to see the host machine. Most containers will NOT need this. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + --- + TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not + mount host directories as read/write. + properties: + path: + description: |- + path of the directory on the host. + If the path is a symlink, it will follow the link to the real path. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + type: + description: |- + type for HostPath Volume + Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + required: + - path + type: object + iscsi: + description: |- + iscsi represents an ISCSI Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://examples.k8s.io/volumes/iscsi/README.md + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support iSCSI + Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support iSCSI + Session CHAP authentication + type: boolean + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + initiatorName: + description: |- + initiatorName is the custom iSCSI Initiator Name. + If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface + : will be created for the connection. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: |- + iscsiInterface is the interface Name that uses an iSCSI transport. + Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: |- + portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI target + and initiator authentication + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: |- + targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: |- + name of the volume. + Must be a DNS_LABEL and unique within the pod. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + nfs: + description: |- + nfs represents an NFS mount on the host that shares a pod's lifetime + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + properties: + path: + description: |- + path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + readOnly: + description: |- + readOnly here will force the NFS export to be mounted with read-only permissions. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: boolean + server: + description: |- + server is the hostname or IP address of the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: |- + persistentVolumeClaimVolumeSource represents a reference to a + PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + properties: + claimName: + description: |- + claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + type: string + readOnly: + description: |- + readOnly Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: |- + defaultMode are the mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along with + other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the downwardAPI + data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format + of the exposed resources, defaults + to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to + select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret data + to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional field specify whether the + Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information about + the serviceAccountToken data to project + properties: + audience: + description: |- + audience is the intended audience of the token. A recipient of a token + must identify itself with an identifier specified in the audience of the + token, and otherwise should reject the token. The audience defaults to the + identifier of the apiserver. + type: string + expirationSeconds: + description: |- + expirationSeconds is the requested duration of validity of the service + account token. As the token approaches expiration, the kubelet volume + plugin will proactively rotate the service account token. The kubelet will + start trying to rotate the token if the token is older than 80 percent of + its time to live or if the token is older than 24 hours.Defaults to 1 hour + and must be at least 10 minutes. + format: int64 + type: integer + path: + description: |- + path is the path relative to the mount point of the file to project the + token into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: |- + group to map volume access to + Default is no group + type: string + readOnly: + description: |- + readOnly here will force the Quobyte volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + registry: + description: |- + registry represents a single or multiple Quobyte Registry services + specified as a string as host:port pair (multiple entries are separated with commas) + which acts as the central registry for volumes + type: string + tenant: + description: |- + tenant owning the given Quobyte volume in the Backend + Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: |- + user to map volume access to + Defaults to serivceaccount user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: |- + rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/rbd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + image: + description: |- + image is the rados image name. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + keyring: + description: |- + keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + monitors: + description: |- + monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + items: + type: string + type: array + pool: + description: |- + pool is the rados pool name. + Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: boolean + secretRef: + description: |- + secretRef is name of the authentication secret for RBDUser. If provided + overrides keyring. + Default is nil. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is the rados user name. + Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". + Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef references to the secret for ScaleIO user and other + sensitive information. If this is not provided, Login operation will fail. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: |- + storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool associated + with the protection domain. + type: string + system: + description: system is the name of the storage system as + configured in ScaleIO. + type: string + volumeName: + description: |- + volumeName is the name of a volume already created in the ScaleIO system + that is associated with this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: |- + secret represents a secret that should populate this volume. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + properties: + defaultMode: + description: |- + defaultMode is Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values + for mode bits. Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items If unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret or + its keys must be defined + type: boolean + secretName: + description: |- + secretName is the name of the secret in the pod's namespace to use. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef specifies the secret to use for obtaining the StorageOS API + credentials. If not specified, default values will be attempted. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: |- + volumeName is the human-readable name of the StorageOS volume. Volume + names are only unique within a namespace. + type: string + volumeNamespace: + description: |- + volumeNamespace specifies the scope of the volume within StorageOS. If no + namespace is specified then the Pod's namespace will be used. This allows the + Kubernetes name scoping to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default behaviour. + Set to "default" if you are not using namespaces within StorageOS. + Namespaces that do not pre-exist within StorageOS will be created. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy Based + Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies vSphere + volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + network: + properties: + extraPorts: + items: + description: ContainerPort represents a network port in a single + container. + properties: + containerPort: + description: |- + Number of port to expose on the pod's IP address. + This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: |- + Number of port to expose on the host. + If specified, this must be a valid port number, 0 < x < 65536. + If HostNetwork is specified, this must match ContainerPort. + Most containers do not need this. + format: int32 + type: integer + name: + description: |- + If specified, this must be an IANA_SVC_NAME and unique within the pod. Each + named port in a pod must have a unique name. Name for the port that can be + referred to by services. + type: string + protocol: + default: TCP + description: |- + Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + type: + enum: + - NodePort + - Tailnet + type: string + required: + - type + type: object + resource: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + runtimeRef: + properties: + name: + type: string + namespace: + type: string + required: + - name + type: object + squash: + default: false + type: boolean + state: + enum: + - Running + - Stopped + type: string + tolerations: + items: + description: |- + The pod this Toleration is attached to tolerates any taint that matches + the triple using the matching operator . + properties: + effect: + description: |- + Effect indicates the taint effect to match. Empty means match all taint effects. + When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: |- + Key is the taint key that the toleration applies to. Empty means match all taint keys. + If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: |- + Operator represents a key's relationship to the value. + Valid operators are Exists and Equal. Defaults to Equal. + Exists is equivalent to wildcard for value, so that a pod can + tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: |- + TolerationSeconds represents the period of time the toleration (which must be + of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, + it is not set, which means tolerate the taint forever (do not evict). Zero and + negative values will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: |- + Value is the taint value the toleration matches to. + If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + type: object + type: array + workingDir: + type: string + required: + - resource + - runtimeRef + - state + type: object + status: + description: DevboxStatus defines the observed state of Devbox + properties: + commitHistory: + items: + properties: + containerID: + description: ContainerID is the container id + type: string + image: + description: Image is the image of the commit + type: string + node: + description: Node is the node name + type: string + pod: + description: Pod is the pod name + type: string + predicatedStatus: + description: predicatedStatus default `pending`, will be set + to `success` if pod status is running successfully. + type: string + status: + description: status will be set based on expectedStatus after + devbox pod delete or stop. if expectedStatus is still pending, + it means the pod is not running successfully, so we need to + set it to `failed` + type: string + time: + description: Time is the time when the commit is created + format: date-time + type: string + required: + - containerID + - image + - node + - pod + - predicatedStatus + - status + - time + type: object + type: array + lastState: + description: |- + ContainerState holds a possible state of container. + Only one of its members may be specified. + If none of them is specified, the default one is ContainerStateWaiting. + properties: + running: + description: Details about a running container + properties: + startedAt: + description: Time at which the container was last (re-)started + format: date-time + type: string + type: object + terminated: + description: Details about a terminated container + properties: + containerID: + description: Container's ID in the format '://' + type: string + exitCode: + description: Exit status from the last termination of the + container + format: int32 + type: integer + finishedAt: + description: Time at which the container last terminated + format: date-time + type: string + message: + description: Message regarding the last termination of the + container + type: string + reason: + description: (brief) reason from the last termination of the + container + type: string + signal: + description: Signal from the last termination of the container + format: int32 + type: integer + startedAt: + description: Time at which previous execution of the container + started + format: date-time + type: string + required: + - exitCode + type: object + waiting: + description: Details about a waiting container + properties: + message: + description: Message regarding why the container is not yet + running. + type: string + reason: + description: (brief) reason the container is not yet running. + type: string + type: object + type: object + network: + properties: + nodePort: + format: int32 + type: integer + tailnet: + description: todo TailNet + type: string + type: + default: NodePort + enum: + - NodePort + - Tailnet + type: string + required: + - type + type: object + phase: + type: string + podPhase: + description: PodPhase is a label for the condition of a pod at the + current time. + type: string + state: + description: |- + ContainerState holds a possible state of container. + Only one of its members may be specified. + If none of them is specified, the default one is ContainerStateWaiting. + properties: + running: + description: Details about a running container + properties: + startedAt: + description: Time at which the container was last (re-)started + format: date-time + type: string + type: object + terminated: + description: Details about a terminated container + properties: + containerID: + description: Container's ID in the format '://' + type: string + exitCode: + description: Exit status from the last termination of the + container + format: int32 + type: integer + finishedAt: + description: Time at which the container last terminated + format: date-time + type: string + message: + description: Message regarding the last termination of the + container + type: string + reason: + description: (brief) reason from the last termination of the + container + type: string + signal: + description: Signal from the last termination of the container + format: int32 + type: integer + startedAt: + description: Time at which previous execution of the container + started + format: date-time + type: string + required: + - exitCode + type: object + waiting: + description: Details about a waiting container + properties: + message: + description: Message regarding why the container is not yet + running. + type: string + reason: + description: (brief) reason the container is not yet running. + type: string + type: object + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxreleases.yaml b/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxreleases.yaml new file mode 100644 index 00000000000..6ef4ad257b4 --- /dev/null +++ b/controllers/devbox/config/crd/bases/devbox.sealos.io_devboxreleases.yaml @@ -0,0 +1,92 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: devboxreleases.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: DevBoxRelease + listKind: DevBoxReleaseList + plural: devboxreleases + singular: devboxrelease + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.devboxName + name: DevboxName + type: string + - jsonPath: .spec.newTag + name: NewTag + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .status.originalImage + name: OriginalImage + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: DevBoxRelease is the Schema for the devboxreleases API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: DevBoxReleaseSpec defines the desired state of DevBoxRelease + properties: + devboxName: + type: string + newTag: + type: string + notes: + type: string + required: + - devboxName + - newTag + type: object + status: + description: DevBoxReleaseStatus defines the observed state of DevBoxRelease + properties: + originalImage: + type: string + phase: + default: Pending + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/controllers/devbox/config/crd/bases/devbox.sealos.io_operationrequests.yaml b/controllers/devbox/config/crd/bases/devbox.sealos.io_operationrequests.yaml new file mode 100644 index 00000000000..df5f0d04011 --- /dev/null +++ b/controllers/devbox/config/crd/bases/devbox.sealos.io_operationrequests.yaml @@ -0,0 +1,63 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: operationrequests.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: OperationRequest + listKind: OperationRequestList + plural: operationrequests + singular: operationrequest + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: OperationRequest is the Schema for the operationrequests API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: OperationRequestSpec defines the desired state of OperationRequest + type: object + status: + description: OperationRequestStatus defines the observed state of OperationRequest + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimeclasses.yaml b/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimeclasses.yaml new file mode 100644 index 00000000000..29513a0b9b8 --- /dev/null +++ b/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimeclasses.yaml @@ -0,0 +1,77 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: runtimeclasses.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: RuntimeClass + listKind: RuntimeClassList + plural: runtimeclasses + singular: runtimeclass + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: RuntimeClass is the Schema for the runtimeclasses API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: RuntimeClassSpec defines the desired state of RuntimeClass + properties: + description: + type: string + kind: + enum: + - OS + - Language + - Framework + type: string + title: + type: string + required: + - kind + - title + type: object + status: + description: RuntimeClassStatus defines the observed state of RuntimeClass + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimes.yaml b/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimes.yaml new file mode 100644 index 00000000000..0ed11827a4a --- /dev/null +++ b/controllers/devbox/config/crd/bases/devbox.sealos.io_runtimes.yaml @@ -0,0 +1,1939 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: runtimes.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: Runtime + listKind: RuntimeList + plural: runtimes + singular: runtime + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: Runtime is the Schema for the runtimes API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: RuntimeSpec defines the desired state of Runtime + properties: + category: + items: + type: string + type: array + classRef: + type: string + components: + items: + properties: + name: + type: string + version: + type: string + required: + - name + - version + type: object + type: array + config: + properties: + annotations: + additionalProperties: + type: string + type: object + args: + description: kubebuilder:validation:Optional + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: |- + Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in the container and + any service environment variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. Double $$ are reduced + to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + Escaped references will never be expanded, regardless of whether the variable + exists or not. + Defaults to "". + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: |- + Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['']`, `metadata.annotations['']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + type: string + labels: + additionalProperties: + type: string + type: object + ports: + default: + - containerPort: 22 + name: devbox-ssh-port + protocol: TCP + items: + description: ContainerPort represents a network port in a single + container. + properties: + containerPort: + description: |- + Number of port to expose on the pod's IP address. + This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: |- + Number of port to expose on the host. + If specified, this must be a valid port number, 0 < x < 65536. + If HostNetwork is specified, this must match ContainerPort. + Most containers do not need this. + format: int32 + type: integer + name: + description: |- + If specified, this must be an IANA_SVC_NAME and unique within the pod. Each + named port in a pod must have a unique name. Name for the port that can be + referred to by services. + type: string + protocol: + default: TCP + description: |- + Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + releaseArgs: + default: + - /home/sealos/project/entrypoint.sh + items: + type: string + type: array + releaseCommand: + default: + - /bin/bash + - -c + items: + type: string + type: array + user: + default: sealos + type: string + volumeMounts: + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: |- + Path within the container at which the volume should be mounted. Must + not contain ':'. + type: string + mountPropagation: + description: |- + mountPropagation determines how mounts are propagated from the host + to container and the other way around. + When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: |- + Mounted read-only if true, read-write otherwise (false or unspecified). + Defaults to false. + type: boolean + subPath: + description: |- + Path within the volume from which the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: |- + Expanded path within the volume from which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). + SubPathExpr and SubPath are mutually exclusive. + type: string + required: + - mountPath + - name + type: object + type: array + volumes: + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: |- + awsElasticBlockStore represents an AWS Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + format: int32 + type: integer + readOnly: + description: |- + readOnly value true will force the readOnly setting in VolumeMounts. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: boolean + volumeID: + description: |- + volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount + on the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: + None, Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in + the blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the + blob storage + type: string + fsType: + description: |- + fsType is Filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure managed + data disk (only in managed availability set). defaults + to shared' + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service + mount on the host and bind mount to the pod. + properties: + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that + contains Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host + that shares a pod's lifetime + properties: + monitors: + description: |- + monitors is Required: Monitors is a collection of Ceph monitors + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted + root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: boolean + secretFile: + description: |- + secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + secretRef: + description: |- + secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is optional: User is the rados user name, default is admin + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + required: + - monitors + type: object + cinder: + description: |- + cinder represents a cinder volume attached and mounted on kubelets host machine. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: boolean + secretRef: + description: |- + secretRef is optional: points to a secret object containing parameters used to connect + to OpenStack. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: |- + volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should + populate this volume + properties: + defaultMode: + description: |- + defaultMode is optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a + volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents + ephemeral storage that is handled by certain external + CSI drivers (Beta feature). + properties: + driver: + description: |- + driver is the name of the CSI driver that handles this volume. + Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: |- + fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated CSI driver + which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: |- + nodePublishSecretRef is a reference to the secret object containing + sensitive information to pass to the CSI driver to complete the CSI + NodePublishVolume and NodeUnpublishVolume calls. + This field is optional, and may be empty if no secret is required. If the + secret object contains more than one secret, all secret references are passed. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: |- + readOnly specifies a read-only configuration for the volume. + Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: |- + volumeAttributes stores driver-specific properties that are passed to the CSI + driver. Consult your driver's documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the + pod that should populate this volume + properties: + defaultMode: + description: |- + Optional: mode bits to use on created files by default. Must be a + Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: Items is a list of downward API volume + file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the + pod: only annotations, labels, name and namespace + are supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must not + be absolute or contain the ''..'' path. Must + be utf-8 encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of + the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: |- + emptyDir represents a temporary directory that shares a pod's lifetime. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + properties: + medium: + description: |- + medium represents what type of storage medium should back this directory. + The default is "" which means to use the node's default medium. + Must be an empty string (default) or Memory. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: |- + sizeLimit is the total amount of local storage required for this EmptyDir volume. + The size limit is also applicable for memory medium. + The maximum usage on memory medium EmptyDir would be the minimum value between + the SizeLimit specified here and the sum of memory limits of all containers in a pod. + The default is nil which means that the limit is undefined. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: |- + ephemeral represents a volume that is handled by a cluster storage driver. + The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, + and deleted when the pod is removed. + + + Use this if: + a) the volume is only needed while the pod runs, + b) features of normal volumes like restoring from snapshot or capacity + tracking are needed, + c) the storage driver is specified through a storage class, and + d) the storage driver supports dynamic volume provisioning through + a PersistentVolumeClaim (see EphemeralVolumeSource for more + information on the connection between this volume type + and PersistentVolumeClaim). + + + Use PersistentVolumeClaim or one of the vendor-specific + APIs for volumes that persist for longer than the lifecycle + of an individual pod. + + + Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to + be used that way - see the documentation of the driver for + more information. + + + A pod can use both types of ephemeral volumes and + persistent volumes at the same time. + properties: + volumeClaimTemplate: + description: |- + Will be used to create a stand-alone PVC to provision the volume. + The pod in which this EphemeralVolumeSource is embedded will be the + owner of the PVC, i.e. the PVC will be deleted together with the + pod. The name of the PVC will be `-` where + `` is the name from the `PodSpec.Volumes` array + entry. Pod validation will reject the pod if the concatenated name + is not valid for a PVC (for example, too long). + + + An existing PVC with that name that is not owned by the pod + will *not* be used for the pod to avoid using an unrelated + volume by mistake. Starting the pod is then blocked until + the unrelated PVC is removed. If such a pre-created PVC is + meant to be used by the pod, the PVC has to updated with an + owner reference to the pod once the pod exists. Normally + this should not be necessary, but it may be useful when + manually reconstructing a broken cluster. + + + This field is read-only and no changes will be made by Kubernetes + to the PVC after it has been created. + + + Required, must not be nil. + properties: + metadata: + description: |- + May contain labels and annotations that will be copied into the PVC + when creating it. No other fields are allowed and will be rejected during + validation. + type: object + spec: + description: |- + The specification for the PersistentVolumeClaim. The entire content is + copied unchanged into the PVC that gets created from this + template. The same fields as in a PersistentVolumeClaim + are also valid here. + properties: + accessModes: + description: |- + accessModes contains the desired access modes the volume should have. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 + items: + type: string + type: array + dataSource: + description: |- + dataSource field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) + If the provisioner or an external controller can support the specified data source, + it will create a new volume based on the contents of the specified data source. + When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, + and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. + If the namespace is specified, then dataSourceRef will not be copied to dataSource. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: |- + dataSourceRef specifies the object from which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty API group (non + core object) or a PersistentVolumeClaim object. + When this field is specified, volume binding will only succeed if the type of + the specified object matches some installed volume populator or dynamic + provisioner. + This field will replace the functionality of the dataSource field and as such + if both fields are non-empty, they must have the same value. For backwards + compatibility, when namespace isn't specified in dataSourceRef, + both fields (dataSource and dataSourceRef) will be set to the same + value automatically if one of them is empty and the other is non-empty. + When namespace is specified in dataSourceRef, + dataSource isn't set to the same value and must be empty. + There are three important differences between dataSource and dataSourceRef: + * While dataSource only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim objects. + * While dataSource ignores disallowed values (dropping them), dataSourceRef + preserves all values, and generates an error if a disallowed value is + specified. + * While dataSource only allows local objects, dataSourceRef allows objects + in any namespaces. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. + (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + namespace: + description: |- + Namespace is the namespace of resource being referenced + Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. + (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: |- + resources represents the minimum resources the volume should have. + If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements + that are lower than previous value but must still be higher than capacity recorded in the + status field of the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + properties: + claims: + description: |- + Claims lists the names of resources, defined in spec.resourceClaims, + that are used by this container. + + + This is an alpha field and requires enabling the + DynamicResourceAllocation feature gate. + + + This field is immutable. It can only be set for containers. + items: + description: ResourceClaim references + one entry in PodSpec.ResourceClaims. + properties: + name: + description: |- + Name must match the name of one entry in pod.spec.resourceClaims of + the Pod where this field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Limits describes the maximum amount of compute resources allowed. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Requests describes the minimum amount of compute resources required. + If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. Requests cannot exceed Limits. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + type: object + selector: + description: selector is a label query over + volumes to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: |- + storageClassName is the name of the StorageClass required by the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 + type: string + volumeMode: + description: |- + volumeMode defines what type of volume is required by the claim. + Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that + is attached to a kubelet's host machine and then exposed + to the pod. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: |- + wwids Optional: FC volume world wide identifiers (wwids) + Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + items: + type: string + type: array + type: object + flexVolume: + description: |- + flexVolume represents a generic volume resource that is + provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use + for this volume. + type: string + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds + extra command options if any.' + type: object + readOnly: + description: |- + readOnly is Optional: defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef is Optional: secretRef is reference to the secret object containing + sensitive information to pass to the plugin scripts. This may be + empty if no secret object is specified. If the secret object + contains more than one secret, all secrets are passed to the plugin + scripts. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached + to a kubelet's host machine. This depends on the Flocker + control service being running + properties: + datasetName: + description: |- + datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker + should be considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. + This is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: |- + gcePersistentDisk represents a GCE Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + properties: + fsType: + description: |- + fsType is filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + format: int32 + type: integer + pdName: + description: |- + pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: boolean + required: + - pdName + type: object + gitRepo: + description: |- + gitRepo represents a git repository at a particular revision. + DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + into the Pod's container. + properties: + directory: + description: |- + directory is the target directory name. + Must not contain or start with '..'. If '.' is supplied, the volume directory will be the + git repository. Otherwise, if specified, the volume will contain the git repository in + the subdirectory with the given name. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: |- + glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/glusterfs/README.md + properties: + endpoints: + description: |- + endpoints is the endpoint name that details Glusterfs topology. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + path: + description: |- + path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + readOnly: + description: |- + readOnly here will force the Glusterfs volume to be mounted with read-only permissions. + Defaults to false. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: |- + hostPath represents a pre-existing file or directory on the host + machine that is directly exposed to the container. This is generally + used for system agents or other privileged things that are allowed + to see the host machine. Most containers will NOT need this. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + --- + TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not + mount host directories as read/write. + properties: + path: + description: |- + path of the directory on the host. + If the path is a symlink, it will follow the link to the real path. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + type: + description: |- + type for HostPath Volume + Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + required: + - path + type: object + iscsi: + description: |- + iscsi represents an ISCSI Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://examples.k8s.io/volumes/iscsi/README.md + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support + iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support + iSCSI Session CHAP authentication + type: boolean + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + initiatorName: + description: |- + initiatorName is the custom iSCSI Initiator Name. + If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface + : will be created for the connection. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: |- + iscsiInterface is the interface Name that uses an iSCSI transport. + Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: |- + portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI + target and initiator authentication + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: |- + targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: |- + name of the volume. + Must be a DNS_LABEL and unique within the pod. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + nfs: + description: |- + nfs represents an NFS mount on the host that shares a pod's lifetime + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + properties: + path: + description: |- + path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + readOnly: + description: |- + readOnly here will force the NFS export to be mounted with read-only permissions. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: boolean + server: + description: |- + server is the hostname or IP address of the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: |- + persistentVolumeClaimVolumeSource represents a reference to a + PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + properties: + claimName: + description: |- + claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + type: string + readOnly: + description: |- + readOnly Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host + machine + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume + attached and mounted on kubelets host machine + properties: + fsType: + description: |- + fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx + volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: |- + defaultMode are the mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along + with other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path + within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the + ConfigMap or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the + downwardAPI data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema + the FieldPath is written in terms + of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to + select in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the + relative path name of the file to + be created. Must not be absolute or + contain the ''..'' path. Must be utf-8 + encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required + for volumes, optional for env + vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output + format of the exposed resources, + defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource + to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path + within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional field specify whether + the Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information + about the serviceAccountToken data to project + properties: + audience: + description: |- + audience is the intended audience of the token. A recipient of a token + must identify itself with an identifier specified in the audience of the + token, and otherwise should reject the token. The audience defaults to the + identifier of the apiserver. + type: string + expirationSeconds: + description: |- + expirationSeconds is the requested duration of validity of the service + account token. As the token approaches expiration, the kubelet volume + plugin will proactively rotate the service account token. The kubelet will + start trying to rotate the token if the token is older than 80 percent of + its time to live or if the token is older than 24 hours.Defaults to 1 hour + and must be at least 10 minutes. + format: int64 + type: integer + path: + description: |- + path is the path relative to the mount point of the file to project the + token into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: |- + group to map volume access to + Default is no group + type: string + readOnly: + description: |- + readOnly here will force the Quobyte volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + registry: + description: |- + registry represents a single or multiple Quobyte Registry services + specified as a string as host:port pair (multiple entries are separated with commas) + which acts as the central registry for volumes + type: string + tenant: + description: |- + tenant owning the given Quobyte volume in the Backend + Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: |- + user to map volume access to + Defaults to serivceaccount user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: |- + rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/rbd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + image: + description: |- + image is the rados image name. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + keyring: + description: |- + keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + monitors: + description: |- + monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + items: + type: string + type: array + pool: + description: |- + pool is the rados pool name. + Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: boolean + secretRef: + description: |- + secretRef is name of the authentication secret for RBDUser. If provided + overrides keyring. + Default is nil. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is the rados user name. + Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". + Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef references to the secret for ScaleIO user and other + sensitive information. If this is not provided, Login operation will fail. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: |- + storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool + associated with the protection domain. + type: string + system: + description: system is the name of the storage system + as configured in ScaleIO. + type: string + volumeName: + description: |- + volumeName is the name of a volume already created in the ScaleIO system + that is associated with this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: |- + secret represents a secret that should populate this volume. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + properties: + defaultMode: + description: |- + defaultMode is Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values + for mode bits. Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items If unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a + volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret + or its keys must be defined + type: boolean + secretName: + description: |- + secretName is the name of the secret in the pod's namespace to use. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef specifies the secret to use for obtaining the StorageOS API + credentials. If not specified, default values will be attempted. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: |- + volumeName is the human-readable name of the StorageOS volume. Volume + names are only unique within a namespace. + type: string + volumeNamespace: + description: |- + volumeNamespace specifies the scope of the volume within StorageOS. If no + namespace is specified then the Pod's namespace will be used. This allows the + Kubernetes name scoping to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default behaviour. + Set to "default" if you are not using namespaces within StorageOS. + Namespaces that do not pre-exist within StorageOS will be created. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy + Based Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies + vSphere volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + workingDir: + default: /home/sealos/project + type: string + required: + - image + type: object + description: + type: string + version: + type: string + required: + - classRef + - config + - version + type: object + status: + description: RuntimeStatus defines the observed state of Runtime + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/controllers/devbox/config/crd/kustomization.yaml b/controllers/devbox/config/crd/kustomization.yaml new file mode 100644 index 00000000000..455200e6d9e --- /dev/null +++ b/controllers/devbox/config/crd/kustomization.yaml @@ -0,0 +1,44 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +- bases/devbox.sealos.io_devboxes.yaml +- bases/devbox.sealos.io_runtimes.yaml +- bases/devbox.sealos.io_runtimeclasses.yaml +- bases/devbox.sealos.io_devboxreleases.yaml +- bases/devbox.sealos.io_operationrequests.yaml +# +kubebuilder:scaffold:crdkustomizeresource + +patches: +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. +# patches here are for enabling the conversion webhook for each CRD +# +kubebuilder:scaffold:crdkustomizewebhookpatch + +# [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. +# patches here are for enabling the CA injection for each CRD +#- path: patches/cainjection_in_devboxes.yaml +#- path: patches/cainjection_in_runtimes.yaml +#- path: patches/cainjection_in_runtimeclasses.yaml +#- path: patches/cainjection_in_devboxreleases.yaml +#- path: patches/cainjection_in_operationrequests.yaml +# +kubebuilder:scaffold:crdkustomizecainjectionpatch + +# [WEBHOOK] To enable webhook, uncomment the following section +# the following config is for teaching kustomize how to do kustomization for CRDs. + +#configurations: +#- kustomizeconfig.yaml diff --git a/controllers/devbox/config/crd/kustomizeconfig.yaml b/controllers/devbox/config/crd/kustomizeconfig.yaml new file mode 100644 index 00000000000..e195b967706 --- /dev/null +++ b/controllers/devbox/config/crd/kustomizeconfig.yaml @@ -0,0 +1,33 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is for teaching kustomize how to substitute name and namespace reference in CRD +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: CustomResourceDefinition + version: v1 + group: apiextensions.k8s.io + path: spec/conversion/webhook/clientConfig/service/name + +namespace: +- kind: CustomResourceDefinition + version: v1 + group: apiextensions.k8s.io + path: spec/conversion/webhook/clientConfig/service/namespace + create: false + +varReference: +- path: metadata/annotations diff --git a/controllers/devbox/config/default/kustomization.yaml b/controllers/devbox/config/default/kustomization.yaml new file mode 100644 index 00000000000..74beeea21cb --- /dev/null +++ b/controllers/devbox/config/default/kustomization.yaml @@ -0,0 +1,160 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Adds namespace to all resources. +namespace: devbox-system + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: devbox- + +# Labels to add to all resources and selectors. +#labels: +#- includeSelectors: true +# pairs: +# someName: someValue + +resources: +- ../crd +- ../rbac +- ../manager +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- ../webhook +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. +#- ../certmanager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../prometheus +# [METRICS] Expose the controller manager metrics service. +- metrics_service.yaml + +# Uncomment the patches line if you enable Metrics, and/or are using webhooks and cert-manager +patches: +# [METRICS] The following patch will enable the metrics endpoint using HTTPS and the port :8443. +# More info: https://book.kubebuilder.io/reference/metrics +- path: manager_metrics_patch.yaml + target: + kind: Deployment + +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- path: manager_webhook_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. +# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. +# 'CERTMANAGER' needs to be enabled to use ca injection +#- path: webhookcainjection_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. +# Uncomment the following replacements to add the cert-manager CA injection annotations +#replacements: +# - source: # Add cert-manager annotation to ValidatingWebhookConfiguration, MutatingWebhookConfiguration and CRDs +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.namespace # namespace of the certificate CR +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - source: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.name +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - source: # Add cert-manager annotation to the webhook Service +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.name # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 0 +# create: true +# - source: +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.namespace # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 1 +# create: true diff --git a/controllers/devbox/config/default/manager_metrics_patch.yaml b/controllers/devbox/config/default/manager_metrics_patch.yaml new file mode 100644 index 00000000000..da271fd8278 --- /dev/null +++ b/controllers/devbox/config/default/manager_metrics_patch.yaml @@ -0,0 +1,18 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This patch adds the args to allow exposing the metrics endpoint using HTTPS +- op: add + path: /spec/template/spec/containers/0/args/0 + value: --metrics-bind-address=:8443 diff --git a/controllers/devbox/config/default/metrics_service.yaml b/controllers/devbox/config/default/metrics_service.yaml new file mode 100644 index 00000000000..6c910f34918 --- /dev/null +++ b/controllers/devbox/config/default/metrics_service.yaml @@ -0,0 +1,31 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: 8443 + selector: + control-plane: controller-manager diff --git a/controllers/devbox/config/manager/kustomization.yaml b/controllers/devbox/config/manager/kustomization.yaml new file mode 100644 index 00000000000..79a3fdde809 --- /dev/null +++ b/controllers/devbox/config/manager/kustomization.yaml @@ -0,0 +1,22 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +resources: +- manager.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +images: +- name: controller + newName: ghcr.io/labring/sealos-devbox-controller + newTag: latest diff --git a/controllers/devbox/config/manager/manager.yaml b/controllers/devbox/config/manager/manager.yaml new file mode 100644 index 00000000000..940f2fc9b99 --- /dev/null +++ b/controllers/devbox/config/manager/manager.yaml @@ -0,0 +1,113 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + # TODO(user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + securityContext: + runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:8081 + - --registry-addr={{ .registryAddr }} + - --registry-user={{ .registryUser }} + - --registry-password={{ .registryPassword }} + - --auth-addr={{ .authAddr }} + image: controller:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 diff --git a/controllers/devbox/config/prometheus/kustomization.yaml b/controllers/devbox/config/prometheus/kustomization.yaml new file mode 100644 index 00000000000..74aef8ef605 --- /dev/null +++ b/controllers/devbox/config/prometheus/kustomization.yaml @@ -0,0 +1,16 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +resources: +- monitor.yaml diff --git a/controllers/devbox/config/prometheus/monitor.yaml b/controllers/devbox/config/prometheus/monitor.yaml new file mode 100644 index 00000000000..dce5e0b845e --- /dev/null +++ b/controllers/devbox/config/prometheus/monitor.yaml @@ -0,0 +1,44 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https # Ensure this is the name of the port that exposes HTTPS metrics + scheme: https + bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + tlsConfig: + # TODO(user): The option insecureSkipVerify: true is not recommended for production since it disables + # certificate verification. This poses a significant security risk by making the system vulnerable to + # man-in-the-middle attacks, where an attacker could intercept and manipulate the communication between + # Prometheus and the monitored services. This could lead to unauthorized access to sensitive metrics data, + # compromising the integrity and confidentiality of the information. + # Please use the following options for secure configurations: + # caFile: /etc/metrics-certs/ca.crt + # certFile: /etc/metrics-certs/tls.crt + # keyFile: /etc/metrics-certs/tls.key + insecureSkipVerify: true + selector: + matchLabels: + control-plane: controller-manager diff --git a/controllers/devbox/config/rbac/devbox_editor_role.yaml b/controllers/devbox/config/rbac/devbox_editor_role.yaml new file mode 100644 index 00000000000..8aa28444a11 --- /dev/null +++ b/controllers/devbox/config/rbac/devbox_editor_role.yaml @@ -0,0 +1,41 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to edit devboxes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devbox-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/devbox_viewer_role.yaml b/controllers/devbox/config/rbac/devbox_viewer_role.yaml new file mode 100644 index 00000000000..bcd6d67106f --- /dev/null +++ b/controllers/devbox/config/rbac/devbox_viewer_role.yaml @@ -0,0 +1,37 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to view devboxes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devbox-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/devboxrelease_editor_role.yaml b/controllers/devbox/config/rbac/devboxrelease_editor_role.yaml new file mode 100644 index 00000000000..413902bb14f --- /dev/null +++ b/controllers/devbox/config/rbac/devboxrelease_editor_role.yaml @@ -0,0 +1,41 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to edit devboxreleases. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devboxrelease-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/devboxrelease_viewer_role.yaml b/controllers/devbox/config/rbac/devboxrelease_viewer_role.yaml new file mode 100644 index 00000000000..5820092d6c7 --- /dev/null +++ b/controllers/devbox/config/rbac/devboxrelease_viewer_role.yaml @@ -0,0 +1,37 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to view devboxreleases. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devboxrelease-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/kustomization.yaml b/controllers/devbox/config/rbac/kustomization.yaml new file mode 100644 index 00000000000..f7feaa591dc --- /dev/null +++ b/controllers/devbox/config/rbac/kustomization.yaml @@ -0,0 +1,49 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +resources: +# All RBAC will be applied under this service account in +# the deployment namespace. You may comment out this resource +# if your manager will use a service account that exists at +# runtime. Be sure to update RoleBinding and ClusterRoleBinding +# subjects if changing service account names. +- service_account.yaml +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# The following RBAC configurations are used to protect +# the metrics endpoint with authn/authz. These configurations +# ensure that only authorized users and service accounts +# can access the metrics endpoint. Comment the following +# permissions if you want to disable this protection. +# More info: https://book.kubebuilder.io/reference/metrics.html +- metrics_auth_role.yaml +- metrics_auth_role_binding.yaml +- metrics_reader_role.yaml +# For each CRD, "Editor" and "Viewer" roles are scaffolded by +# default, aiding admins in cluster management. Those roles are +# not used by the Project itself. You can comment the following lines +# if you do not want those helpers be installed with your Project. +- operationrequest_editor_role.yaml +- operationrequest_viewer_role.yaml +- devboxrelease_editor_role.yaml +- devboxrelease_viewer_role.yaml +- runtimeclass_editor_role.yaml +- runtimeclass_viewer_role.yaml +- runtime_editor_role.yaml +- runtime_viewer_role.yaml +- devbox_editor_role.yaml +- devbox_viewer_role.yaml + diff --git a/controllers/devbox/config/rbac/leader_election_role.yaml b/controllers/devbox/config/rbac/leader_election_role.yaml new file mode 100644 index 00000000000..6e1c5358e47 --- /dev/null +++ b/controllers/devbox/config/rbac/leader_election_role.yaml @@ -0,0 +1,54 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/controllers/devbox/config/rbac/leader_election_role_binding.yaml b/controllers/devbox/config/rbac/leader_election_role_binding.yaml new file mode 100644 index 00000000000..92a02f3146e --- /dev/null +++ b/controllers/devbox/config/rbac/leader_election_role_binding.yaml @@ -0,0 +1,29 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/controllers/devbox/config/rbac/metrics_auth_role.yaml b/controllers/devbox/config/rbac/metrics_auth_role.yaml new file mode 100644 index 00000000000..180c7ab6590 --- /dev/null +++ b/controllers/devbox/config/rbac/metrics_auth_role.yaml @@ -0,0 +1,31 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: metrics-auth-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create diff --git a/controllers/devbox/config/rbac/metrics_auth_role_binding.yaml b/controllers/devbox/config/rbac/metrics_auth_role_binding.yaml new file mode 100644 index 00000000000..fcf657e44f1 --- /dev/null +++ b/controllers/devbox/config/rbac/metrics_auth_role_binding.yaml @@ -0,0 +1,26 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: metrics-auth-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: metrics-auth-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/controllers/devbox/config/rbac/metrics_reader_role.yaml b/controllers/devbox/config/rbac/metrics_reader_role.yaml new file mode 100644 index 00000000000..8bf0224c770 --- /dev/null +++ b/controllers/devbox/config/rbac/metrics_reader_role.yaml @@ -0,0 +1,23 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: metrics-reader +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get diff --git a/controllers/devbox/config/rbac/operationrequest_editor_role.yaml b/controllers/devbox/config/rbac/operationrequest_editor_role.yaml new file mode 100644 index 00000000000..eacf84b90c7 --- /dev/null +++ b/controllers/devbox/config/rbac/operationrequest_editor_role.yaml @@ -0,0 +1,41 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to edit operationrequests. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: operationrequest-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/operationrequest_viewer_role.yaml b/controllers/devbox/config/rbac/operationrequest_viewer_role.yaml new file mode 100644 index 00000000000..39f6e842af5 --- /dev/null +++ b/controllers/devbox/config/rbac/operationrequest_viewer_role.yaml @@ -0,0 +1,37 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to view operationrequests. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: operationrequest-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/role.yaml b/controllers/devbox/config/rbac/role.yaml new file mode 100644 index 00000000000..c7916fa8cbd --- /dev/null +++ b/controllers/devbox/config/rbac/role.yaml @@ -0,0 +1,128 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: manager-role +rules: +- apiGroups: + - "" + resources: + - events + verbs: + - '*' +- apiGroups: + - "" + resources: + - pods + verbs: + - '*' +- apiGroups: + - "" + resources: + - pods/status + verbs: + - get + - patch + - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - '*' +- apiGroups: + - "" + resources: + - services + verbs: + - '*' +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/finalizers + verbs: + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get + - patch + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/finalizers + verbs: + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get + - patch + - update +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch diff --git a/controllers/devbox/config/rbac/role_binding.yaml b/controllers/devbox/config/rbac/role_binding.yaml new file mode 100644 index 00000000000..ce24d3bb832 --- /dev/null +++ b/controllers/devbox/config/rbac/role_binding.yaml @@ -0,0 +1,29 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/controllers/devbox/config/rbac/runtime_editor_role.yaml b/controllers/devbox/config/rbac/runtime_editor_role.yaml new file mode 100644 index 00000000000..e3645875342 --- /dev/null +++ b/controllers/devbox/config/rbac/runtime_editor_role.yaml @@ -0,0 +1,41 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to edit runtimes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: runtime-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/runtime_viewer_role.yaml b/controllers/devbox/config/rbac/runtime_viewer_role.yaml new file mode 100644 index 00000000000..464ff30775f --- /dev/null +++ b/controllers/devbox/config/rbac/runtime_viewer_role.yaml @@ -0,0 +1,37 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to view runtimes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: runtime-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/runtimeclass_editor_role.yaml b/controllers/devbox/config/rbac/runtimeclass_editor_role.yaml new file mode 100644 index 00000000000..9483f0bd01a --- /dev/null +++ b/controllers/devbox/config/rbac/runtimeclass_editor_role.yaml @@ -0,0 +1,41 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to edit runtimeclasses. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: runtimeclass-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/runtimeclass_viewer_role.yaml b/controllers/devbox/config/rbac/runtimeclass_viewer_role.yaml new file mode 100644 index 00000000000..97ba3a15d8f --- /dev/null +++ b/controllers/devbox/config/rbac/runtimeclass_viewer_role.yaml @@ -0,0 +1,37 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# permissions for end users to view runtimeclasses. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: runtimeclass-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses/status + verbs: + - get diff --git a/controllers/devbox/config/rbac/service_account.yaml b/controllers/devbox/config/rbac/service_account.yaml new file mode 100644 index 00000000000..722be3f6d2d --- /dev/null +++ b/controllers/devbox/config/rbac/service_account.yaml @@ -0,0 +1,22 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: controller-manager + namespace: system diff --git a/controllers/devbox/config/samples/devbox_v1alpha1_devbox.yaml b/controllers/devbox/config/samples/devbox_v1alpha1_devbox.yaml new file mode 100644 index 00000000000..b0b194ef79c --- /dev/null +++ b/controllers/devbox/config/samples/devbox_v1alpha1_devbox.yaml @@ -0,0 +1,36 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: Devbox +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devbox-sample +spec: + state: Running + resource: + cpu: 2 + memory: 4000Mi + runtimeRef: + name: go-1-22-5 + namespace: devbox-system + network: + type: NodePort + extraPorts: + - containerPort: 443 + name: 'https' + - containerPort: 80 + name: 'http' \ No newline at end of file diff --git a/controllers/devbox/config/samples/devbox_v1alpha1_devboxrelease.yaml b/controllers/devbox/config/samples/devbox_v1alpha1_devboxrelease.yaml new file mode 100644 index 00000000000..15afbb39bff --- /dev/null +++ b/controllers/devbox/config/samples/devbox_v1alpha1_devboxrelease.yaml @@ -0,0 +1,24 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: DevBoxRelease +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devboxrelease-sample +spec: + devboxName: devbox-sample + newTag: v1.0.0 diff --git a/controllers/devbox/config/samples/devbox_v1alpha1_operationrequest.yaml b/controllers/devbox/config/samples/devbox_v1alpha1_operationrequest.yaml new file mode 100644 index 00000000000..dd73c69f5aa --- /dev/null +++ b/controllers/devbox/config/samples/devbox_v1alpha1_operationrequest.yaml @@ -0,0 +1,23 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: OperationRequest +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: operationrequest-sample +spec: + # TODO(user): Add fields here diff --git a/controllers/devbox/config/samples/devbox_v1alpha1_runtime.yaml b/controllers/devbox/config/samples/devbox_v1alpha1_runtime.yaml new file mode 100644 index 00000000000..1b34a17b207 --- /dev/null +++ b/controllers/devbox/config/samples/devbox_v1alpha1_runtime.yaml @@ -0,0 +1,81 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: Runtime +metadata: + name: go-1-22-5 + namespace: devbox-system +spec: + classRef: go + title: go1.22.5 + description: go1.22.5 + config: + image: ghcr.io/cbluebird/devbox/go1.22.5:2f4067 + workingDir: /home/sealos/project + releaseCommand: + - /bin/bash + - -c + releaseArgs: + - /home/sealos/project/entrypoint.sh + category: + - ubuntu + - go +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: Runtime +metadata: + name: go-1-23-0 + namespace: devbox-system +spec: + classRef: go + title: go1.23.0 + description: go1.23.0 + config: + image: ghcr.io/cbluebird/devbox/go1.23.0:2f4067 + category: + - ubuntu + - go +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: Runtime +metadata: + name: gin + namespace: devbox-system +spec: + classRef: gin + title: gin + description: gin + config: + image: ghcr.io/cbluebird/devbox/gin:2f4067 + category: + - ubuntu + - go + - gin +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: Runtime +metadata: + name: spring-boot + namespace: devbox-system +spec: + classRef: spring-boot + title: Spring Boot + description: Spring Boot + config: + image: ghcr.io/cbluebird/devbox/spring-boot:2f4067 + category: + - ubuntu + - java + - spring-boot diff --git a/controllers/devbox/config/samples/devbox_v1alpha1_runtimeclass.yaml b/controllers/devbox/config/samples/devbox_v1alpha1_runtimeclass.yaml new file mode 100644 index 00000000000..3886893f263 --- /dev/null +++ b/controllers/devbox/config/samples/devbox_v1alpha1_runtimeclass.yaml @@ -0,0 +1,73 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: go + namespace: devbox-system +spec: + kind: Language + title: go + description: go +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: gin + namespace: devbox-system +spec: + kind: Framework + title: gin + description: gin +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: java + namespace: devbox-system +spec: + kind: Language + title: java + description: java +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: spring-boot + namespace: devbox-system +spec: + kind: Framework + title: Spring Boot + description: Spring Boot +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: python + namespace: devbox-system +spec: + kind: Language + title: python + description: python +--- +apiVersion: devbox.sealos.io/v1alpha1 +kind: RuntimeClass +metadata: + name: nodejs + namespace: devbox-system +spec: + kind: Language + title: node.js + description: node.js \ No newline at end of file diff --git a/controllers/devbox/config/samples/kustomization.yaml b/controllers/devbox/config/samples/kustomization.yaml new file mode 100644 index 00000000000..2eac70ab48a --- /dev/null +++ b/controllers/devbox/config/samples/kustomization.yaml @@ -0,0 +1,22 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +## Append samples of your project ## +resources: +- devbox_v1alpha1_devbox.yaml +- devbox_v1alpha1_runtime.yaml +- devbox_v1alpha1_runtimeclass.yaml +- devbox_v1alpha1_devboxrelease.yaml +- devbox_v1alpha1_operationrequest.yaml +# +kubebuilder:scaffold:manifestskustomizesamples diff --git a/controllers/devbox/config/samples/test/devbox_v1alpha1_devbox.yaml b/controllers/devbox/config/samples/test/devbox_v1alpha1_devbox.yaml new file mode 100644 index 00000000000..e5de2960de6 --- /dev/null +++ b/controllers/devbox/config/samples/test/devbox_v1alpha1_devbox.yaml @@ -0,0 +1,44 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: Devbox +metadata: + labels: + app.kubernetes.io/name: devbox + app.kubernetes.io/managed-by: kustomize + name: devbox-sample +spec: + state: Running + resource: + cpu: 1000m + memory: 1024Mi + runtimeRef: + name: go-1-22-5 + namespace: devbox-system + command: + - /bin/bash + args: + - -c + - | + apt-get update + apt-get install -y tini + tini -- /bin/bash -c "echo 'DevBox is ready for testing'; tail -f /dev/null" + network: + type: NodePort + extraPorts: + - containerPort: 443 + name: 'https' + - containerPort: 80 + name: 'http' diff --git a/controllers/devbox/config/samples/test/devbox_v1alpha1_runtime.yaml b/controllers/devbox/config/samples/test/devbox_v1alpha1_runtime.yaml new file mode 100644 index 00000000000..fa3775f1637 --- /dev/null +++ b/controllers/devbox/config/samples/test/devbox_v1alpha1_runtime.yaml @@ -0,0 +1,34 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: devbox.sealos.io/v1alpha1 +kind: Runtime +metadata: + name: go-1-22-5 + namespace: devbox-system +spec: + classRef: go + version: go1.22.5 + description: go1.22.5 + config: + image: ubuntu + workingDir: /home/sealos/project + releaseCommand: + - /bin/bash + - -c + releaseArgs: + - /home/sealos/project/entrypoint.sh + category: + - ubuntu + - go diff --git a/controllers/devbox/deploy/Kubefile b/controllers/devbox/deploy/Kubefile new file mode 100644 index 00000000000..d39f86ee1b9 --- /dev/null +++ b/controllers/devbox/deploy/Kubefile @@ -0,0 +1,13 @@ +FROM scratch + +USER 65532:65532 + +COPY registry registry +COPY manifests manifests + +ENV registryAddr="sealos.hub:5000" +ENV registryUser=admin +ENV registryPassword=passw0rd +ENV authAddr="sealos.hub:5000" + +CMD ["kubectl apply -f manifests"] diff --git a/controllers/devbox/deploy/manifests/deploy.yaml.tmpl b/controllers/devbox/deploy/manifests/deploy.yaml.tmpl new file mode 100644 index 00000000000..b9845b8fe92 --- /dev/null +++ b/controllers/devbox/deploy/manifests/deploy.yaml.tmpl @@ -0,0 +1,5523 @@ +# Copyright © 2024 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + control-plane: controller-manager + name: devbox-system +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: devboxes.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: Devbox + listKind: DevboxList + plural: devboxes + singular: devbox + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.state + name: State + type: string + - jsonPath: .spec.runtimeRef.name + name: RuntimeRef + type: string + - jsonPath: .status.podPhase + name: PodPhase + type: string + - jsonPath: .status.network.type + name: NetworkType + type: string + - jsonPath: .status.network.nodePort + name: NodePort + type: integer + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Devbox is the Schema for the devboxes API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: DevboxSpec defines the desired state of Devbox + properties: + affinity: + description: Affinity is a group of affinity scheduling rules. + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node matches the corresponding matchExpressions; the + node(s) with the highest sum are the most preferred. + items: + description: |- + An empty preferred scheduling term matches all objects with implicit weight 0 + (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an update), the system + may or may not try to eventually evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: |- + A null or empty node selector term matches no objects. The requirements of + them are ANDed. + The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: |- + A node selector requirement is a selector that contains values, a key, and an operator + that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: |- + Represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: |- + An array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. If the operator is Gt or Lt, the values + array must have a single element, which will be interpreted as an integer. + This array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: |- + weight associated with matching the corresponding podAffinityTerm, + in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod label update), the + system may or may not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes corresponding to each + podAffinityTerm are intersected, i.e. all terms must be satisfied. + items: + description: |- + Defines a set of pods (namely those matching the labelSelector + relative to the given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node whose value of + the label with key matches that of any node on which + a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: |- + The scheduler will prefer to schedule pods to nodes that satisfy + the anti-affinity expressions specified by this field, but it may choose + a node that violates one or more of the expressions. The node that is + most preferred is the one with the greatest sum of weights, i.e. + for each node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity expressions, etc.), + compute a sum by iterating through the elements of this field and adding + "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: |- + weight associated with matching the corresponding podAffinityTerm, + in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: |- + If the anti-affinity requirements specified by this field are not met at + scheduling time, the pod will not be scheduled onto the node. + If the anti-affinity requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a pod label update), the + system may or may not try to eventually evict the pod from its node. + When there are multiple elements, the lists of nodes corresponding to each + podAffinityTerm are intersected, i.e. all terms must be satisfied. + items: + description: |- + Defines a set of pods (namely those matching the labelSelector + relative to the given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) with, + where co-located is defined as running on a node whose value of + the label with key matches that of any node on which + a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: |- + A label query over the set of namespaces that the term applies to. + The term is applied to the union of the namespaces selected by this field + and the ones listed in the namespaces field. + null selector and null or empty namespaces list means "this pod's namespace". + An empty selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: |- + namespaces specifies a static list of namespace names that the term applies to. + The term is applied to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: |- + This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where co-located is defined as running on a node + whose value of the label with key topologyKey matches that of any node on which any of the + selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + args: + items: + type: string + type: array + command: + items: + type: string + type: array + extraAnnotations: + additionalProperties: + type: string + type: object + extraEnvs: + description: todo add rewrite env... + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: |- + Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in the container and + any service environment variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. Double $$ are reduced + to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + Escaped references will never be expanded, regardless of whether the variable + exists or not. + Defaults to "". + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: |- + Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['']`, `metadata.annotations['']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + extraLabels: + additionalProperties: + type: string + description: todo add rewrite labels and annotations... + type: object + extraVolumeMounts: + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: |- + Path within the container at which the volume should be mounted. Must + not contain ':'. + type: string + mountPropagation: + description: |- + mountPropagation determines how mounts are propagated from the host + to container and the other way around. + When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: |- + Mounted read-only if true, read-write otherwise (false or unspecified). + Defaults to false. + type: boolean + subPath: + description: |- + Path within the volume from which the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: |- + Expanded path within the volume from which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). + SubPathExpr and SubPath are mutually exclusive. + type: string + required: + - mountPath + - name + type: object + type: array + extraVolumes: + description: todo add rewrite volumes and volume mounts.. + items: + description: Volume represents a named volume in a pod that may + be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: |- + awsElasticBlockStore represents an AWS Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + format: int32 + type: integer + readOnly: + description: |- + readOnly value true will force the readOnly setting in VolumeMounts. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: boolean + volumeID: + description: |- + volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount on + the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: None, + Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in the + blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the blob + storage + type: string + fsType: + description: |- + fsType is Filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service mount + on the host and bind mount to the pod. + properties: + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that contains + Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host that + shares a pod's lifetime + properties: + monitors: + description: |- + monitors is Required: Monitors is a collection of Ceph monitors + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: boolean + secretFile: + description: |- + secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + secretRef: + description: |- + secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is optional: User is the rados user name, default is admin + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + required: + - monitors + type: object + cinder: + description: |- + cinder represents a cinder volume attached and mounted on kubelets host machine. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: boolean + secretRef: + description: |- + secretRef is optional: points to a secret object containing parameters used to connect + to OpenStack. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: |- + volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should populate + this volume + properties: + defaultMode: + description: |- + defaultMode is optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap or its + keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents ephemeral + storage that is handled by certain external CSI drivers (Beta + feature). + properties: + driver: + description: |- + driver is the name of the CSI driver that handles this volume. + Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: |- + fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated CSI driver + which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: |- + nodePublishSecretRef is a reference to the secret object containing + sensitive information to pass to the CSI driver to complete the CSI + NodePublishVolume and NodeUnpublishVolume calls. + This field is optional, and may be empty if no secret is required. If the + secret object contains more than one secret, all secret references are passed. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: |- + readOnly specifies a read-only configuration for the volume. + Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: |- + volumeAttributes stores driver-specific properties that are passed to the CSI + driver. Consult your driver's documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the pod + that should populate this volume + properties: + defaultMode: + description: |- + Optional: mode bits to use on created files by default. Must be a + Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: Items is a list of downward API volume file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the pod: + only annotations, labels, name and namespace are + supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative path + name of the file to be created. Must not be absolute + or contain the ''..'' path. Must be utf-8 encoded. + The first item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: |- + emptyDir represents a temporary directory that shares a pod's lifetime. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + properties: + medium: + description: |- + medium represents what type of storage medium should back this directory. + The default is "" which means to use the node's default medium. + Must be an empty string (default) or Memory. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: |- + sizeLimit is the total amount of local storage required for this EmptyDir volume. + The size limit is also applicable for memory medium. + The maximum usage on memory medium EmptyDir would be the minimum value between + the SizeLimit specified here and the sum of memory limits of all containers in a pod. + The default is nil which means that the limit is undefined. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: |- + ephemeral represents a volume that is handled by a cluster storage driver. + The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, + and deleted when the pod is removed. + + + Use this if: + a) the volume is only needed while the pod runs, + b) features of normal volumes like restoring from snapshot or capacity + tracking are needed, + c) the storage driver is specified through a storage class, and + d) the storage driver supports dynamic volume provisioning through + a PersistentVolumeClaim (see EphemeralVolumeSource for more + information on the connection between this volume type + and PersistentVolumeClaim). + + + Use PersistentVolumeClaim or one of the vendor-specific + APIs for volumes that persist for longer than the lifecycle + of an individual pod. + + + Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to + be used that way - see the documentation of the driver for + more information. + + + A pod can use both types of ephemeral volumes and + persistent volumes at the same time. + properties: + volumeClaimTemplate: + description: |- + Will be used to create a stand-alone PVC to provision the volume. + The pod in which this EphemeralVolumeSource is embedded will be the + owner of the PVC, i.e. the PVC will be deleted together with the + pod. The name of the PVC will be `-` where + `` is the name from the `PodSpec.Volumes` array + entry. Pod validation will reject the pod if the concatenated name + is not valid for a PVC (for example, too long). + + + An existing PVC with that name that is not owned by the pod + will *not* be used for the pod to avoid using an unrelated + volume by mistake. Starting the pod is then blocked until + the unrelated PVC is removed. If such a pre-created PVC is + meant to be used by the pod, the PVC has to updated with an + owner reference to the pod once the pod exists. Normally + this should not be necessary, but it may be useful when + manually reconstructing a broken cluster. + + + This field is read-only and no changes will be made by Kubernetes + to the PVC after it has been created. + + + Required, must not be nil. + properties: + metadata: + description: |- + May contain labels and annotations that will be copied into the PVC + when creating it. No other fields are allowed and will be rejected during + validation. + type: object + spec: + description: |- + The specification for the PersistentVolumeClaim. The entire content is + copied unchanged into the PVC that gets created from this + template. The same fields as in a PersistentVolumeClaim + are also valid here. + properties: + accessModes: + description: |- + accessModes contains the desired access modes the volume should have. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 + items: + type: string + type: array + dataSource: + description: |- + dataSource field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) + If the provisioner or an external controller can support the specified data source, + it will create a new volume based on the contents of the specified data source. + When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, + and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. + If the namespace is specified, then dataSourceRef will not be copied to dataSource. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: |- + dataSourceRef specifies the object from which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty API group (non + core object) or a PersistentVolumeClaim object. + When this field is specified, volume binding will only succeed if the type of + the specified object matches some installed volume populator or dynamic + provisioner. + This field will replace the functionality of the dataSource field and as such + if both fields are non-empty, they must have the same value. For backwards + compatibility, when namespace isn't specified in dataSourceRef, + both fields (dataSource and dataSourceRef) will be set to the same + value automatically if one of them is empty and the other is non-empty. + When namespace is specified in dataSourceRef, + dataSource isn't set to the same value and must be empty. + There are three important differences between dataSource and dataSourceRef: + * While dataSource only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim objects. + * While dataSource ignores disallowed values (dropping them), dataSourceRef + preserves all values, and generates an error if a disallowed value is + specified. + * While dataSource only allows local objects, dataSourceRef allows objects + in any namespaces. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. + (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + namespace: + description: |- + Namespace is the namespace of resource being referenced + Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. + (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: |- + resources represents the minimum resources the volume should have. + If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements + that are lower than previous value but must still be higher than capacity recorded in the + status field of the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + properties: + claims: + description: |- + Claims lists the names of resources, defined in spec.resourceClaims, + that are used by this container. + + + This is an alpha field and requires enabling the + DynamicResourceAllocation feature gate. + + + This field is immutable. It can only be set for containers. + items: + description: ResourceClaim references one + entry in PodSpec.ResourceClaims. + properties: + name: + description: |- + Name must match the name of one entry in pod.spec.resourceClaims of + the Pod where this field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Limits describes the maximum amount of compute resources allowed. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Requests describes the minimum amount of compute resources required. + If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. Requests cannot exceed Limits. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + type: object + selector: + description: selector is a label query over volumes + to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: |- + storageClassName is the name of the StorageClass required by the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 + type: string + volumeMode: + description: |- + volumeMode defines what type of volume is required by the claim. + Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that is + attached to a kubelet's host machine and then exposed to the + pod. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: |- + wwids Optional: FC volume world wide identifiers (wwids) + Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + items: + type: string + type: array + type: object + flexVolume: + description: |- + flexVolume represents a generic volume resource that is + provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use for + this volume. + type: string + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds extra + command options if any.' + type: object + readOnly: + description: |- + readOnly is Optional: defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef is Optional: secretRef is reference to the secret object containing + sensitive information to pass to the plugin scripts. This may be + empty if no secret object is specified. If the secret object + contains more than one secret, all secrets are passed to the plugin + scripts. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached to + a kubelet's host machine. This depends on the Flocker control + service being running + properties: + datasetName: + description: |- + datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker + should be considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. This + is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: |- + gcePersistentDisk represents a GCE Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + properties: + fsType: + description: |- + fsType is filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + format: int32 + type: integer + pdName: + description: |- + pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: boolean + required: + - pdName + type: object + gitRepo: + description: |- + gitRepo represents a git repository at a particular revision. + DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + into the Pod's container. + properties: + directory: + description: |- + directory is the target directory name. + Must not contain or start with '..'. If '.' is supplied, the volume directory will be the + git repository. Otherwise, if specified, the volume will contain the git repository in + the subdirectory with the given name. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: |- + glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/glusterfs/README.md + properties: + endpoints: + description: |- + endpoints is the endpoint name that details Glusterfs topology. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + path: + description: |- + path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + readOnly: + description: |- + readOnly here will force the Glusterfs volume to be mounted with read-only permissions. + Defaults to false. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: |- + hostPath represents a pre-existing file or directory on the host + machine that is directly exposed to the container. This is generally + used for system agents or other privileged things that are allowed + to see the host machine. Most containers will NOT need this. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + --- + TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not + mount host directories as read/write. + properties: + path: + description: |- + path of the directory on the host. + If the path is a symlink, it will follow the link to the real path. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + type: + description: |- + type for HostPath Volume + Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + required: + - path + type: object + iscsi: + description: |- + iscsi represents an ISCSI Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://examples.k8s.io/volumes/iscsi/README.md + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support iSCSI + Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support iSCSI + Session CHAP authentication + type: boolean + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + initiatorName: + description: |- + initiatorName is the custom iSCSI Initiator Name. + If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface + : will be created for the connection. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: |- + iscsiInterface is the interface Name that uses an iSCSI transport. + Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: |- + portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI target + and initiator authentication + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: |- + targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: |- + name of the volume. + Must be a DNS_LABEL and unique within the pod. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + nfs: + description: |- + nfs represents an NFS mount on the host that shares a pod's lifetime + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + properties: + path: + description: |- + path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + readOnly: + description: |- + readOnly here will force the NFS export to be mounted with read-only permissions. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: boolean + server: + description: |- + server is the hostname or IP address of the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: |- + persistentVolumeClaimVolumeSource represents a reference to a + PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + properties: + claimName: + description: |- + claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + type: string + readOnly: + description: |- + readOnly Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: |- + defaultMode are the mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along with + other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the downwardAPI + data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format + of the exposed resources, defaults + to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to + select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret data + to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional field specify whether the + Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information about + the serviceAccountToken data to project + properties: + audience: + description: |- + audience is the intended audience of the token. A recipient of a token + must identify itself with an identifier specified in the audience of the + token, and otherwise should reject the token. The audience defaults to the + identifier of the apiserver. + type: string + expirationSeconds: + description: |- + expirationSeconds is the requested duration of validity of the service + account token. As the token approaches expiration, the kubelet volume + plugin will proactively rotate the service account token. The kubelet will + start trying to rotate the token if the token is older than 80 percent of + its time to live or if the token is older than 24 hours.Defaults to 1 hour + and must be at least 10 minutes. + format: int64 + type: integer + path: + description: |- + path is the path relative to the mount point of the file to project the + token into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: |- + group to map volume access to + Default is no group + type: string + readOnly: + description: |- + readOnly here will force the Quobyte volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + registry: + description: |- + registry represents a single or multiple Quobyte Registry services + specified as a string as host:port pair (multiple entries are separated with commas) + which acts as the central registry for volumes + type: string + tenant: + description: |- + tenant owning the given Quobyte volume in the Backend + Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: |- + user to map volume access to + Defaults to serivceaccount user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: |- + rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/rbd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + image: + description: |- + image is the rados image name. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + keyring: + description: |- + keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + monitors: + description: |- + monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + items: + type: string + type: array + pool: + description: |- + pool is the rados pool name. + Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: boolean + secretRef: + description: |- + secretRef is name of the authentication secret for RBDUser. If provided + overrides keyring. + Default is nil. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is the rados user name. + Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". + Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef references to the secret for ScaleIO user and other + sensitive information. If this is not provided, Login operation will fail. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: |- + storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool associated + with the protection domain. + type: string + system: + description: system is the name of the storage system as + configured in ScaleIO. + type: string + volumeName: + description: |- + volumeName is the name of a volume already created in the ScaleIO system + that is associated with this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: |- + secret represents a secret that should populate this volume. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + properties: + defaultMode: + description: |- + defaultMode is Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values + for mode bits. Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items If unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret or + its keys must be defined + type: boolean + secretName: + description: |- + secretName is the name of the secret in the pod's namespace to use. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef specifies the secret to use for obtaining the StorageOS API + credentials. If not specified, default values will be attempted. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: |- + volumeName is the human-readable name of the StorageOS volume. Volume + names are only unique within a namespace. + type: string + volumeNamespace: + description: |- + volumeNamespace specifies the scope of the volume within StorageOS. If no + namespace is specified then the Pod's namespace will be used. This allows the + Kubernetes name scoping to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default behaviour. + Set to "default" if you are not using namespaces within StorageOS. + Namespaces that do not pre-exist within StorageOS will be created. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy Based + Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies vSphere + volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + network: + properties: + extraPorts: + items: + description: ContainerPort represents a network port in a single + container. + properties: + containerPort: + description: |- + Number of port to expose on the pod's IP address. + This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: |- + Number of port to expose on the host. + If specified, this must be a valid port number, 0 < x < 65536. + If HostNetwork is specified, this must match ContainerPort. + Most containers do not need this. + format: int32 + type: integer + name: + description: |- + If specified, this must be an IANA_SVC_NAME and unique within the pod. Each + named port in a pod must have a unique name. Name for the port that can be + referred to by services. + type: string + protocol: + default: TCP + description: |- + Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + type: + enum: + - NodePort + - Tailnet + type: string + required: + - type + type: object + resource: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + runtimeRef: + properties: + name: + type: string + namespace: + type: string + required: + - name + type: object + squash: + default: false + type: boolean + state: + enum: + - Running + - Stopped + type: string + tolerations: + items: + description: |- + The pod this Toleration is attached to tolerates any taint that matches + the triple using the matching operator . + properties: + effect: + description: |- + Effect indicates the taint effect to match. Empty means match all taint effects. + When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: |- + Key is the taint key that the toleration applies to. Empty means match all taint keys. + If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: |- + Operator represents a key's relationship to the value. + Valid operators are Exists and Equal. Defaults to Equal. + Exists is equivalent to wildcard for value, so that a pod can + tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: |- + TolerationSeconds represents the period of time the toleration (which must be + of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, + it is not set, which means tolerate the taint forever (do not evict). Zero and + negative values will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: |- + Value is the taint value the toleration matches to. + If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + type: object + type: array + workingDir: + type: string + required: + - resource + - runtimeRef + - state + type: object + status: + description: DevboxStatus defines the observed state of Devbox + properties: + commitHistory: + items: + properties: + containerID: + description: ContainerID is the container id + type: string + image: + description: Image is the image of the commit + type: string + node: + description: Node is the node name + type: string + pod: + description: Pod is the pod name + type: string + predicatedStatus: + description: predicatedStatus default `pending`, will be set + to `success` if pod status is running successfully. + type: string + status: + description: status will be set based on expectedStatus after + devbox pod delete or stop. if expectedStatus is still pending, + it means the pod is not running successfully, so we need to + set it to `failed` + type: string + time: + description: Time is the time when the commit is created + format: date-time + type: string + required: + - containerID + - image + - node + - pod + - predicatedStatus + - status + - time + type: object + type: array + lastTerminatedState: + description: ContainerStateTerminated is a terminated state of a container. + properties: + containerID: + description: Container's ID in the format '://' + type: string + exitCode: + description: Exit status from the last termination of the container + format: int32 + type: integer + finishedAt: + description: Time at which the container last terminated + format: date-time + type: string + message: + description: Message regarding the last termination of the container + type: string + reason: + description: (brief) reason from the last termination of the container + type: string + signal: + description: Signal from the last termination of the container + format: int32 + type: integer + startedAt: + description: Time at which previous execution of the container + started + format: date-time + type: string + required: + - exitCode + type: object + network: + properties: + nodePort: + format: int32 + type: integer + tailnet: + description: todo TailNet + type: string + type: + default: NodePort + enum: + - NodePort + - Tailnet + type: string + required: + - type + type: object + phase: + type: string + podPhase: + description: PodPhase is a label for the condition of a pod at the + current time. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: devboxreleases.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: DevBoxRelease + listKind: DevBoxReleaseList + plural: devboxreleases + singular: devboxrelease + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.devboxName + name: DevboxName + type: string + - jsonPath: .spec.newTag + name: NewTag + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .status.originalImage + name: OriginalImage + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: DevBoxRelease is the Schema for the devboxreleases API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: DevBoxReleaseSpec defines the desired state of DevBoxRelease + properties: + devboxName: + type: string + newTag: + type: string + notes: + type: string + required: + - devboxName + - newTag + type: object + status: + description: DevBoxReleaseStatus defines the observed state of DevBoxRelease + properties: + originalImage: + type: string + phase: + default: Pending + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: operationrequests.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: OperationRequest + listKind: OperationRequestList + plural: operationrequests + singular: operationrequest + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: OperationRequest is the Schema for the operationrequests API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: OperationRequestSpec defines the desired state of OperationRequest + type: object + status: + description: OperationRequestStatus defines the observed state of OperationRequest + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: runtimeclasses.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: RuntimeClass + listKind: RuntimeClassList + plural: runtimeclasses + singular: runtimeclass + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: RuntimeClass is the Schema for the runtimeclasses API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: RuntimeClassSpec defines the desired state of RuntimeClass + properties: + description: + type: string + kind: + enum: + - OS + - Language + - Framework + type: string + title: + type: string + required: + - kind + - title + type: object + status: + description: RuntimeClassStatus defines the observed state of RuntimeClass + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: runtimes.devbox.sealos.io +spec: + group: devbox.sealos.io + names: + kind: Runtime + listKind: RuntimeList + plural: runtimes + singular: runtime + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: Runtime is the Schema for the runtimes API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: RuntimeSpec defines the desired state of Runtime + properties: + category: + items: + type: string + type: array + classRef: + type: string + components: + items: + properties: + name: + type: string + version: + type: string + required: + - name + - version + type: object + type: array + config: + properties: + annotations: + additionalProperties: + type: string + type: object + args: + description: kubebuilder:validation:Optional + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: |- + Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in the container and + any service environment variables. If a variable cannot be resolved, + the reference in the input string will be unchanged. Double $$ are reduced + to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. + "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". + Escaped references will never be expanded, regardless of whether the variable + exists or not. + Defaults to "". + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: |- + Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['']`, `metadata.annotations['']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs. + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported. + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + type: string + labels: + additionalProperties: + type: string + type: object + ports: + default: + - containerPort: 22 + name: devbox-ssh-port + protocol: TCP + items: + description: ContainerPort represents a network port in a single + container. + properties: + containerPort: + description: |- + Number of port to expose on the pod's IP address. + This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: |- + Number of port to expose on the host. + If specified, this must be a valid port number, 0 < x < 65536. + If HostNetwork is specified, this must match ContainerPort. + Most containers do not need this. + format: int32 + type: integer + name: + description: |- + If specified, this must be an IANA_SVC_NAME and unique within the pod. Each + named port in a pod must have a unique name. Name for the port that can be + referred to by services. + type: string + protocol: + default: TCP + description: |- + Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + releaseArgs: + default: + - /home/sealos/project/entrypoint.sh + items: + type: string + type: array + releaseCommand: + default: + - /bin/bash + - -c + items: + type: string + type: array + user: + default: sealos + type: string + volumeMounts: + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: |- + Path within the container at which the volume should be mounted. Must + not contain ':'. + type: string + mountPropagation: + description: |- + mountPropagation determines how mounts are propagated from the host + to container and the other way around. + When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: |- + Mounted read-only if true, read-write otherwise (false or unspecified). + Defaults to false. + type: boolean + subPath: + description: |- + Path within the volume from which the container's volume should be mounted. + Defaults to "" (volume's root). + type: string + subPathExpr: + description: |- + Expanded path within the volume from which the container's volume should be mounted. + Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). + SubPathExpr and SubPath are mutually exclusive. + type: string + required: + - mountPath + - name + type: object + type: array + volumes: + items: + description: Volume represents a named volume in a pod that + may be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: |- + awsElasticBlockStore represents an AWS Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + format: int32 + type: integer + readOnly: + description: |- + readOnly value true will force the readOnly setting in VolumeMounts. + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: boolean + volumeID: + description: |- + volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). + More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount + on the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: + None, Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in + the blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the + blob storage + type: string + fsType: + description: |- + fsType is Filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single + blob disk per storage account Managed: azure managed + data disk (only in managed availability set). defaults + to shared' + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service + mount on the host and bind mount to the pod. + properties: + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that + contains Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host + that shares a pod's lifetime + properties: + monitors: + description: |- + monitors is Required: Monitors is a collection of Ceph monitors + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted + root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: boolean + secretFile: + description: |- + secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + secretRef: + description: |- + secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is optional: User is the rados user name, default is admin + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it + type: string + required: + - monitors + type: object + cinder: + description: |- + cinder represents a cinder volume attached and mounted on kubelets host machine. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: boolean + secretRef: + description: |- + secretRef is optional: points to a secret object containing parameters used to connect + to OpenStack. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: |- + volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should + populate this volume + properties: + defaultMode: + description: |- + defaultMode is optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a + volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents + ephemeral storage that is handled by certain external + CSI drivers (Beta feature). + properties: + driver: + description: |- + driver is the name of the CSI driver that handles this volume. + Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: |- + fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated CSI driver + which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: |- + nodePublishSecretRef is a reference to the secret object containing + sensitive information to pass to the CSI driver to complete the CSI + NodePublishVolume and NodeUnpublishVolume calls. + This field is optional, and may be empty if no secret is required. If the + secret object contains more than one secret, all secret references are passed. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: |- + readOnly specifies a read-only configuration for the volume. + Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: |- + volumeAttributes stores driver-specific properties that are passed to the CSI + driver. Consult your driver's documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the + pod that should populate this volume + properties: + defaultMode: + description: |- + Optional: mode bits to use on created files by default. Must be a + Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: Items is a list of downward API volume + file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the + pod: only annotations, labels, name and namespace + are supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in + the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must not + be absolute or contain the ''..'' path. Must + be utf-8 encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of + the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: |- + emptyDir represents a temporary directory that shares a pod's lifetime. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + properties: + medium: + description: |- + medium represents what type of storage medium should back this directory. + The default is "" which means to use the node's default medium. + Must be an empty string (default) or Memory. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: |- + sizeLimit is the total amount of local storage required for this EmptyDir volume. + The size limit is also applicable for memory medium. + The maximum usage on memory medium EmptyDir would be the minimum value between + the SizeLimit specified here and the sum of memory limits of all containers in a pod. + The default is nil which means that the limit is undefined. + More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: |- + ephemeral represents a volume that is handled by a cluster storage driver. + The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, + and deleted when the pod is removed. + + + Use this if: + a) the volume is only needed while the pod runs, + b) features of normal volumes like restoring from snapshot or capacity + tracking are needed, + c) the storage driver is specified through a storage class, and + d) the storage driver supports dynamic volume provisioning through + a PersistentVolumeClaim (see EphemeralVolumeSource for more + information on the connection between this volume type + and PersistentVolumeClaim). + + + Use PersistentVolumeClaim or one of the vendor-specific + APIs for volumes that persist for longer than the lifecycle + of an individual pod. + + + Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to + be used that way - see the documentation of the driver for + more information. + + + A pod can use both types of ephemeral volumes and + persistent volumes at the same time. + properties: + volumeClaimTemplate: + description: |- + Will be used to create a stand-alone PVC to provision the volume. + The pod in which this EphemeralVolumeSource is embedded will be the + owner of the PVC, i.e. the PVC will be deleted together with the + pod. The name of the PVC will be `-` where + `` is the name from the `PodSpec.Volumes` array + entry. Pod validation will reject the pod if the concatenated name + is not valid for a PVC (for example, too long). + + + An existing PVC with that name that is not owned by the pod + will *not* be used for the pod to avoid using an unrelated + volume by mistake. Starting the pod is then blocked until + the unrelated PVC is removed. If such a pre-created PVC is + meant to be used by the pod, the PVC has to updated with an + owner reference to the pod once the pod exists. Normally + this should not be necessary, but it may be useful when + manually reconstructing a broken cluster. + + + This field is read-only and no changes will be made by Kubernetes + to the PVC after it has been created. + + + Required, must not be nil. + properties: + metadata: + description: |- + May contain labels and annotations that will be copied into the PVC + when creating it. No other fields are allowed and will be rejected during + validation. + type: object + spec: + description: |- + The specification for the PersistentVolumeClaim. The entire content is + copied unchanged into the PVC that gets created from this + template. The same fields as in a PersistentVolumeClaim + are also valid here. + properties: + accessModes: + description: |- + accessModes contains the desired access modes the volume should have. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 + items: + type: string + type: array + dataSource: + description: |- + dataSource field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) + If the provisioner or an external controller can support the specified data source, + it will create a new volume based on the contents of the specified data source. + When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, + and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. + If the namespace is specified, then dataSourceRef will not be copied to dataSource. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: |- + dataSourceRef specifies the object from which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty API group (non + core object) or a PersistentVolumeClaim object. + When this field is specified, volume binding will only succeed if the type of + the specified object matches some installed volume populator or dynamic + provisioner. + This field will replace the functionality of the dataSource field and as such + if both fields are non-empty, they must have the same value. For backwards + compatibility, when namespace isn't specified in dataSourceRef, + both fields (dataSource and dataSourceRef) will be set to the same + value automatically if one of them is empty and the other is non-empty. + When namespace is specified in dataSourceRef, + dataSource isn't set to the same value and must be empty. + There are three important differences between dataSource and dataSourceRef: + * While dataSource only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim objects. + * While dataSource ignores disallowed values (dropping them), dataSourceRef + preserves all values, and generates an error if a disallowed value is + specified. + * While dataSource only allows local objects, dataSourceRef allows objects + in any namespaces. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. + (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + namespace: + description: |- + Namespace is the namespace of resource being referenced + Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. + (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: |- + resources represents the minimum resources the volume should have. + If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements + that are lower than previous value but must still be higher than capacity recorded in the + status field of the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + properties: + claims: + description: |- + Claims lists the names of resources, defined in spec.resourceClaims, + that are used by this container. + + + This is an alpha field and requires enabling the + DynamicResourceAllocation feature gate. + + + This field is immutable. It can only be set for containers. + items: + description: ResourceClaim references + one entry in PodSpec.ResourceClaims. + properties: + name: + description: |- + Name must match the name of one entry in pod.spec.resourceClaims of + the Pod where this field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Limits describes the maximum amount of compute resources allowed. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: |- + Requests describes the minimum amount of compute resources required. + If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. Requests cannot exceed Limits. + More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + type: object + type: object + selector: + description: selector is a label query over + volumes to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: |- + storageClassName is the name of the StorageClass required by the claim. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 + type: string + volumeMode: + description: |- + volumeMode defines what type of volume is required by the claim. + Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that + is attached to a kubelet's host machine and then exposed + to the pod. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: |- + readOnly is Optional: Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: |- + wwids Optional: FC volume world wide identifiers (wwids) + Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously. + items: + type: string + type: array + type: object + flexVolume: + description: |- + flexVolume represents a generic volume resource that is + provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use + for this volume. + type: string + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds + extra command options if any.' + type: object + readOnly: + description: |- + readOnly is Optional: defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef is Optional: secretRef is reference to the secret object containing + sensitive information to pass to the plugin scripts. This may be + empty if no secret object is specified. If the secret object + contains more than one secret, all secrets are passed to the plugin + scripts. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached + to a kubelet's host machine. This depends on the Flocker + control service being running + properties: + datasetName: + description: |- + datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker + should be considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. + This is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: |- + gcePersistentDisk represents a GCE Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + properties: + fsType: + description: |- + fsType is filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + partition: + description: |- + partition is the partition in the volume that you want to mount. + If omitted, the default is to mount by volume name. + Examples: For volume /dev/sda1, you specify the partition as "1". + Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + format: int32 + type: integer + pdName: + description: |- + pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk + type: boolean + required: + - pdName + type: object + gitRepo: + description: |- + gitRepo represents a git repository at a particular revision. + DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + into the Pod's container. + properties: + directory: + description: |- + directory is the target directory name. + Must not contain or start with '..'. If '.' is supplied, the volume directory will be the + git repository. Otherwise, if specified, the volume will contain the git repository in + the subdirectory with the given name. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: |- + glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/glusterfs/README.md + properties: + endpoints: + description: |- + endpoints is the endpoint name that details Glusterfs topology. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + path: + description: |- + path is the Glusterfs volume path. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: string + readOnly: + description: |- + readOnly here will force the Glusterfs volume to be mounted with read-only permissions. + Defaults to false. + More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: |- + hostPath represents a pre-existing file or directory on the host + machine that is directly exposed to the container. This is generally + used for system agents or other privileged things that are allowed + to see the host machine. Most containers will NOT need this. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + --- + TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not + mount host directories as read/write. + properties: + path: + description: |- + path of the directory on the host. + If the path is a symlink, it will follow the link to the real path. + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + type: + description: |- + type for HostPath Volume + Defaults to "" + More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath + type: string + required: + - path + type: object + iscsi: + description: |- + iscsi represents an ISCSI Disk resource that is attached to a + kubelet's host machine and then exposed to the pod. + More info: https://examples.k8s.io/volumes/iscsi/README.md + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support + iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support + iSCSI Session CHAP authentication + type: boolean + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + initiatorName: + description: |- + initiatorName is the custom iSCSI Initiator Name. + If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface + : will be created for the connection. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: |- + iscsiInterface is the interface Name that uses an iSCSI transport. + Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: |- + portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI + target and initiator authentication + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: |- + targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port + is other than default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: |- + name of the volume. + Must be a DNS_LABEL and unique within the pod. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + nfs: + description: |- + nfs represents an NFS mount on the host that shares a pod's lifetime + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + properties: + path: + description: |- + path that is exported by the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + readOnly: + description: |- + readOnly here will force the NFS export to be mounted with read-only permissions. + Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: boolean + server: + description: |- + server is the hostname or IP address of the NFS server. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: |- + persistentVolumeClaimVolumeSource represents a reference to a + PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + properties: + claimName: + description: |- + claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + type: string + readOnly: + description: |- + readOnly Will force the ReadOnly setting in VolumeMounts. + Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host + machine + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume + attached and mounted on kubelets host machine + properties: + fsType: + description: |- + fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx + volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: |- + defaultMode are the mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along + with other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + ConfigMap will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the ConfigMap, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path + within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional specify whether the + ConfigMap or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the + downwardAPI data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema + the FieldPath is written in terms + of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to + select in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: |- + Optional: mode bits used to set permissions on this file, must be an octal value + between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: 'Required: Path is the + relative path name of the file to + be created. Must not be absolute or + contain the ''..'' path. Must be utf-8 + encoded. The first item of the relative + path must not start with ''..''' + type: string + resourceFieldRef: + description: |- + Selects a resource of the container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported. + properties: + containerName: + description: 'Container name: required + for volumes, optional for env + vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output + format of the exposed resources, + defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource + to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret + data to project + properties: + items: + description: |- + items if unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path + within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: optional field specify whether + the Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information + about the serviceAccountToken data to project + properties: + audience: + description: |- + audience is the intended audience of the token. A recipient of a token + must identify itself with an identifier specified in the audience of the + token, and otherwise should reject the token. The audience defaults to the + identifier of the apiserver. + type: string + expirationSeconds: + description: |- + expirationSeconds is the requested duration of validity of the service + account token. As the token approaches expiration, the kubelet volume + plugin will proactively rotate the service account token. The kubelet will + start trying to rotate the token if the token is older than 80 percent of + its time to live or if the token is older than 24 hours.Defaults to 1 hour + and must be at least 10 minutes. + format: int64 + type: integer + path: + description: |- + path is the path relative to the mount point of the file to project the + token into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: |- + group to map volume access to + Default is no group + type: string + readOnly: + description: |- + readOnly here will force the Quobyte volume to be mounted with read-only permissions. + Defaults to false. + type: boolean + registry: + description: |- + registry represents a single or multiple Quobyte Registry services + specified as a string as host:port pair (multiple entries are separated with commas) + which acts as the central registry for volumes + type: string + tenant: + description: |- + tenant owning the given Quobyte volume in the Backend + Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: |- + user to map volume access to + Defaults to serivceaccount user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: |- + rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. + More info: https://examples.k8s.io/volumes/rbd/README.md + properties: + fsType: + description: |- + fsType is the filesystem type of the volume that you want to mount. + Tip: Ensure that the filesystem type is supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd + TODO: how do we prevent errors in the filesystem from compromising the machine + type: string + image: + description: |- + image is the rados image name. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + keyring: + description: |- + keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + monitors: + description: |- + monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + items: + type: string + type: array + pool: + description: |- + pool is the rados pool name. + Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + readOnly: + description: |- + readOnly here will force the ReadOnly setting in VolumeMounts. + Defaults to false. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: boolean + secretRef: + description: |- + secretRef is name of the authentication secret for RBDUser. If provided + overrides keyring. + Default is nil. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: |- + user is the rados user name. + Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". + Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: |- + readOnly Defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef references to the secret for ScaleIO user and other + sensitive information. If this is not provided, Login operation will fail. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: |- + storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool + associated with the protection domain. + type: string + system: + description: system is the name of the storage system + as configured in ScaleIO. + type: string + volumeName: + description: |- + volumeName is the name of a volume already created in the ScaleIO system + that is associated with this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: |- + secret represents a secret that should populate this volume. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + properties: + defaultMode: + description: |- + defaultMode is Optional: mode bits used to set permissions on created files by default. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values + for mode bits. Defaults to 0644. + Directories within the path are not affected by this setting. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + items: + description: |- + items If unspecified, each key-value pair in the Data field of the referenced + Secret will be projected into the volume as a file whose name is the + key and content is the value. If specified, the listed keys will be + projected into the specified paths, and unlisted keys will not be + present. If a key is specified which is not present in the Secret, + the volume setup will error unless it is marked optional. Paths must be + relative and may not contain the '..' path or start with '..'. + items: + description: Maps a string key to a path within a + volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: |- + mode is Optional: mode bits used to set permissions on this file. + Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. + YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. + If not specified, the volume defaultMode will be used. + This might be in conflict with other options that affect the file + mode, like fsGroup, and the result can be other mode bits set. + format: int32 + type: integer + path: + description: |- + path is the relative path of the file to map the key to. + May not be an absolute path. + May not contain the path element '..'. + May not start with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret + or its keys must be defined + type: boolean + secretName: + description: |- + secretName is the name of the secret in the pod's namespace to use. + More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: |- + fsType is the filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: |- + readOnly defaults to false (read/write). ReadOnly here will force + the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: |- + secretRef specifies the secret to use for obtaining the StorageOS API + credentials. If not specified, default values will be attempted. + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: |- + volumeName is the human-readable name of the StorageOS volume. Volume + names are only unique within a namespace. + type: string + volumeNamespace: + description: |- + volumeNamespace specifies the scope of the volume within StorageOS. If no + namespace is specified then the Pod's namespace will be used. This allows the + Kubernetes name scoping to be mirrored within StorageOS for tighter integration. + Set VolumeName to any name to override the default behaviour. + Set to "default" if you are not using namespaces within StorageOS. + Namespaces that do not pre-exist within StorageOS will be created. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: |- + fsType is filesystem type to mount. + Must be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy + Based Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies + vSphere volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + workingDir: + default: /home/sealos/project + type: string + required: + - image + type: object + description: + type: string + version: + type: string + required: + - classRef + - config + - version + type: object + status: + description: RuntimeStatus defines the observed state of Runtime + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-controller-manager + namespace: devbox-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-leader-election-role + namespace: devbox-system +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-devbox-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-devbox-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-devboxrelease-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-devboxrelease-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: devbox-manager-role +rules: +- apiGroups: + - "" + resources: + - events + verbs: + - '*' +- apiGroups: + - "" + resources: + - pods + verbs: + - '*' +- apiGroups: + - "" + resources: + - pods/status + verbs: + - get + - patch + - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - '*' +- apiGroups: + - "" + resources: + - services + verbs: + - '*' +- apiGroups: + - devbox.sealos.io + resources: + - devboxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/finalizers + verbs: + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxes/status + verbs: + - get + - patch + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/finalizers + verbs: + - update +- apiGroups: + - devbox.sealos.io + resources: + - devboxreleases/status + verbs: + - get + - patch + - update +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: devbox-metrics-auth-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: devbox-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-operationrequest-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-operationrequest-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - operationrequests/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-runtime-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-runtime-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimes + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimes/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-runtimeclass-editor-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-runtimeclass-viewer-role +rules: +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses + verbs: + - get + - list + - watch +- apiGroups: + - devbox.sealos.io + resources: + - runtimeclasses/status + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-leader-election-rolebinding + namespace: devbox-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: devbox-leader-election-role +subjects: +- kind: ServiceAccount + name: devbox-controller-manager + namespace: devbox-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + name: devbox-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: devbox-manager-role +subjects: +- kind: ServiceAccount + name: devbox-controller-manager + namespace: devbox-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: devbox-metrics-auth-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: devbox-metrics-auth-role +subjects: +- kind: ServiceAccount + name: devbox-controller-manager + namespace: devbox-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + control-plane: controller-manager + name: devbox-controller-manager-metrics-service + namespace: devbox-system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: 8443 + selector: + control-plane: controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: devbox + control-plane: controller-manager + name: devbox-controller-manager + namespace: devbox-system +spec: + replicas: 1 + selector: + matchLabels: + control-plane: controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + containers: + - args: + - --metrics-bind-address=:8443 + - --leader-elect + - --health-probe-bind-address=:8081 + - --registry-addr={{ .registryAddr }} + - --registry-user={{ .registryUser }} + - --registry-password={{ .registryPassword }} + - --auth-addr={{ .authAddr }} + command: + - /manager + image: ghcr.io/labring/sealos-devbox-controller:latest + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + securityContext: + runAsNonRoot: true + serviceAccountName: devbox-controller-manager + terminationGracePeriodSeconds: 10 diff --git a/controllers/devbox/deploy/manifests/rbac.yaml b/controllers/devbox/deploy/manifests/rbac.yaml new file mode 100644 index 00000000000..315d6063700 --- /dev/null +++ b/controllers/devbox/deploy/manifests/rbac.yaml @@ -0,0 +1,37 @@ +# Copyright © 2023 sealos. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: devbox-default-user + namespace: devbox-system +rules: + - apiGroups: [ "devbox.sealos.io" ] + resources: [ "runtimes" ] + verbs: [ "get", "watch", "list" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: devbox-default-user-rolebinding + namespace: devbox-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: devbox-default-user +subjects: + - kind: Group + name: system:serviceaccounts + apiGroup: rbac.authorization.k8s.io diff --git a/controllers/devbox/go.mod b/controllers/devbox/go.mod new file mode 100644 index 00000000000..bbc5f3ecdce --- /dev/null +++ b/controllers/devbox/go.mod @@ -0,0 +1,101 @@ +module github.com/labring/sealos/controllers/devbox + +go 1.22.0 + +toolchain go1.22.4 + +require ( + github.com/avast/retry-go v2.7.0+incompatible + github.com/google/go-containerregistry v0.20.2 + github.com/onsi/ginkgo/v2 v2.17.1 + github.com/onsi/gomega v1.32.0 + golang.org/x/crypto v0.21.0 + k8s.io/api v0.30.1 + k8s.io/apimachinery v0.30.1 + k8s.io/client-go v0.30.1 + k8s.io/utils v0.0.0-20230726121419-3b25d923346b + sigs.k8s.io/controller-runtime v0.18.4 +) + +require ( + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/cel-go v0.17.8 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/imdario/mergo v0.3.6 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.18.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.58.3 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/apiextensions-apiserver v0.30.1 // indirect + k8s.io/apiserver v0.30.1 // indirect + k8s.io/component-base v0.30.1 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/controllers/devbox/go.sum b/controllers/devbox/go.sum new file mode 100644 index 00000000000..75d20f5afd4 --- /dev/null +++ b/controllers/devbox/go.sum @@ -0,0 +1,261 @@ +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/avast/retry-go v2.7.0+incompatible h1:XaGnzl7gESAideSjr+I8Hki/JBi+Yb9baHlMRPeSC84= +github.com/avast/retry-go v2.7.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= +github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-containerregistry v0.20.2 h1:B1wPJ1SN/S7pB+ZAimcciVD+r+yV/l/DSArMxlbwseo= +github.com/google/go-containerregistry v0.20.2/go.mod h1:z38EKdKh4h7IP2gSfUUqEvalZBqs6AoLeWfUy34nQC8= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= +k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= +k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= +k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= +k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= +k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8= +k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo= +k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= +k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= +k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ= +k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 h1:/U5vjBbQn3RChhv7P11uhYvCSm5G2GaIi5AIGBS6r4c= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0/go.mod h1:z7+wmGM2dfIiLRfrC6jb5kV2Mq/sK1ZP303cxzkV5Y4= +sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw= +sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/controllers/devbox/hack/boilerplate.go.txt b/controllers/devbox/hack/boilerplate.go.txt new file mode 100644 index 00000000000..ff72ff2aaab --- /dev/null +++ b/controllers/devbox/hack/boilerplate.go.txt @@ -0,0 +1,15 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ \ No newline at end of file diff --git a/controllers/devbox/internal/controller/devbox_controller.go b/controllers/devbox/internal/controller/devbox_controller.go new file mode 100644 index 00000000000..3d10a3d5e5f --- /dev/null +++ b/controllers/devbox/internal/controller/devbox_controller.go @@ -0,0 +1,591 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "context" + "fmt" + "time" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" + "github.com/labring/sealos/controllers/devbox/internal/controller/helper" + "github.com/labring/sealos/controllers/devbox/label" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/rand" + "k8s.io/client-go/tools/record" + "k8s.io/client-go/util/retry" + "k8s.io/utils/ptr" + + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +// DevboxReconciler reconciles a Devbox object +type DevboxReconciler struct { + CommitImageRegistry string + EquatorialStorage string + + DebugMode bool + + client.Client + Scheme *runtime.Scheme + Recorder record.EventRecorder +} + +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxes,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxes/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxes/finalizers,verbs=update +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=runtimes,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=runtimeclasses,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups="",resources=pods,verbs=* +// +kubebuilder:rbac:groups="",resources=pods/status,verbs=get;update;patch +// +kubebuilder:rbac:groups="",resources=services,verbs=* +// +kubebuilder:rbac:groups="",resources=secrets,verbs=* +// +kubebuilder:rbac:groups="",resources=events,verbs=* + +func (r *DevboxReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + logger := log.FromContext(ctx) + + devbox := &devboxv1alpha1.Devbox{} + if err := r.Get(ctx, req.NamespacedName, devbox); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + recLabels := label.RecommendedLabels(&label.Recommended{ + Name: devbox.Name, + ManagedBy: label.DefaultManagedBy, + PartOf: devboxv1alpha1.DevBoxPartOf, + }) + + if devbox.ObjectMeta.DeletionTimestamp.IsZero() { + // retry add finalizer + err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + latestDevbox := &devboxv1alpha1.Devbox{} + if err := r.Get(ctx, req.NamespacedName, latestDevbox); err != nil { + return client.IgnoreNotFound(err) + } + if controllerutil.AddFinalizer(latestDevbox, devboxv1alpha1.FinalizerName) { + return r.Update(ctx, latestDevbox) + } + return nil + }) + if err != nil { + return ctrl.Result{}, err + } + } else { + logger.Info("devbox deleted, remove all resources") + if err := r.removeAll(ctx, devbox, recLabels); err != nil { + return ctrl.Result{}, err + } + + logger.Info("devbox deleted, remove finalizer") + if controllerutil.RemoveFinalizer(devbox, devboxv1alpha1.FinalizerName) { + if err := r.Update(ctx, devbox); err != nil { + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil + } + + devbox.Status.Network.Type = devbox.Spec.NetworkSpec.Type + _ = r.Status().Update(ctx, devbox) + + // create or update secret + logger.Info("syncing secret") + if err := r.syncSecret(ctx, devbox, recLabels); err != nil { + logger.Error(err, "sync secret failed") + r.Recorder.Eventf(devbox, corev1.EventTypeWarning, "Sync secret failed", "%v", err) + return ctrl.Result{}, err + } + logger.Info("sync secret success") + r.Recorder.Eventf(devbox, corev1.EventTypeNormal, "Sync secret success", "Sync secret success") + + // create service if network type is NodePort + if devbox.Spec.NetworkSpec.Type == devboxv1alpha1.NetworkTypeNodePort { + logger.Info("syncing service") + if err := r.Get(ctx, req.NamespacedName, devbox); err != nil { + return ctrl.Result{}, err + } + if err := r.syncService(ctx, devbox, recLabels); err != nil { + logger.Error(err, "sync service failed") + r.Recorder.Eventf(devbox, corev1.EventTypeWarning, "Sync service failed", "%v", err) + return ctrl.Result{}, err + } + logger.Info("sync service success") + r.Recorder.Eventf(devbox, corev1.EventTypeNormal, "Sync service success", "Sync service success") + } + + // create or update pod + logger.Info("syncing pod") + if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + if err := r.Get(ctx, req.NamespacedName, devbox); err != nil { + return err + } + return r.syncPod(ctx, devbox, recLabels) + }); err != nil { + logger.Error(err, "sync pod failed") + r.Recorder.Eventf(devbox, corev1.EventTypeWarning, "Sync pod failed", "%v", err) + return ctrl.Result{}, err + } + logger.Info("sync pod success") + r.Recorder.Eventf(devbox, corev1.EventTypeNormal, "Sync pod success", "Sync pod success") + + logger.Info("devbox reconcile success") + return ctrl.Result{}, nil +} + +func (r *DevboxReconciler) syncSecret(ctx context.Context, devbox *devboxv1alpha1.Devbox, recLabels map[string]string) error { + objectMeta := metav1.ObjectMeta{ + Name: devbox.Name, + Namespace: devbox.Namespace, + Labels: recLabels, + } + devboxSecret := &corev1.Secret{ + ObjectMeta: objectMeta, + } + + err := r.Get(ctx, client.ObjectKey{Namespace: devbox.Namespace, Name: devbox.Name}, devboxSecret) + if err == nil { + // Secret already exists, no need to create + return nil + } + if client.IgnoreNotFound(err) != nil { + return fmt.Errorf("failed to get secret: %w", err) + } + + // Secret not found, create a new one + publicKey, privateKey, err := helper.GenerateSSHKeyPair() + if err != nil { + return fmt.Errorf("failed to generate SSH key pair: %w", err) + } + + secret := &corev1.Secret{ + ObjectMeta: objectMeta, + Data: map[string][]byte{ + "SEALOS_DEVBOX_PASSWORD": []byte(rand.String(12)), + "SEALOS_DEVBOX_PUBLIC_KEY": publicKey, + "SEALOS_DEVBOX_PRIVATE_KEY": privateKey, + }, + } + + if err := controllerutil.SetControllerReference(devbox, secret, r.Scheme); err != nil { + return fmt.Errorf("failed to set controller reference: %w", err) + } + + if err := r.Create(ctx, secret); err != nil { + return fmt.Errorf("failed to create secret: %w", err) + } + return nil +} + +func (r *DevboxReconciler) syncPod(ctx context.Context, devbox *devboxv1alpha1.Devbox, recLabels map[string]string) error { + logger := log.FromContext(ctx) + // update devbox status after pod is created or updated + defer func() { + if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + logger.Info("update devbox status after pod synced") + latestDevbox := &devboxv1alpha1.Devbox{} + if err := r.Client.Get(ctx, client.ObjectKey{Namespace: devbox.Namespace, Name: devbox.Name}, latestDevbox); err != nil { + logger.Error(err, "get latest devbox failed") + return err + } + // update devbox status with latestDevbox status + logger.Info("updating devbox status") + logger.Info("merge commit history", "devbox", devbox.Status.CommitHistory, "latestDevbox", latestDevbox.Status.CommitHistory) + helper.UpdateDevboxStatus(devbox, latestDevbox) + return r.Status().Update(ctx, latestDevbox) + }); err != nil { + logger.Error(err, "sync pod failed") + r.Recorder.Eventf(devbox, corev1.EventTypeWarning, "Sync pod failed", "%v", err) + return + } + logger.Info("update devbox status success") + r.Recorder.Eventf(devbox, corev1.EventTypeNormal, "Sync pod success", "Sync pod success") + }() + + var podList corev1.PodList + if err := r.List(ctx, &podList, client.InNamespace(devbox.Namespace), client.MatchingLabels(recLabels)); err != nil { + return err + } + // only one pod is allowed, if more than one pod found, return error + if len(podList.Items) > 1 { + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseError + return fmt.Errorf("more than one pod found") + } + logger.Info("pod list", "length", len(podList.Items)) + + switch devbox.Spec.State { + case devboxv1alpha1.DevboxStateRunning: + runtimecr, err := r.getRuntime(ctx, devbox) + if err != nil { + return err + } + nextCommitHistory := r.generateNextCommitHistory(devbox) + expectPod := r.generateDevboxPod(devbox, runtimecr, nextCommitHistory) + + switch len(podList.Items) { + case 0: + logger.Info("create pod") + logger.Info("next commit history", "commit", nextCommitHistory) + devbox.Status.Phase = devboxv1alpha1.DevboxPhasePending + return r.createPod(ctx, devbox, expectPod, nextCommitHistory) + case 1: + pod := &podList.Items[0] + devbox.Status.DevboxPodPhase = pod.Status.Phase + // check pod container size, if it is 0, it means the pod is not running, return an error + if len(pod.Status.ContainerStatuses) == 0 { + devbox.Status.Phase = devboxv1alpha1.DevboxPhasePending + return fmt.Errorf("pod container size is 0") + } + devbox.Status.State = pod.Status.ContainerStatuses[0].State + // update commit predicated status by pod status, this should be done once find a pod + helper.UpdatePredicatedCommitStatus(devbox, pod) + // pod has been deleted, handle it, next reconcile will create a new pod, and we will update commit history status by predicated status + if !pod.DeletionTimestamp.IsZero() { + logger.Info("pod has been deleted") + return r.handlePodDeleted(ctx, devbox, pod) + } + switch helper.PodMatchExpectations(expectPod, pod) { + case true: + // pod match expectations + logger.Info("pod match expectations") + switch pod.Status.Phase { + case corev1.PodPending, corev1.PodRunning: + // pod is running or pending, do nothing here + logger.Info("pod is running or pending") + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseRunning + // update commit history status by pod status + helper.UpdateCommitHistory(devbox, pod, false) + return nil + case corev1.PodFailed, corev1.PodSucceeded: + // pod failed or succeeded, we need delete pod and remove finalizer + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseStopped + logger.Info("pod failed or succeeded, recreate pod") + return r.deletePod(ctx, devbox, pod) + } + case false: + // pod not match expectations, delete pod anyway + logger.Info("pod not match expectations, recreate pod") + devbox.Status.Phase = devboxv1alpha1.DevboxPhasePending + return r.deletePod(ctx, devbox, pod) + } + } + case devboxv1alpha1.DevboxStateStopped: + switch len(podList.Items) { + case 0: + // update devbox status to stopped, no pod found, do nothing + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseStopped + return nil + case 1: + pod := &podList.Items[0] + devbox.Status.DevboxPodPhase = pod.Status.Phase + // update state to empty since devbox is stopped + devbox.Status.State = corev1.ContainerState{} + // update commit predicated status by pod status, this should be done once find a pod + helper.UpdatePredicatedCommitStatus(devbox, pod) + // pod has been deleted, handle it, next reconcile will create a new pod, and we will update commit history status by predicated status + if !pod.DeletionTimestamp.IsZero() { + return r.handlePodDeleted(ctx, devbox, pod) + } + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseStopped + // we need delete pod because devbox state is stopped + // we don't care about the pod status, just delete it + return r.deletePod(ctx, devbox, pod) + } + } + return nil +} + +func (r *DevboxReconciler) syncService(ctx context.Context, devbox *devboxv1alpha1.Devbox, recLabels map[string]string) error { + runtimecr, err := r.getRuntime(ctx, devbox) + if err != nil { + return err + } + var servicePorts []corev1.ServicePort + for _, port := range runtimecr.Spec.Config.Ports { + servicePorts = append(servicePorts, corev1.ServicePort{ + Name: port.Name, + Port: port.ContainerPort, + TargetPort: intstr.FromInt32(port.ContainerPort), + Protocol: port.Protocol, + }) + } + if len(servicePorts) == 0 { + //use the default value + servicePorts = []corev1.ServicePort{ + { + Name: "tty", + Port: 22, + TargetPort: intstr.FromInt32(22), + Protocol: corev1.ProtocolTCP, + }, + } + } + expectServiceSpec := corev1.ServiceSpec{ + Selector: recLabels, + Type: corev1.ServiceTypeNodePort, + Ports: servicePorts, + } + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: devbox.Name + "-svc", + Namespace: devbox.Namespace, + Labels: recLabels, + }, + } + + if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, service, func() error { + // only update some specific fields + service.Spec.Selector = expectServiceSpec.Selector + service.Spec.Type = expectServiceSpec.Type + if len(service.Spec.Ports) == 0 { + service.Spec.Ports = expectServiceSpec.Ports + } else { + service.Spec.Ports[0].Name = expectServiceSpec.Ports[0].Name + service.Spec.Ports[0].Port = expectServiceSpec.Ports[0].Port + service.Spec.Ports[0].TargetPort = expectServiceSpec.Ports[0].TargetPort + service.Spec.Ports[0].Protocol = expectServiceSpec.Ports[0].Protocol + } + return controllerutil.SetControllerReference(devbox, service, r.Scheme) + }); err != nil { + return err + } + + // Retrieve the updated Service to get the NodePort + var updatedService corev1.Service + err = retry.OnError( + retry.DefaultRetry, + func(err error) bool { return client.IgnoreNotFound(err) == nil }, + func() error { + return r.Client.Get(ctx, client.ObjectKey{Namespace: service.Namespace, Name: service.Name}, &updatedService) + }) + if err != nil { + return fmt.Errorf("failed to get updated service: %w", err) + } + + // Extract the NodePort + nodePort := int32(0) + for _, port := range updatedService.Spec.Ports { + if port.NodePort != 0 { + nodePort = port.NodePort + break + } + } + if nodePort == 0 { + return fmt.Errorf("NodePort not found for service %s", service.Name) + } + devbox.Status.Network.Type = devboxv1alpha1.NetworkTypeNodePort + devbox.Status.Network.NodePort = nodePort + + return r.Status().Update(ctx, devbox) +} + +// get the runtime +func (r *DevboxReconciler) getRuntime(ctx context.Context, devbox *devboxv1alpha1.Devbox) (*devboxv1alpha1.Runtime, error) { + runtimeNamespace := devbox.Spec.RuntimeRef.Namespace + if runtimeNamespace == "" { + runtimeNamespace = devbox.Namespace + } + runtimecr := &devboxv1alpha1.Runtime{} + if err := r.Get(ctx, client.ObjectKey{Namespace: runtimeNamespace, Name: devbox.Spec.RuntimeRef.Name}, runtimecr); err != nil { + return nil, err + } + return runtimecr, nil +} + +// create a new pod, add predicated status to nextCommitHistory +func (r *DevboxReconciler) createPod(ctx context.Context, devbox *devboxv1alpha1.Devbox, expectPod *corev1.Pod, nextCommitHistory *devboxv1alpha1.CommitHistory) error { + logger := log.FromContext(ctx) + nextCommitHistory.Status = devboxv1alpha1.CommitStatusPending + nextCommitHistory.PredicatedStatus = devboxv1alpha1.CommitStatusPending + if err := r.Create(ctx, expectPod); err != nil { + logger.Error(err, "create pod failed") + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseError + return err + } + devbox.Status.CommitHistory = append(devbox.Status.CommitHistory, nextCommitHistory) + return nil +} + +func (r *DevboxReconciler) deletePod(ctx context.Context, devbox *devboxv1alpha1.Devbox, pod *corev1.Pod) error { + logger := log.FromContext(ctx) + // remove finalizer and delete pod + controllerutil.RemoveFinalizer(pod, devboxv1alpha1.FinalizerName) + if err := r.Update(ctx, pod); err != nil { + logger.Error(err, "remove finalizer failed") + return err + } + if err := r.Delete(ctx, pod); err != nil { + logger.Error(err, "delete pod failed") + devbox.Status.Phase = devboxv1alpha1.DevboxPhaseError + return err + } + // update commit history status because pod has been deleted + devbox.Status.LastTerminationState = pod.Status.ContainerStatuses[0].State + helper.UpdateCommitHistory(devbox, pod, true) + return nil +} + +func (r *DevboxReconciler) handlePodDeleted(ctx context.Context, devbox *devboxv1alpha1.Devbox, pod *corev1.Pod) error { + logger := log.FromContext(ctx) + controllerutil.RemoveFinalizer(pod, devboxv1alpha1.FinalizerName) + if err := r.Update(ctx, pod); err != nil { + logger.Error(err, "remove finalizer failed") + return err + } + // update commit history status because pod has been deleted + helper.UpdateCommitHistory(devbox, pod, true) + devbox.Status.LastTerminationState = pod.Status.ContainerStatuses[0].State + return nil +} + +func (r *DevboxReconciler) removeAll(ctx context.Context, devbox *devboxv1alpha1.Devbox, recLabels map[string]string) error { + // Delete Pod + podList := &corev1.PodList{} + if err := r.List(ctx, podList, client.InNamespace(devbox.Namespace), client.MatchingLabels(recLabels)); err != nil { + return err + } + for _, pod := range podList.Items { + if controllerutil.RemoveFinalizer(&pod, devboxv1alpha1.FinalizerName) { + if err := r.Update(ctx, &pod); err != nil { + return err + } + } + } + if err := r.deleteResourcesByLabels(ctx, &corev1.Pod{}, devbox.Namespace, recLabels); err != nil { + return err + } + // Delete Service + if err := r.deleteResourcesByLabels(ctx, &corev1.Service{}, devbox.Namespace, recLabels); err != nil { + return err + } + // Delete Secret + return r.deleteResourcesByLabels(ctx, &corev1.Secret{}, devbox.Namespace, recLabels) +} + +func (r *DevboxReconciler) deleteResourcesByLabels(ctx context.Context, obj client.Object, namespace string, labels map[string]string) error { + err := r.DeleteAllOf(ctx, obj, + client.InNamespace(namespace), + client.MatchingLabels(labels), + ) + return client.IgnoreNotFound(err) +} + +func (r *DevboxReconciler) generateDevboxPod(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime, nextCommitHistory *devboxv1alpha1.CommitHistory) *corev1.Pod { + objectMeta := metav1.ObjectMeta{ + Name: nextCommitHistory.Pod, + Namespace: devbox.Namespace, + Labels: helper.GeneratePodLabels(devbox, runtime), + Annotations: helper.GeneratePodAnnotations(devbox, runtime), + } + + // set up ports and env by using runtime ports and devbox extra ports + ports := runtime.Spec.Config.Ports + ports = append(ports, devbox.Spec.NetworkSpec.ExtraPorts...) + + envs := runtime.Spec.Config.Env + envs = append(envs, devbox.Spec.ExtraEnvs...) + envs = append(envs, helper.GenerateDevboxEnvVars(devbox, nextCommitHistory)...) + + //get image name + var imageName string + if r.DebugMode { + imageName = runtime.Spec.Config.Image + } else { + imageName = helper.GetLastSuccessCommitImageName(devbox, runtime) + } + + volumes := runtime.Spec.Config.Volumes + volumes = append(volumes, helper.GenerateSSHVolume(devbox)) + volumes = append(volumes, devbox.Spec.ExtraVolumes...) + + volumeMounts := runtime.Spec.Config.VolumeMounts + volumeMounts = append(volumeMounts, helper.GenerateSSHVolumeMounts()) + volumeMounts = append(volumeMounts, devbox.Spec.ExtraVolumeMounts...) + + containers := []corev1.Container{ + { + Name: devbox.ObjectMeta.Name, + Image: imageName, + Env: envs, + Ports: ports, + VolumeMounts: volumeMounts, + + WorkingDir: helper.GenerateWorkingDir(devbox, runtime), + Command: helper.GenerateCommand(devbox, runtime), + Args: helper.GenerateDevboxArgs(devbox, runtime), + Resources: helper.GenerateResourceRequirements(devbox, r.EquatorialStorage), + }, + } + + terminationGracePeriodSeconds := 300 + automountServiceAccountToken := false + + expectPod := &corev1.Pod{ + ObjectMeta: objectMeta, + Spec: corev1.PodSpec{ + TerminationGracePeriodSeconds: ptr.To(int64(terminationGracePeriodSeconds)), + AutomountServiceAccountToken: ptr.To(automountServiceAccountToken), + RestartPolicy: corev1.RestartPolicyNever, + + Hostname: devbox.Name, + Containers: containers, + Volumes: volumes, + + Tolerations: devbox.Spec.Tolerations, + Affinity: devbox.Spec.Affinity, + }, + } + // set controller reference and finalizer + _ = controllerutil.SetControllerReference(devbox, expectPod, r.Scheme) + controllerutil.AddFinalizer(expectPod, devboxv1alpha1.FinalizerName) + return expectPod +} + +func (r *DevboxReconciler) generateNextCommitHistory(devbox *devboxv1alpha1.Devbox) *devboxv1alpha1.CommitHistory { + now := time.Now() + return &devboxv1alpha1.CommitHistory{ + Image: r.generateImageName(devbox), + Time: metav1.Time{Time: now}, + Pod: devbox.Name + "-" + rand.String(5), + Status: devboxv1alpha1.CommitStatusPending, + PredicatedStatus: devboxv1alpha1.CommitStatusPending, + } +} + +func (r *DevboxReconciler) generateImageName(devbox *devboxv1alpha1.Devbox) string { + now := time.Now() + return fmt.Sprintf("%s/%s/%s:%s-%s", r.CommitImageRegistry, devbox.Namespace, devbox.Name, rand.String(5), now.Format("2006-01-02-150405")) +} + +// SetupWithManager sets up the controller with the Manager. +func (r *DevboxReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&devboxv1alpha1.Devbox{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). + Owns(&corev1.Pod{}, builder.WithPredicates(predicate.ResourceVersionChangedPredicate{})). // enqueue request if pod spec/status is updated + Owns(&corev1.Service{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). + Owns(&corev1.Secret{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). + Complete(r) +} diff --git a/controllers/devbox/internal/controller/devbox_controller_test.go b/controllers/devbox/internal/controller/devbox_controller_test.go new file mode 100644 index 00000000000..12b88993df9 --- /dev/null +++ b/controllers/devbox/internal/controller/devbox_controller_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" +) + +var _ = Describe("Devbox Controller", func() { + Context("When reconciling a resource", func() { + const resourceName = "test-resource" + + ctx := context.Background() + + typeNamespacedName := types.NamespacedName{ + Name: resourceName, + Namespace: "default", // TODO(user):Modify as needed + } + devbox := &devboxv1alpha1.Devbox{} + + BeforeEach(func() { + By("creating the custom resource for the Kind Devbox") + err := k8sClient.Get(ctx, typeNamespacedName, devbox) + if err != nil && errors.IsNotFound(err) { + resource := &devboxv1alpha1.Devbox{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: "default", + }, + // TODO(user): Specify other spec details if needed. + } + Expect(k8sClient.Create(ctx, resource)).To(Succeed()) + } + }) + + AfterEach(func() { + // TODO(user): Cleanup logic after each test, like removing the resource instance. + resource := &devboxv1alpha1.Devbox{} + err := k8sClient.Get(ctx, typeNamespacedName, resource) + Expect(err).NotTo(HaveOccurred()) + + By("Cleanup the specific resource instance Devbox") + Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + }) + It("should successfully reconcile the resource", func() { + By("Reconciling the created resource") + controllerReconciler := &DevboxReconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), + } + + _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespacedName, + }) + Expect(err).NotTo(HaveOccurred()) + // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. + // Example: If you expect a certain status condition after reconciliation, verify it here. + }) + }) +}) diff --git a/controllers/devbox/internal/controller/devboxrelease_controller.go b/controllers/devbox/internal/controller/devboxrelease_controller.go new file mode 100644 index 00000000000..538f67c7da2 --- /dev/null +++ b/controllers/devbox/internal/controller/devboxrelease_controller.go @@ -0,0 +1,155 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "context" + "errors" + "fmt" + + reference "github.com/google/go-containerregistry/pkg/name" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" + "github.com/labring/sealos/controllers/devbox/internal/controller/helper" + "github.com/labring/sealos/controllers/devbox/internal/controller/utils/registry" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/log" +) + +// DevBoxReleaseReconciler reconciles a DevBoxRelease object +type DevBoxReleaseReconciler struct { + client.Client + Registry *registry.Client + Scheme *runtime.Scheme +} + +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxreleases,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxreleases/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=devbox.sealos.io,resources=devboxreleases/finalizers,verbs=update + +func (r *DevBoxReleaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + logger := log.FromContext(ctx) + devboxRelease := &devboxv1alpha1.DevBoxRelease{} + if err := r.Client.Get(ctx, req.NamespacedName, devboxRelease); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + if devboxRelease.ObjectMeta.DeletionTimestamp.IsZero() { + if controllerutil.AddFinalizer(devboxRelease, devboxv1alpha1.FinalizerName) { + if err := r.Update(ctx, devboxRelease); err != nil { + return ctrl.Result{}, err + } + } + } else { + if controllerutil.RemoveFinalizer(devboxRelease, devboxv1alpha1.FinalizerName) { + if err := r.Update(ctx, devboxRelease); err != nil { + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil + } + + logger.Info("Reconciling DevBoxRelease", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag, "phase", devboxRelease.Status.Phase) + + if devboxRelease.Status.Phase == "" { + devboxRelease.Status.Phase = devboxv1alpha1.DevboxReleasePhasePending + err := r.Status().Update(ctx, devboxRelease) + if err != nil { + logger.Error(err, "Failed to update status", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + return ctrl.Result{}, err + } + return ctrl.Result{Requeue: true}, nil + } + + if devboxRelease.Status.Phase == devboxv1alpha1.DevboxReleasePhasePending { + logger.Info("Creating release tag", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + err := r.CreateReleaseTag(ctx, devboxRelease) + if err != nil && errors.Is(err, registry.ErrorManifestNotFound) { + logger.Info("Manifest not found, retrying", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + return ctrl.Result{Requeue: true}, nil + } else if err != nil { + logger.Error(err, "Failed to create release tag", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + devboxRelease.Status.Phase = devboxv1alpha1.DevboxReleasePhaseFailed + _ = r.Status().Update(ctx, devboxRelease) + return ctrl.Result{}, err + } + logger.Info("Release tag created", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + devboxRelease.Status.Phase = devboxv1alpha1.DevboxReleasePhaseSuccess + if err = r.Status().Update(ctx, devboxRelease); err != nil { + logger.Error(err, "Failed to update status", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + return ctrl.Result{}, err + } + } + logger.Info("Reconciliation complete", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + return ctrl.Result{}, nil +} + +func (r *DevBoxReleaseReconciler) CreateReleaseTag(ctx context.Context, devboxRelease *devboxv1alpha1.DevBoxRelease) error { + logger := log.FromContext(ctx) + devbox := &devboxv1alpha1.Devbox{} + devboxInfo := types.NamespacedName{ + Name: devboxRelease.Spec.DevboxName, + Namespace: devboxRelease.Namespace, + } + if err := r.Get(ctx, devboxInfo, devbox); err != nil { + return err + } + hostName, imageName, oldTag, err := r.GetImageInfo(devbox) + if err != nil { + return err + } + logger.Info("Tagging image", "host", hostName, "image", imageName, "oldTag", oldTag, "newTag", devboxRelease.Spec.NewTag) + devboxRelease.Status.OriginalImage = imageName + ":" + oldTag + if err = r.Status().Update(ctx, devboxRelease); err != nil { + logger.Error(err, "Failed to update status", "devbox", devboxRelease.Spec.DevboxName, "newTag", devboxRelease.Spec.NewTag) + return err + } + return r.Registry.TagImage(hostName, imageName, oldTag, devboxRelease.Spec.NewTag) +} + +func (r *DevBoxReleaseReconciler) DeleteReleaseTag(_ context.Context, _ *devboxv1alpha1.DevBoxRelease) error { + //todo only delete CR without doing any other operations + return nil +} + +func (r *DevBoxReleaseReconciler) GetImageInfo(devbox *devboxv1alpha1.Devbox) (string, string, string, error) { + if len(devbox.Status.CommitHistory) == 0 { + return "", "", "", fmt.Errorf("commit history is empty") + } + commitHistory := helper.GetLastSuccessCommitHistory(devbox) + if commitHistory == nil { + return "", "", "", fmt.Errorf("no successful commit history found") + } + res, err := reference.ParseReference(commitHistory.Image) + if err != nil { + return "", "", "", err + } + repo := res.Context() + return repo.RegistryStr(), repo.RepositoryStr(), res.Identifier(), nil +} + +// SetupWithManager sets up the controller with the Manager. +func (r *DevBoxReleaseReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&devboxv1alpha1.DevBoxRelease{}). + Complete(r) +} diff --git a/controllers/devbox/internal/controller/devboxrelease_controller_test.go b/controllers/devbox/internal/controller/devboxrelease_controller_test.go new file mode 100644 index 00000000000..e42ba0be05c --- /dev/null +++ b/controllers/devbox/internal/controller/devboxrelease_controller_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" +) + +var _ = Describe("DevBoxRelease Controller", func() { + Context("When reconciling a resource", func() { + const resourceName = "test-resource" + + ctx := context.Background() + + typeNamespacedName := types.NamespacedName{ + Name: resourceName, + Namespace: "default", // TODO(user):Modify as needed + } + devboxrelease := &devboxv1alpha1.DevBoxRelease{} + + BeforeEach(func() { + By("creating the custom resource for the Kind DevBoxRelease") + err := k8sClient.Get(ctx, typeNamespacedName, devboxrelease) + if err != nil && errors.IsNotFound(err) { + resource := &devboxv1alpha1.DevBoxRelease{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: "default", + }, + // TODO(user): Specify other spec details if needed. + } + Expect(k8sClient.Create(ctx, resource)).To(Succeed()) + } + }) + + AfterEach(func() { + // TODO(user): Cleanup logic after each test, like removing the resource instance. + resource := &devboxv1alpha1.DevBoxRelease{} + err := k8sClient.Get(ctx, typeNamespacedName, resource) + Expect(err).NotTo(HaveOccurred()) + + By("Cleanup the specific resource instance DevBoxRelease") + Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + }) + It("should successfully reconcile the resource", func() { + By("Reconciling the created resource") + controllerReconciler := &DevBoxReleaseReconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), + } + + _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespacedName, + }) + Expect(err).NotTo(HaveOccurred()) + // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. + // Example: If you expect a certain status condition after reconciliation, verify it here. + }) + }) +}) diff --git a/controllers/devbox/internal/controller/helper/devbox.go b/controllers/devbox/internal/controller/helper/devbox.go new file mode 100644 index 00000000000..055763ac1cf --- /dev/null +++ b/controllers/devbox/internal/controller/helper/devbox.go @@ -0,0 +1,406 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package helper + +import ( + "fmt" + "log/slog" + "sort" + + "crypto/ed25519" + "crypto/rand" + "encoding/pem" + + "golang.org/x/crypto/ssh" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" + "github.com/labring/sealos/controllers/devbox/label" +) + +const ( + rate = 10 + DevBoxPartOf = "devbox" +) + +func GeneratePodLabels(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) map[string]string { + labels := make(map[string]string) + + if runtime.Spec.Config.Labels != nil { + for k, v := range runtime.Spec.Config.Labels { + labels[k] = v + } + } + if devbox.Spec.ExtraLabels != nil { + for k, v := range devbox.Spec.ExtraLabels { + labels[k] = v + } + } + recLabels := label.RecommendedLabels(&label.Recommended{ + Name: devbox.Name, + ManagedBy: label.DefaultManagedBy, + PartOf: DevBoxPartOf, + }) + for k, v := range recLabels { + labels[k] = v + } + return labels +} + +func GeneratePodAnnotations(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) map[string]string { + annotations := make(map[string]string) + if runtime.Spec.Config.Annotations != nil { + for k, v := range runtime.Spec.Config.Annotations { + annotations[k] = v + } + } + if devbox.Spec.ExtraAnnotations != nil { + for k, v := range devbox.Spec.ExtraAnnotations { + annotations[k] = v + } + } + return annotations +} + +func MergeCommitHistory(devbox *devboxv1alpha1.Devbox, latestDevbox *devboxv1alpha1.Devbox) []*devboxv1alpha1.CommitHistory { + res := make([]*devboxv1alpha1.CommitHistory, 0) + historyMap := make(map[string]*devboxv1alpha1.CommitHistory) + for _, c := range latestDevbox.Status.CommitHistory { + historyMap[c.Pod] = c + } + // up coming commit history will be added to the latest devbox + for _, c := range devbox.Status.CommitHistory { + historyMap[c.Pod] = c + } + for _, c := range historyMap { + res = append(res, c) + } + // sort commit history by time in descending order + sort.Slice(res, func(i, j int) bool { + return res[i].Time.After(res[j].Time.Time) + }) + return res +} + +func GenerateSSHKeyPair() ([]byte, []byte, error) { + pubKey, privKey, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + return nil, nil, err + } + pemKey, err := ssh.MarshalPrivateKey(privKey, "") + if err != nil { + return nil, nil, err + } + privateKey := pem.EncodeToMemory(pemKey) + publicKey, err := ssh.NewPublicKey(pubKey) + if err != nil { + return nil, nil, err + } + sshPublicKey := ssh.MarshalAuthorizedKey(publicKey) + return sshPublicKey, privateKey, nil +} + +func UpdatePredicatedCommitStatus(devbox *devboxv1alpha1.Devbox, pod *corev1.Pod) { + for i, c := range devbox.Status.CommitHistory { + if c.Pod == pod.Name { + devbox.Status.CommitHistory[i].PredicatedStatus = PodPhaseToCommitStatus(pod.Status.Phase) + break + } + } +} + +// UpdateDevboxStatus updates the devbox status, including phase, pod phase, last terminated state and commit history, maybe we need update more fields in the future +// TODO: move this function to devbox types.go +func UpdateDevboxStatus(current, latest *devboxv1alpha1.Devbox) { + latest.Status.Phase = current.Status.Phase + latest.Status.DevboxPodPhase = current.Status.DevboxPodPhase + latest.Status.State = current.Status.State + latest.Status.LastTerminationState = current.Status.LastTerminationState + latest.Status.CommitHistory = MergeCommitHistory(current, latest) +} + +func UpdateCommitHistory(devbox *devboxv1alpha1.Devbox, pod *corev1.Pod, updateStatus bool) { + // update commit history, if devbox commit history missed the pod, we need add it + found := false + for i, c := range devbox.Status.CommitHistory { + if c.Pod == pod.Name { + found = true + if updateStatus { + devbox.Status.CommitHistory[i].Status = devbox.Status.CommitHistory[i].PredicatedStatus + } + if len(pod.Status.ContainerStatuses) > 0 { + devbox.Status.CommitHistory[i].Node = pod.Spec.NodeName + devbox.Status.CommitHistory[i].ContainerID = pod.Status.ContainerStatuses[0].ContainerID + } + break + } + } + if !found { + newCommitHistory := &devboxv1alpha1.CommitHistory{ + Pod: pod.Name, + PredicatedStatus: PodPhaseToCommitStatus(pod.Status.Phase), + } + if len(pod.Status.ContainerStatuses) > 0 { + newCommitHistory.ContainerID = pod.Status.ContainerStatuses[0].ContainerID + newCommitHistory.Node = pod.Spec.NodeName + } + if updateStatus { + newCommitHistory.Status = newCommitHistory.PredicatedStatus + } + devbox.Status.CommitHistory = append(devbox.Status.CommitHistory, newCommitHistory) + } +} + +func PodPhaseToCommitStatus(podPhase corev1.PodPhase) devboxv1alpha1.CommitStatus { + switch podPhase { + case corev1.PodPending: + return devboxv1alpha1.CommitStatusPending + case corev1.PodRunning, corev1.PodFailed, corev1.PodSucceeded: + return devboxv1alpha1.CommitStatusSuccess + } + return devboxv1alpha1.CommitStatusUnknown +} + +func PodMatchExpectations(expectPod *corev1.Pod, pod *corev1.Pod) bool { + if len(pod.Spec.Containers) == 0 { + slog.Info("Pod has no containers") + return false + } + container := pod.Spec.Containers[0] + expectContainer := expectPod.Spec.Containers[0] + + // Check CPU and memory limits + if container.Resources.Limits.Cpu().Cmp(*expectContainer.Resources.Limits.Cpu()) != 0 { + slog.Info("CPU limits are not equal") + return false + } + if container.Resources.Limits.Memory().Cmp(*expectContainer.Resources.Limits.Memory()) != 0 { + slog.Info("Memory limits are not equal") + return false + } + + // Check environment variables + if len(container.Env) != len(expectContainer.Env) { + return false + } + for _, env := range container.Env { + found := false + for _, expectEnv := range expectContainer.Env { + if env.Name == "SEALOS_COMMIT_IMAGE_NAME" { + found = true + break + } + if env.Name == expectEnv.Name && env.Value == expectEnv.Value { + found = true + break + } + } + if !found { + slog.Info("Environment variables are not equal", "env not found", env.Name, "env value", env.Value) + return false + } + } + + // Check ports + if len(container.Ports) != len(expectContainer.Ports) { + return false + } + for _, expectPort := range expectContainer.Ports { + found := false + for _, podPort := range container.Ports { + if expectPort.ContainerPort == podPort.ContainerPort && expectPort.Protocol == podPort.Protocol { + found = true + break + } + } + if !found { + slog.Info("Ports are not equal") + return false + } + } + + return true +} + +func GenerateDevboxEnvVars(devbox *devboxv1alpha1.Devbox, nextCommitHistory *devboxv1alpha1.CommitHistory) []corev1.EnvVar { + // if devbox.Spec.Squash is true, and devbox.Status.CommitHistory has success commit history, we need to set SEALOS_COMMIT_IMAGE_SQUASH to true + doSquash := false + if devbox.Spec.Squash && len(devbox.Status.CommitHistory) > 0 { + for _, commit := range devbox.Status.CommitHistory { + if commit.Status == devboxv1alpha1.CommitStatusSuccess { + doSquash = true + break + } + } + } + + return []corev1.EnvVar{ + { + Name: "SEALOS_COMMIT_ON_STOP", + Value: "true", + }, + { + Name: "SEALOS_COMMIT_IMAGE_NAME", + Value: nextCommitHistory.Image, + }, + { + Name: "SEALOS_COMMIT_IMAGE_SQUASH", + Value: fmt.Sprintf("%v", doSquash), + }, + { + Name: "SEALOS_DEVBOX_NAME", + Value: devbox.Namespace + "-" + devbox.Name, + }, + { + Name: "SEALOS_DEVBOX_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + Key: "SEALOS_DEVBOX_PASSWORD", + LocalObjectReference: corev1.LocalObjectReference{ + Name: devbox.Name, + }, + }, + }, + }, + { + Name: "SEALOS_DEVBOX_POD_UID", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.uid", + }, + }, + }, + } +} + +func GetLastSuccessCommitHistory(devbox *devboxv1alpha1.Devbox) *devboxv1alpha1.CommitHistory { + if len(devbox.Status.CommitHistory) == 0 { + return nil + } + // Sort commit history by time in descending order + sort.Slice(devbox.Status.CommitHistory, func(i, j int) bool { + return devbox.Status.CommitHistory[i].Time.After(devbox.Status.CommitHistory[j].Time.Time) + }) + + for _, commit := range devbox.Status.CommitHistory { + if commit.Status == devboxv1alpha1.CommitStatusSuccess { + return commit + } + } + return nil +} + +func GetLastSuccessCommitImageName(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) string { + if len(devbox.Status.CommitHistory) == 0 { + return runtime.Spec.Config.Image + } + commit := GetLastSuccessCommitHistory(devbox) + if commit == nil { + return runtime.Spec.Config.Image + } + return commit.Image +} + +func GenerateSSHVolumeMounts() corev1.VolumeMount { + return corev1.VolumeMount{ + Name: "devbox-ssh-keys", + MountPath: "/usr/start/.ssh", + ReadOnly: true, + } +} + +// GenerateSSHVolume generates a volume for SSH keys +func GenerateSSHVolume(devbox *devboxv1alpha1.Devbox) corev1.Volume { + return corev1.Volume{ + Name: "devbox-ssh-keys", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: devbox.Name, + Items: []corev1.KeyToPath{ + { + Key: "SEALOS_DEVBOX_PRIVATE_KEY", + Path: "id", + }, + { + Key: "SEALOS_DEVBOX_PUBLIC_KEY", + Path: "id.pub", + }, + }, + }, + }, + } +} + +func GenerateResourceRequirements(devbox *devboxv1alpha1.Devbox, equatorialStorage string) corev1.ResourceRequirements { + return corev1.ResourceRequirements{ + Requests: calculateResourceRequest( + corev1.ResourceList{ + corev1.ResourceCPU: devbox.Spec.Resource["cpu"], + corev1.ResourceMemory: devbox.Spec.Resource["memory"], + }, + ), + Limits: corev1.ResourceList{ + "cpu": devbox.Spec.Resource["cpu"], + "memory": devbox.Spec.Resource["memory"], + "ephemeral-storage": resource.MustParse(equatorialStorage), + }, + } +} + +func calculateResourceRequest(limit corev1.ResourceList) corev1.ResourceList { + if limit == nil { + return nil + } + request := make(corev1.ResourceList) + // Calculate CPU request + if cpu, ok := limit[corev1.ResourceCPU]; ok { + cpuValue := cpu.AsApproximateFloat64() + cpuRequest := cpuValue / rate + request[corev1.ResourceCPU] = *resource.NewMilliQuantity(int64(cpuRequest*1000), resource.DecimalSI) + } + // Calculate memory request + if memory, ok := limit[corev1.ResourceMemory]; ok { + memoryValue := memory.AsApproximateFloat64() + memoryRequest := memoryValue / rate + request[corev1.ResourceMemory] = *resource.NewQuantity(int64(memoryRequest), resource.BinarySI) + } + return request +} + +// GenerateWorkingDir generates the working directory for the Devbox pod +func GenerateWorkingDir(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) string { + if devbox.Spec.WorkingDir != "" { + return devbox.Spec.WorkingDir + } + return runtime.Spec.Config.WorkingDir +} + +// GenerateCommand generates the command for the Devbox pod +func GenerateCommand(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) []string { + if len(devbox.Spec.Command) != 0 { + return devbox.Spec.Command + } + return runtime.Spec.Config.Command +} + +// GenerateDevboxArgs generates the arguments for the Devbox pod +func GenerateDevboxArgs(devbox *devboxv1alpha1.Devbox, runtime *devboxv1alpha1.Runtime) []string { + if len(devbox.Spec.Args) != 0 { + return devbox.Spec.Args + } + return runtime.Spec.Config.Args +} diff --git a/controllers/devbox/internal/controller/helper/devbox_test.go b/controllers/devbox/internal/controller/helper/devbox_test.go new file mode 100644 index 00000000000..f3563b743fb --- /dev/null +++ b/controllers/devbox/internal/controller/helper/devbox_test.go @@ -0,0 +1,167 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package helper + +import ( + "testing" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +func TestPodMatchExpectations(t *testing.T) { + expectPod := &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("500m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + }, + Env: []corev1.EnvVar{ + {Name: "ENV_VAR_1", Value: "value1"}, + {Name: "ENV_VAR_2", Value: "value2"}, + }, + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080, Protocol: corev1.ProtocolTCP}, + {ContainerPort: 9090, Protocol: corev1.ProtocolTCP}, + }, + }, + }, + }, + } + + tests := []struct { + name string + pod *corev1.Pod + expected bool + }{ + { + name: "consistent pod", + pod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("500m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + }, + Env: []corev1.EnvVar{ + {Name: "ENV_VAR_1", Value: "value1"}, + {Name: "ENV_VAR_2", Value: "value2"}, + }, + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080, Protocol: corev1.ProtocolTCP}, + {ContainerPort: 9090, Protocol: corev1.ProtocolTCP}, + }, + }, + }, + }, + }, + expected: true, + }, + { + name: "inconsistent CPU", + pod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("1000m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + }, + Env: []corev1.EnvVar{ + {Name: "ENV_VAR_1", Value: "value1"}, + {Name: "ENV_VAR_2", Value: "value2"}, + }, + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080, Protocol: corev1.ProtocolTCP}, + {ContainerPort: 9090, Protocol: corev1.ProtocolTCP}, + }, + }, + }, + }, + }, + expected: false, + }, + { + name: "inconsistent environment variable", + pod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("500m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + }, + Env: []corev1.EnvVar{ + {Name: "ENV_VAR_1", Value: "value1"}, + {Name: "ENV_VAR_3", Value: "value3"}, + }, + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080, Protocol: corev1.ProtocolTCP}, + {ContainerPort: 9090, Protocol: corev1.ProtocolTCP}, + }, + }, + }, + }, + }, + expected: false, + }, + { + name: "inconsistent port", + pod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("500m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + }, + Env: []corev1.EnvVar{ + {Name: "ENV_VAR_1", Value: "value1"}, + {Name: "ENV_VAR_2", Value: "value2"}, + }, + Ports: []corev1.ContainerPort{ + {ContainerPort: 8080, Protocol: corev1.ProtocolTCP}, + {ContainerPort: 9091, Protocol: corev1.ProtocolTCP}, + }, + }, + }, + }, + }, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := PodMatchExpectations(expectPod, tt.pod) + if result != tt.expected { + t.Errorf("CheckPodConsistency() = %v, expected %v", result, tt.expected) + } + }) + } +} diff --git a/controllers/devbox/internal/controller/suite_test.go b/controllers/devbox/internal/controller/suite_test.go new file mode 100644 index 00000000000..0035ea039c1 --- /dev/null +++ b/controllers/devbox/internal/controller/suite_test.go @@ -0,0 +1,90 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + "path/filepath" + "runtime" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + devboxv1alpha1 "github.com/labring/sealos/controllers/devbox/api/v1alpha1" + // +kubebuilder:scaffold:imports +) + +// These tests use Ginkgo (BDD-style Go testing framework). Refer to +// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. + +var cfg *rest.Config +var k8sClient client.Client +var testEnv *envtest.Environment + +func TestControllers(t *testing.T) { + RegisterFailHandler(Fail) + + RunSpecs(t, "Controller Suite") +} + +var _ = BeforeSuite(func() { + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) + + By("bootstrapping test environment") + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, + ErrorIfCRDPathMissing: true, + + // The BinaryAssetsDirectory is only required if you want to run the tests directly + // without call the makefile target test. If not informed it will look for the + // default path defined in controller-runtime which is /usr/local/kubebuilder/. + // Note that you must have the required binaries setup under the bin directory to perform + // the tests directly. When we run make test it will be setup and used automatically. + BinaryAssetsDirectory: filepath.Join("..", "..", "bin", "k8s", + fmt.Sprintf("1.30.0-%s-%s", runtime.GOOS, runtime.GOARCH)), + } + + var err error + // cfg is defined in this file globally. + cfg, err = testEnv.Start() + Expect(err).NotTo(HaveOccurred()) + Expect(cfg).NotTo(BeNil()) + + err = devboxv1alpha1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + // +kubebuilder:scaffold:scheme + + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient).NotTo(BeNil()) + +}) + +var _ = AfterSuite(func() { + By("tearing down the test environment") + err := testEnv.Stop() + Expect(err).NotTo(HaveOccurred()) +}) diff --git a/controllers/devbox/internal/controller/utils/errors/errors.go b/controllers/devbox/internal/controller/utils/errors/errors.go new file mode 100644 index 00000000000..e7c853a6015 --- /dev/null +++ b/controllers/devbox/internal/controller/utils/errors/errors.go @@ -0,0 +1,21 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package errors + +import "errors" + +var ( + ErrPodNotLastCommitHistory = errors.New("pod is not the last commit history pod") +) diff --git a/controllers/devbox/internal/controller/utils/registry/client.go b/controllers/devbox/internal/controller/utils/registry/client.go new file mode 100644 index 00000000000..13304369646 --- /dev/null +++ b/controllers/devbox/internal/controller/utils/registry/client.go @@ -0,0 +1,142 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package registry + +import ( + "bytes" + "errors" + "io" + "net/http" + "time" + + "github.com/avast/retry-go" +) + +type Client struct { + Username string + Password string +} + +var ( + ErrorManifestNotFound = errors.New("manifest not found") +) + +func (t *Client) TagImage(hostName string, imageName string, oldTag string, newTag string) error { + return retry.Do(func() error { + manifest, err := t.pullManifest(t.Username, t.Password, hostName, imageName, oldTag) + if err != nil { + return err + } + return t.pushManifest(t.Username, t.Password, hostName, imageName, newTag, manifest) + }, retry.Delay(time.Second*5), retry.Attempts(3), retry.LastErrorOnly(true)) +} + +//func (t *Client) login(authPath string, username string, password string, imageName string) (string, error) { +// var ( +// client = http.DefaultClient +// url = authPath + imageName + ":pull,push" +// ) +// +// req, err := http.NewRequest("GET", url, nil) +// if err != nil { +// return "", err +// } +// +// req.SetBasicAuth(username, password) +// +// resp, err := client.Do(req) +// if err != nil { +// return "", err +// } +// +// if resp.StatusCode != http.StatusOK { +// return "", errors.New(resp.Status) +// } +// +// bodyText, err := ioutil.ReadAll(resp.Body) +// if err != nil { +// return "", err +// } +// var data struct { +// Token string `json:"token"` +// AccessToken string `json:"access_token"` +// ExpiresIn int `json:"expires_in"` +// IssuedAt string `json:"issued_at"` +// } +// if err := json.Unmarshal(bodyText, &data); err != nil { +// return "", err +// } +// if data.Token == "" { +// return "", errors.New("empty token") +// } +// return data.Token, nil +//} + +func (t *Client) pullManifest(username string, password string, hostName string, imageName string, tag string) ([]byte, error) { + var ( + client = http.DefaultClient + url = "http://" + hostName + "/v2/" + imageName + "/manifests/" + tag + ) + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + req.SetBasicAuth(username, password) + req.Header.Set("Accept", "application/vnd.docker.distribution.manifest.v2+json") + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusNotFound { + return nil, ErrorManifestNotFound + } + + if resp.StatusCode != http.StatusOK { + return nil, errors.New(resp.Status) + } + + bodyText, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return bodyText, nil +} + +func (t *Client) pushManifest(username string, password string, hostName string, imageName string, tag string, manifest []byte) error { + var ( + client = http.DefaultClient + url = "http://" + hostName + "/v2/" + imageName + "/manifests/" + tag + ) + req, err := http.NewRequest("PUT", url, bytes.NewBuffer(manifest)) + if err != nil { + return err + } + + req.SetBasicAuth(username, password) + req.Header.Set("Content-type", "application/vnd.docker.distribution.manifest.v2+json") + + resp, err := client.Do(req) + if err != nil { + return err + } + + if resp.StatusCode != http.StatusCreated { + return errors.New(resp.Status) + } + + return nil +} diff --git a/controllers/devbox/internal/controller/utils/registry/client_test.go b/controllers/devbox/internal/controller/utils/registry/client_test.go new file mode 100644 index 00000000000..18dad98e9a5 --- /dev/null +++ b/controllers/devbox/internal/controller/utils/registry/client_test.go @@ -0,0 +1,61 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package registry + +import "testing" + +func TestClient_TagImage(t1 *testing.T) { + type fields struct { + Username string + Password string + } + type args struct { + hostName string + imageName string + oldTag string + newTag string + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "Test1", + fields: fields{ + Username: "admin", + Password: "passw0rd", + }, + args: args{ + hostName: "sealos.hub:5000", + imageName: "default/devbox-sample", + oldTag: "2024-08-21-072021", + newTag: "test", + }, + }, + } + for _, tt := range tests { + t1.Run(tt.name, func(t1 *testing.T) { + t := &Client{ + Username: tt.fields.Username, + Password: tt.fields.Password, + } + if err := t.TagImage(tt.args.hostName, tt.args.imageName, tt.args.oldTag, tt.args.newTag); (err != nil) != tt.wantErr { + t1.Errorf("TagImage() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/controllers/devbox/label/label.go b/controllers/devbox/label/label.go new file mode 100644 index 00000000000..2fefb432eaf --- /dev/null +++ b/controllers/devbox/label/label.go @@ -0,0 +1,68 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package label + +type Recommended struct { + Name string + Instance string + Version string + Component string + PartOf string + ManagedBy string +} + +const ( + AppName AppKey = "app.kubernetes.io/name" + AppInstance AppKey = "app.kubernetes.io/instance" + AppVersion AppKey = "app.kubernetes.io/version" + AppComponent AppKey = "app.kubernetes.io/component" + AppPartOf AppKey = "app.kubernetes.io/part-of" + AppManagedBy AppKey = "app.kubernetes.io/managed-by" +) + +type AppKey = string + +const ( + DefaultManagedBy = "sealos" +) + +func (r *Recommended) Labels() map[string]string { + ret := map[string]string{} + + if r.Name != "" { + ret[AppName] = r.Name + } + if r.Instance != "" { + ret[AppInstance] = r.Instance + } + if r.Version != "" { + ret[AppVersion] = r.Version + } + if r.Component != "" { + ret[AppComponent] = r.Component + } + if r.PartOf != "" { + ret[AppPartOf] = r.PartOf + } + if r.ManagedBy != "" { + ret[AppManagedBy] = r.ManagedBy + } + + return ret +} + +func RecommendedLabels(r *Recommended) map[string]string { + return r.Labels() +} diff --git a/controllers/devbox/test/e2e/e2e_suite_test.go b/controllers/devbox/test/e2e/e2e_suite_test.go new file mode 100644 index 00000000000..5b0fa098fd7 --- /dev/null +++ b/controllers/devbox/test/e2e/e2e_suite_test.go @@ -0,0 +1,32 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e + +import ( + "fmt" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +// Run e2e tests using the Ginkgo runner. +func TestE2E(t *testing.T) { + RegisterFailHandler(Fail) + _, _ = fmt.Fprintf(GinkgoWriter, "Starting devbox suite\n") + RunSpecs(t, "e2e suite") +} diff --git a/controllers/devbox/test/e2e/e2e_test.go b/controllers/devbox/test/e2e/e2e_test.go new file mode 100644 index 00000000000..3ac1d3b8c9b --- /dev/null +++ b/controllers/devbox/test/e2e/e2e_test.go @@ -0,0 +1,122 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e + +import ( + "fmt" + "os/exec" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/labring/sealos/controllers/devbox/test/utils" +) + +const namespace = "devbox-system" + +var _ = Describe("controller", Ordered, func() { + BeforeAll(func() { + By("installing prometheus operator") + Expect(utils.InstallPrometheusOperator()).To(Succeed()) + + By("installing the cert-manager") + Expect(utils.InstallCertManager()).To(Succeed()) + + By("creating manager namespace") + cmd := exec.Command("kubectl", "create", "ns", namespace) + _, _ = utils.Run(cmd) + }) + + AfterAll(func() { + By("uninstalling the Prometheus manager bundle") + utils.UninstallPrometheusOperator() + + By("uninstalling the cert-manager bundle") + utils.UninstallCertManager() + + By("removing manager namespace") + cmd := exec.Command("kubectl", "delete", "ns", namespace) + _, _ = utils.Run(cmd) + }) + + Context("Operator", func() { + It("should run successfully", func() { + var controllerPodName string + var err error + + // projectimage stores the name of the image used in the example + var projectimage = "example.com/devbox:v0.0.1" + + By("building the manager(Operator) image") + cmd := exec.Command("make", "docker-build", fmt.Sprintf("IMG=%s", projectimage)) + _, err = utils.Run(cmd) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + By("loading the the manager(Operator) image on Kind") + err = utils.LoadImageToKindClusterWithName(projectimage) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + By("installing CRDs") + cmd = exec.Command("make", "install") + _, err = utils.Run(cmd) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + By("deploying the controller-manager") + cmd = exec.Command("make", "deploy", fmt.Sprintf("IMG=%s", projectimage)) + _, err = utils.Run(cmd) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + By("validating that the controller-manager pod is running as expected") + verifyControllerUp := func() error { + // Get pod name + + cmd = exec.Command("kubectl", "get", + "pods", "-l", "control-plane=controller-manager", + "-o", "go-template={{ range .items }}"+ + "{{ if not .metadata.deletionTimestamp }}"+ + "{{ .metadata.name }}"+ + "{{ \"\\n\" }}{{ end }}{{ end }}", + "-n", namespace, + ) + + podOutput, err := utils.Run(cmd) + ExpectWithOffset(2, err).NotTo(HaveOccurred()) + podNames := utils.GetNonEmptyLines(string(podOutput)) + if len(podNames) != 1 { + return fmt.Errorf("expect 1 controller pods running, but got %d", len(podNames)) + } + controllerPodName = podNames[0] + ExpectWithOffset(2, controllerPodName).Should(ContainSubstring("controller-manager")) + + // Validate pod status + cmd = exec.Command("kubectl", "get", + "pods", controllerPodName, "-o", "jsonpath={.status.phase}", + "-n", namespace, + ) + status, err := utils.Run(cmd) + ExpectWithOffset(2, err).NotTo(HaveOccurred()) + if string(status) != "Running" { + return fmt.Errorf("controller pod in %s status", status) + } + return nil + } + EventuallyWithOffset(1, verifyControllerUp, time.Minute, time.Second).Should(Succeed()) + + }) + }) +}) diff --git a/controllers/devbox/test/utils/utils.go b/controllers/devbox/test/utils/utils.go new file mode 100644 index 00000000000..547897ca71f --- /dev/null +++ b/controllers/devbox/test/utils/utils.go @@ -0,0 +1,140 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package utils + +import ( + "fmt" + "os" + "os/exec" + "strings" + + v2 "github.com/onsi/ginkgo/v2" +) + +const ( + prometheusOperatorVersion = "v0.72.0" + prometheusOperatorURL = "https://github.com/prometheus-operator/prometheus-operator/" + + "releases/download/%s/bundle.yaml" + + certmanagerVersion = "v1.14.4" + certmanagerURLTmpl = "https://github.com/jetstack/cert-manager/releases/download/%s/cert-manager.yaml" +) + +func warnError(err error) { + _, _ = fmt.Fprintf(v2.GinkgoWriter, "warning: %v\n", err) +} + +// InstallPrometheusOperator installs the prometheus Operator to be used to export the enabled metrics. +func InstallPrometheusOperator() error { + url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) + cmd := exec.Command("kubectl", "create", "-f", url) + _, err := Run(cmd) + return err +} + +// Run executes the provided command within this context +func Run(cmd *exec.Cmd) ([]byte, error) { + dir, _ := GetProjectDir() + cmd.Dir = dir + + if err := os.Chdir(cmd.Dir); err != nil { + _, _ = fmt.Fprintf(v2.GinkgoWriter, "chdir dir: %s\n", err) + } + + cmd.Env = append(os.Environ(), "GO111MODULE=on") + command := strings.Join(cmd.Args, " ") + _, _ = fmt.Fprintf(v2.GinkgoWriter, "running: %s\n", command) + output, err := cmd.CombinedOutput() + if err != nil { + return output, fmt.Errorf("%s failed with error: (%v) %s", command, err, string(output)) + } + + return output, nil +} + +// UninstallPrometheusOperator uninstalls the prometheus +func UninstallPrometheusOperator() { + url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) + cmd := exec.Command("kubectl", "delete", "-f", url) + if _, err := Run(cmd); err != nil { + warnError(err) + } +} + +// UninstallCertManager uninstalls the cert manager +func UninstallCertManager() { + url := fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion) + cmd := exec.Command("kubectl", "delete", "-f", url) + if _, err := Run(cmd); err != nil { + warnError(err) + } +} + +// InstallCertManager installs the cert manager bundle. +func InstallCertManager() error { + url := fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion) + cmd := exec.Command("kubectl", "apply", "-f", url) + if _, err := Run(cmd); err != nil { + return err + } + // Wait for cert-manager-webhook to be ready, which can take time if cert-manager + // was re-installed after uninstalling on a cluster. + cmd = exec.Command("kubectl", "wait", "deployment.apps/cert-manager-webhook", + "--for", "condition=Available", + "--namespace", "cert-manager", + "--timeout", "5m", + ) + + _, err := Run(cmd) + return err +} + +// LoadImageToKindClusterWithName loads a local docker image to the kind cluster +func LoadImageToKindClusterWithName(name string) error { + cluster := "kind" + if v, ok := os.LookupEnv("KIND_CLUSTER"); ok { + cluster = v + } + kindOptions := []string{"load", "docker-image", name, "--name", cluster} + cmd := exec.Command("kind", kindOptions...) + _, err := Run(cmd) + return err +} + +// GetNonEmptyLines converts given command output string into individual objects +// according to line breakers, and ignores the empty elements in it. +func GetNonEmptyLines(output string) []string { + var res []string + elements := strings.Split(output, "\n") + for _, element := range elements { + if element != "" { + res = append(res, element) + } + } + + return res +} + +// GetProjectDir will return the directory where the project is +func GetProjectDir() (string, error) { + wd, err := os.Getwd() + if err != nil { + return wd, err + } + wd = strings.Replace(wd, "/test/e2e", "", -1) + return wd, nil +} diff --git a/controllers/go.work b/controllers/go.work index b96b9d81138..12c0228054b 100644 --- a/controllers/go.work +++ b/controllers/go.work @@ -1,11 +1,12 @@ -go 1.22 +go 1.22.0 -toolchain go1.22.3 +toolchain go1.22.4 use ( ./account ./app ./db/adminer + ./devbox ./job/heartbeat ./job/init ./license @@ -16,3 +17,12 @@ use ( ./terminal ./user ) + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) diff --git a/controllers/go.work.sum b/controllers/go.work.sum index a6982759023..9dc87898ef1 100644 --- a/controllers/go.work.sum +++ b/controllers/go.work.sum @@ -1,506 +1,528 @@ -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/accessapproval v1.6.0 h1:x0cEHro/JFPd7eS4BlEWNTMecIj2HdXjOVB5BtvwER0= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= cloud.google.com/go/accesscontextmanager v1.7.0 h1:MG60JgnEoawHJrbWw0jGdv6HLNSf6gQvYRiXpuzqgEA= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= cloud.google.com/go/aiplatform v1.37.0 h1:zTw+suCVchgZyO+k847wjzdVjWmrAuehxdvcZvJwfGg= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.58.0 h1:xyCAfpI4yUMOQ4VtHN/bdmxPQ8xoEkTwFM1nbVmuQhs= +cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= cloud.google.com/go/analytics v0.19.0 h1:LqAo3tAh2FU9+w/r7vc3hBjU23Kv7GhO/PDIW7kIYgM= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.22.0 h1:w8KIgW8NRUHFVKjpkwCpLaHsr685tJ+ckPStOaSCZz0= +cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= cloud.google.com/go/apigateway v1.5.0 h1:ZI9mVO7x3E9RK/BURm2p1aw9YTBSCQe3klmyP1WxWEg= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= cloud.google.com/go/apigeeconnect v1.5.0 h1:sWOmgDyAsi1AZ48XRHcATC0tsi9SkPT7DA/+VCfkaeA= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= cloud.google.com/go/apigeeregistry v0.6.0 h1:E43RdhhCxdlV+I161gUY2rI4eOaMzHTA5kNkvRsFXvc= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.7.1 h1:aBGDKmRIaRRoWJ2tAoN0oVSHoWLhtO9aj/NvUyP4aYs= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= cloud.google.com/go/area120 v0.7.1 h1:ugckkFh4XkHJMPhTIx0CyvdoBxmOpMe8rNs4Ok8GAag= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= cloud.google.com/go/artifactregistry v1.13.0 h1:o1Q80vqEB6Qp8WLEH3b8FBLNUCrGQ4k5RFj0sn/sgO8= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= cloud.google.com/go/asset v1.13.0 h1:YAsssO08BqZ6mncbb6FPlj9h6ACS7bJQUOlzciSfbNk= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/asset v1.17.0 h1:dLWfTnbwyrq/Kt8Tr2JiAbre1MEvS2Bl5cAMiYAy5Pg= +cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= cloud.google.com/go/assuredworkloads v1.10.0 h1:VLGnVFta+N4WM+ASHbhc14ZOItOabDLH1MSoDv+Xuag= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= cloud.google.com/go/automl v1.12.0 h1:50VugllC+U4IGl3tDNcZaWvApHBTrn/TvyHDJ0wM+Uw= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= cloud.google.com/go/baremetalsolution v0.5.0 h1:2AipdYXL0VxMboelTTw8c1UJ7gYu35LZYUbuRv9Q28s= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= cloud.google.com/go/batch v0.7.0 h1:YbMt0E6BtqeD5FvSv1d56jbVsWEzlGm55lYte+M6Mzs= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/batch v1.7.0 h1:AxuSPoL2fWn/rUyvWeNCNd0V2WCr+iHRCU9QO1PUmpY= +cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= cloud.google.com/go/beyondcorp v0.5.0 h1:UkY2BTZkEUAVrgqnSdOJ4p3y9ZRBPEe1LkjgC8Bj/Pc= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.50.0 h1:RscMV6LbnAmhAzD893Lv9nXXy2WCaJmbxYPWDLbGqNQ= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +cloud.google.com/go/bigquery v1.58.0 h1:drSd9RcPVLJP2iFMimvOB9SCSIrcl+9HD4II03Oy7A0= +cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= cloud.google.com/go/billing v1.13.0 h1:JYj28UYF5w6VBAh0gQYlgHJ/OD1oA+JgW29YZQU+UHM= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/billing v1.18.0 h1:GvKy4xLy1zF1XPbwP5NJb2HjRxhnhxjjXxvyZ1S/IAo= +cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= cloud.google.com/go/binaryauthorization v1.5.0 h1:d3pMDBCCNivxt5a4eaV7FwL7cSH0H7RrEnFrTb1QKWs= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/binaryauthorization v1.8.0 h1:PHS89lcFayWIEe0/s2jTBiEOtqghCxzc7y7bRNlifBs= +cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= cloud.google.com/go/certificatemanager v1.6.0 h1:5C5UWeSt8Jkgp7OWn2rCkLmYurar/vIWIoSQ2+LaTOc= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= cloud.google.com/go/channel v1.12.0 h1:GpcQY5UJKeOekYgsX3QXbzzAc/kRGtBq43fTmyKe6Uw= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/channel v1.17.4 h1:yYHOORIM+wkBy3EdwArg/WL7Lg+SoGzlKH9o3Bw2/jE= +cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= cloud.google.com/go/cloudbuild v1.9.0 h1:GHQCjV4WlPPVU/j3Rlpc8vNIDwThhd1U9qSY/NPZdko= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= +cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= cloud.google.com/go/clouddms v1.5.0 h1:E7v4TpDGUyEm1C/4KIrpVSOCTm0P6vWdHT0I4mostRA= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= cloud.google.com/go/cloudtasks v1.10.0 h1:uK5k6abf4yligFgYFnG0ni8msai/dSv6mDmiBulU0hU= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/contactcenterinsights v1.6.0 h1:jXIpfcH/VYSE1SYcPzO0n1VVb+sAamiLOgCw45JbOQk= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.12.1 h1:EiGBeejtDDtr3JXt9W7xlhXyZ+REB5k2tBgVPVtmNb0= +cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= cloud.google.com/go/container v1.15.0 h1:NKlY/wCDapfVZlbVVaeuu2UZZED5Dy1z4Zx1KhEzm8c= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.29.0 h1:jIltU529R2zBFvP8rhiG1mgeTcnT27KhU0H/1d6SQRg= +cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= cloud.google.com/go/containeranalysis v0.9.0 h1:EQ4FFxNaEAg8PqQCO7bVQfWz9NVwZCUKaM1b3ycfx3U= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= cloud.google.com/go/datacatalog v1.13.0 h1:4H5IJiyUE0X6ShQBqgFFZvGGcrwGVndTwUSLP4c52gw= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/datacatalog v1.19.2 h1:BV5sB7fPc8ccv/obwtHwQtCdLMAgI4KyaQWfkh8/mWg= +cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= cloud.google.com/go/dataflow v0.8.0 h1:eYyD9o/8Nm6EttsKZaEGD84xC17bNgSKCu0ZxwqUbpg= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= cloud.google.com/go/dataform v0.7.0 h1:Dyk+fufup1FR6cbHjFpMuP4SfPiF3LI3JtoIIALoq48= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= cloud.google.com/go/datafusion v1.6.0 h1:sZjRnS3TWkGsu1LjYPFD/fHeMLZNXDK6PDHi2s2s/bk= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= cloud.google.com/go/datalabeling v0.7.0 h1:ch4qA2yvddGRUrlfwrNJCr79qLqhS9QBwofPHfFlDIk= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= cloud.google.com/go/dataplex v1.6.0 h1:RvoZ5T7gySwm1CHzAw7yY1QwwqaGswunmqEssPxU/AM= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.14.0 h1:/WhVTR4v/L6ACKjlz/9CqkxkrVh2z7C44CLMUf0f60A= +cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= +cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= cloud.google.com/go/dataqna v0.7.0 h1:yFzi/YU4YAdjyo7pXkBE2FeHbgz5OQQBVDdbErEHmVQ= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/datastore v1.11.0 h1:iF6I/HaLs3Ado8uRKMvZRvF/ZLkWaWE9i8AiHzbC774= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.7.0 h1:BBCBTnWMDwwEzQQmipUXxATa7Cm7CA/gKjKcR2w35T0= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= cloud.google.com/go/deploy v1.8.0 h1:otshdKEbmsi1ELYeCKNYppwV0UH5xD05drSdBm7ouTk= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.17.0 h1:P3SgJ+4rAktC2XqaI10G0ip/vzWluNBrC5VG0abMbLw= +cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= cloud.google.com/go/dialogflow v1.32.0 h1:uVlKKzp6G/VtSW0E7IH1Y5o0H48/UOCmqksG2riYCwQ= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dialogflow v1.48.1 h1:1Uq2jDJzjJ3M4xYB608FCCFHfW3JmrTmHIxRSd7JGmY= +cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= cloud.google.com/go/dlp v1.9.0 h1:1JoJqezlgu6NWCroBxr4rOZnwNFILXr4cB9dMaSKO4A= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= cloud.google.com/go/documentai v1.18.0 h1:KM3Xh0QQyyEdC8Gs2vhZfU+rt6OCPF0dwVwxKgLmWfI= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.23.7 h1:hlYieOXUwiJ7HpBR/vEPfr8nfSxveLVzbqbUkSK0c/4= +cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= cloud.google.com/go/domains v0.8.0 h1:2ti/o9tlWL4N+wIuWUNH+LbfgpwxPr8J1sv9RHA4bYQ= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= cloud.google.com/go/edgecontainer v1.0.0 h1:O0YVE5v+O0Q/ODXYsQHmHb+sYM8KNjGZw2pjX2Ws41c= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.5.0 h1:gIzEhCoOT7bi+6QZqZIzX1Erj4SswMPIteNvYVlu+pM= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= cloud.google.com/go/eventarc v1.11.0 h1:fsJmNeqvqtk74FsaVDU6cH79lyZNCYP8Rrv7EhaB/PU= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q0J4= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= cloud.google.com/go/filestore v1.6.0 h1:ckTEXN5towyTMu4q0uQ1Mde/JwTHur0gXs8oaIZnKfw= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= +cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/firestore v1.12.0 h1:aeEA/N7DW7+l2u5jtkO8I0qv0D95YwjggD8kUHrTHO4= cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/functions v1.13.0 h1:pPDqtsXG2g9HeOQLoquLbmvmb82Y4Ezdo1GXuotFoWg= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= cloud.google.com/go/gaming v1.9.0 h1:7vEhFnZmd931Mo7sZ6pJy7uQPDxF7m7v8xtBheG08tc= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= cloud.google.com/go/gkebackup v0.4.0 h1:za3QZvw6ujR0uyqkhomKKKNoXDyqYGPJies3voUK8DA= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= cloud.google.com/go/gkeconnect v0.7.0 h1:gXYKciHS/Lgq0GJ5Kc9SzPA35NGc3yqu6SkjonpEr2Q= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= cloud.google.com/go/gkehub v0.12.0 h1:TqCSPsEBQ6oZSJgEYZ3XT8x2gUadbvfwI32YB0kuHCs= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= cloud.google.com/go/gkemulticloud v0.5.0 h1:8I84Q4vl02rJRsFiinBxl7WCozfdLlUVBQuSrqr9Wtk= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.1.0 h1:C2Suwn3uPz+Yy0bxVjTlsMrUCaDovkgvfdyIa+EnUOU= +cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= cloud.google.com/go/gsuiteaddons v1.5.0 h1:1mvhXqJzV0Vg5Fa95QwckljODJJfDFXV4pn+iL50zzA= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iap v1.7.1 h1:PxVHFuMxmSZyfntKXHXhd8bo82WJ+LcATenq7HLdVnU= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= cloud.google.com/go/ids v1.3.0 h1:fodnCDtOXuMmS8LTC2y3h8t24U8F3eKWfhi+3LY6Qf0= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= cloud.google.com/go/iot v1.6.0 h1:39W5BFSarRNZfVG0eXI5LYux+OVQT8GkgpHCnrZL2vM= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= cloud.google.com/go/kms v1.10.1 h1:7hm1bRqGCA1GBRQUrp831TwJ9TWhP+tvLuP497CQS2g= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= cloud.google.com/go/language v1.9.0 h1:7Ulo2mDk9huBoBi8zCE3ONOoBrL6UXfAI71CLQ9GEIM= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= cloud.google.com/go/lifesciences v0.8.0 h1:uWrMjWTsGjLZpCTWEAzYvyXj+7fhiZST45u9AgasasI= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= +cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/managedidentities v1.5.0 h1:ZRQ4k21/jAhrHBVKl/AY7SjgzeJwG1iZa+mJ82P+VNg= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= cloud.google.com/go/maps v0.7.0 h1:mv9YaczD4oZBZkM5XJl6fXQ984IkJNHPwkc8MUsdkBo= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/maps v1.6.3 h1:Qqs6Dza+PRp5CZO5AfgPnLwU1k3pp0IMFRDtLpT+aCA= +cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= cloud.google.com/go/mediatranslation v0.7.0 h1:anPxH+/WWt8Yc3EdoEJhPMBRF7EhIdz426A+tuoA0OU= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= cloud.google.com/go/memcache v1.9.0 h1:8/VEmWCpnETCrBwS3z4MhT+tIdKgR1Z4Tr2tvYH32rg= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= cloud.google.com/go/metastore v1.10.0 h1:QCFhZVe2289KDBQ7WxaHV2rAmPrmRAdLC6gbjUd3HPo= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= cloud.google.com/go/monitoring v1.13.0 h1:2qsrgXGVoRXpP7otZ14eE1I568zAa92sJSDPyOJvwjM= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/monitoring v1.17.0 h1:blrdvF0MkPPivSO041ihul7rFMhXdVp8Uq7F59DKXTU= +cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= cloud.google.com/go/networkconnectivity v1.11.0 h1:ZD6b4Pk1jEtp/cx9nx0ZYcL3BKqDa+KixNDZ6Bjs1B8= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= cloud.google.com/go/networkmanagement v1.6.0 h1:8KWEUNGcpSX9WwZXq7FtciuNGPdPdPN/ruDm769yAEM= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= cloud.google.com/go/networksecurity v0.8.0 h1:sOc42Ig1K2LiKlzG71GUVloeSJ0J3mffEBYmvu+P0eo= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= cloud.google.com/go/notebooks v1.8.0 h1:Kg2K3K7CbSXYJHZ1aGQpf1xi5x2GUvQWf2sFVuiZh8M= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= cloud.google.com/go/optimization v1.3.1 h1:dj8O4VOJRB4CUwZXdmwNViH1OtI0WtWL867/lnYH248= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= cloud.google.com/go/orchestration v1.6.0 h1:Vw+CEXo8M/FZ1rb4EjcLv0gJqqw89b7+g+C/EmniTb8= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= cloud.google.com/go/orgpolicy v1.10.0 h1:XDriMWug7sd0kYT1QKofRpRHzjad0bK8Q8uA9q+XrU4= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/orgpolicy v1.12.0 h1:sab7cDiyfdthpAL0JkSpyw1C3mNqkXToVOhalm79PJQ= +cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= cloud.google.com/go/osconfig v1.11.0 h1:PkSQx4OHit5xz2bNyr11KGcaFccL5oqglFPdTboyqwQ= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= cloud.google.com/go/oslogin v1.9.0 h1:whP7vhpmc+ufZa90eVpkfbgzJRK/Xomjz+XCD4aGwWw= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/oslogin v1.13.0 h1:gbA/G4p+youIR4O/Rk6DU181QlBlpwPS16kvJwqEz8o= +cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= cloud.google.com/go/phishingprotection v0.7.0 h1:l6tDkT7qAEV49MNEJkEJTB6vOO/onbSOcNtAT09HPuA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= cloud.google.com/go/policytroubleshooter v1.6.0 h1:yKAGC4p9O61ttZUswaq9GAn1SZnEzTd0vUYXD7ZBT7Y= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= cloud.google.com/go/privatecatalog v0.8.0 h1:EPEJ1DpEGXLDnmc7mnCAqFmkwUJbIsaLAiLHVOkkwtc= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= cloud.google.com/go/pubsub v1.30.0 h1:vCge8m7aUKBJYOgrZp7EsNDf6QMd2CAlXZqWTn3yq6s= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= +cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= cloud.google.com/go/pubsublite v1.7.0 h1:cb9fsrtpINtETHiJ3ECeaVzrfIVhcGjhhJEjybHXHao= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0 h1:6iOCujSNJ0YS7oNymI64hXsjGq60T4FK1zdLugxbzvU= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0 h1:Zrd4LvT9PaW91X/Z13H0i5RKEv9suCLuk8zp+bfOpN4= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= cloud.google.com/go/recommendationengine v0.7.0 h1:VibRFCwWXrFebEWKHfZAt2kta6pS7Tlimsnms0fjv7k= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= cloud.google.com/go/recommender v1.9.0 h1:ZnFRY5R6zOVk2IDS1Jbv5Bw+DExCI5rFumsTnMXiu/A= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/recommender v1.12.0 h1:tC+ljmCCbuZ/ybt43odTFlay91n/HLIhflvaOeb0Dh4= +cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= cloud.google.com/go/redis v1.11.0 h1:JoAd3SkeDt3rLFAAxEvw6wV4t+8y4ZzfZcZmddqphQ8= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= cloud.google.com/go/resourcemanager v1.7.0 h1:NRM0p+RJkaQF9Ee9JMnUV9BQ2QBIOq/v8M+Pbv/wmCs= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= cloud.google.com/go/resourcesettings v1.5.0 h1:8Dua37kQt27CCWHm4h/Q1XqCF6ByD7Ouu49xg95qJzI= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= cloud.google.com/go/retail v1.12.0 h1:1Dda2OpFNzIb4qWgFZjYlpP7sxX3aLeypKG6A3H4Yys= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= cloud.google.com/go/run v0.9.0 h1:ydJQo+k+MShYnBfhaRHSZYeD/SQKZzZLAROyfpeD9zw= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= cloud.google.com/go/scheduler v1.9.0 h1:NpQAHtx3sulByTLe2dMwWmah8PWgeoieFPpJpArwFV0= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= +cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= cloud.google.com/go/secretmanager v1.10.0 h1:pu03bha7ukxF8otyPKTFdDz+rr9sE3YauS5PliDXK60= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= cloud.google.com/go/security v1.13.0 h1:PYvDxopRQBfYAXKAuDpFCKBvDOWPWzp9k/H5nB3ud3o= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= cloud.google.com/go/securitycenter v1.19.0 h1:AF3c2s3awNTMoBtMX3oCUoOMmGlYxGOeuXSYHNBkf14= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/securitycenter v1.24.3 h1:crdn2Z2rFIy8WffmmhdlX3CwZJusqCiShtnrGFRwpeE= +cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.9.0 h1:SJwk0XX2e26o25ObYUORXx6torSFiYgsGkWSkZgkoSU= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.6.0 h1:wT0Uw7ib7+AgZST9eCDygwTJn4+bHMDtZo5fh7kGWDU= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= cloud.google.com/go/spanner v1.45.0 h1:7VdjZ8zj4sHbDw55atp5dfY6kn1j9sam9DRNpPQhqR4= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= +cloud.google.com/go/spanner v1.55.0 h1:YF/A/k73EMYCjp8wcJTpkE+TcrWutHRlsCtlRSfWS64= +cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= cloud.google.com/go/speech v1.15.0 h1:JEVoWGNnTF128kNty7T4aG4eqv2z86yiMJPT9Zjp+iw= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= +cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= cloud.google.com/go/storagetransfer v1.8.0 h1:5T+PM+3ECU3EY2y9Brv0Sf3oka8pKmsCfpQ07+91G9o= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= cloud.google.com/go/talent v1.5.0 h1:nI9sVZPjMKiO2q3Uu0KhTDVov3Xrlpt63fghP9XjyEM= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= cloud.google.com/go/texttospeech v1.6.0 h1:H4g1ULStsbVtalbZGktyzXzw6jP26RjVGYx9RaYjBzc= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= cloud.google.com/go/tpu v1.5.0 h1:/34T6CbSi+kTv5E19Q9zbU/ix8IviInZpzwz3rsFE+A= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= cloud.google.com/go/trace v1.9.0 h1:olxC0QHC59zgJVALtgqfD9tGk0lfeCP5/AGXL3Px/no= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= cloud.google.com/go/translate v1.7.0 h1:GvLP4oQ4uPdChBmBaUSa/SaZxCdyWELtlAaKzpHsXdA= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.10.0 h1:tncNaKmlZnayMMRX/mMM2d5AJftecznnxVBD4w070NI= +cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= cloud.google.com/go/video v1.15.0 h1:upIbnGI0ZgACm58HPjAeBMleW3sl5cT84AbYQ8PWOgM= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= cloud.google.com/go/videointelligence v1.10.0 h1:Uh5BdoET8XXqXX2uXIahGb+wTKbLkGH7s4GXR58RrG8= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.7.0 h1:8C8RXUJoflCI4yVdqhTy9tRyygSHmp60aP363z23HKg= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= cloud.google.com/go/vmmigration v1.6.0 h1:Azs5WKtfOC8pxvkyrDvt7J0/4DYBch0cVbuFfCCFt5k= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= cloud.google.com/go/vmwareengine v0.3.0 h1:b0NBu7S294l0gmtrT0nOJneMYgZapr5x9tVWvgDoVEM= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmXJ+EjTA= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= cloud.google.com/go/vpcaccess v1.6.0 h1:FOe6CuiQD3BhHJWt7E8QlbBcaIzVRddupwJlp7eqmn4= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= cloud.google.com/go/webrisk v1.8.0 h1:IY+L2+UwxcVm2zayMAtBhZleecdIFLiC+QJMzgb0kT0= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= cloud.google.com/go/websecurityscanner v1.5.0 h1:AHC1xmaNMOZtNqxI9Rmm87IJEyPaRkOxeI0gpAacXGk= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= cloud.google.com/go/workflows v1.10.0 h1:FfGp9w0cYnaKZJhUOMqCOJCYT/WlvYBfTQhFWV3sRKI= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e h1:GwCVItFUPxwdsEYnlUcJ6PJxOjTeFFCKOh6QWg4oAzQ= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e/go.mod h1:ApHceQLLwcOkCEXM1+DyCXTHEJhNGDpJ2kmV6axsx24= +cuelang.org/go v0.8.0 h1:fO1XPe/SUGtc7dhnGnTPbpIDoQm/XxhDtoSF7jzO01c= +cuelang.org/go v0.8.0/go.mod h1:CoDbYolfMms4BhWUlhD+t5ORnihR7wvjcfgyO9lL5FI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= +github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.12.0-rc.0 h1:wX/F5huJxH9APBkhKSEAqaiZsuBvbbDnyBROZAqsSaY= @@ -510,61 +532,85 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/Shopify/sarama v1.30.1 h1:z47lP/5PBw2UVKf1lvfS5uWXaJws6ggk9PLnKEHtZiQ= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae h1:ePgznFqEG1v3AjMklnK8H7BSc++FDSo7xfK9K7Af+0Y= +github.com/StudioSol/set v1.0.0 h1:G27J71la+Da08WidabBkoRrvPLTa4cdCn0RjvyJ5WKQ= +github.com/StudioSol/set v1.0.0/go.mod h1:hIUNZPo6rEGF43RlPXHq7Fjmf+HkVJBqAjtK7Z9LoIU= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/ahmetb/gen-crd-api-reference-docs v0.3.0 h1:+XfOU14S4bGuwyvCijJwhhBIjYN+YXS18jrCY2EzJaY= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= -github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 h1:45bxf7AZMwWcqkLzDAQugVEwedisr5nRJ1r+7LYnv0U= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/authzed/controller-idioms v0.7.0 h1:HhNMUBb8hJzYqY3mhen3B2AC5nsIem3fBe0tC/AAOHo= +github.com/authzed/controller-idioms v0.7.0/go.mod h1:0B/PmqCguKv8b3azSMF+HdyKpKr2o3UAZ5eo12Ze8Fo= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= +github.com/aws/aws-sdk-go v1.44.257/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.50.8 h1:gY0WoOW+/Wz6XmYSgDH9ge3wnAevYDSQWPxxJvqAkP4= +github.com/aws/aws-sdk-go v1.50.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.9.1 h1:ZbovGV/qo40nrOJ4q8G33AGICzaPI45FHQWJ9650pF4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd h1:jZtX5jh5IOMu0fpOTC3ayh6QGSPJ/KWOv1lgPvbRw1M= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542 h1:nYXb+3jF6Oq/j8R/y90XrKpreCxIalBWfeyeKymgOPk= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bhmj/jsonslice v1.1.2 h1:Lzen2S9iG3HsESpiIAnTM7Obs1QiTz83ZXa5YrpTTWI= +github.com/bhmj/jsonslice v1.1.2/go.mod h1:O3ZoA0zdEefdbk1dkU5aWPOA36zQhhS/HV6RQFLTlnU= +github.com/bhmj/xpression v0.9.1 h1:N7bX/nWx9oFi/zsiMTx2ehoRApTDAWdQadq/5o2wMGk= +github.com/bhmj/xpression v0.9.1/go.mod h1:j9oYmEXJjeL9mrgW1+ZDBKJXnbupsCPGhlO9J5YhS1Q= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= github.com/bketelsen/crypt v0.0.4 h1:w/jqZtC9YD4DS/Vp9GhWfWcCpuAL58oTnLoI8vE9YHU= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737 h1:rRISKWyXfVxvoa702s91Zl5oREZTrR3yv+tXrrX7G/g= +github.com/bshuster-repo/logrus-logstash-hook v1.0.2 h1:JYRWo+QGnQdedgshosug9hxpPYTB9oJ1ZZD3fY31alU= +github.com/bshuster-repo/logrus-logstash-hook v1.0.2/go.mod h1:HgYntJprnHSPaF9VPPPLP1L5S1vMWxRfa1J+vzDrDTw= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/bugsnag/bugsnag-go v2.1.2+incompatible h1:E7dor84qzwUO8KdCM68CZwq9QOSR7HXlLx3Wj5vui2s= +github.com/bugsnag/bugsnag-go v2.1.2+incompatible/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/panicwrap v1.3.4 h1:A6sXFtDGsgU/4BLf5JT0o5uYg3EeKgGx3Sfs+/uk3pU= +github.com/bugsnag/panicwrap v1.3.4/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin v1.7.0 h1:PuzlE8w0JBg/DhIqnkF1Dewf3z+qmUZMVN07PonvVUQ= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= @@ -580,18 +626,15 @@ github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= +github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= @@ -602,27 +645,61 @@ github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARu github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.7.0 h1:G/ZQr3gMZs6ZT0qPUZ15znx5QSdQdASW11nXTLTM2Pg= github.com/containerd/containerd v1.7.0/go.mod h1:QfR7Efgb/6X2BDpTPJRvPTYDE9rsF0FsXX9J8sIs/sc= +github.com/containerd/containerd v1.7.6/go.mod h1:SY6lrkkuJT40BVNO37tlYTSnKJnP5AXBc0fhx0q+TJ4= +github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= +github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containers/common v0.55.4 h1:7IxB/G5qtDU+rp1YiVWkDpd+ZC4ZlCQ7k2jZJYkB/R8= +github.com/containers/common v0.55.4/go.mod h1:5mVCpfMBWyO+zaD7Fw+DBHFa42YFKROwle1qpEKcX3U= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d h1:OMrhQqj1QCyDT2sxHCDjE+k8aMdn2ngTCGG7g4wrdLo= github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808 h1:8s2l8TVUwMXl6tZMe3+hPCRJ25nQXiA3d1x622JtOqc= github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a h1:Y5XsLCEhtEI8qbD9RP3Qlv5FXdTDHxZM9UPUnMRgBp8= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 h1:Lgdd/Qp96Qj8jqLpq2cI1I1X7BJnu06efS+XkhRoLUQ= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= +github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= +github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= +github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= +github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go-connections v0.4.1-0.20190612165340-fd1b1942c4d5 h1:2o8D0hdBky229bNnc7a8bAZkeVMpH4qsp2Rmt4g/+Zk= +github.com/docker/go-connections v0.4.1-0.20190612165340-fd1b1942c4d5/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -632,101 +709,114 @@ github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+ github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw= +github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fasthttp/router v1.4.20 h1:yPeNxz5WxZGojzolKqiP15DTXnxZce9Drv577GBrDgU= +github.com/fasthttp/router v1.4.20/go.mod h1:um867yNQKtERxBm+C+yzgWxjspTiQoA8z86Ec3fK/tc= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1 h1:dCrjGJRXIlbDsLAgTJZTjhwUJnnxVWl1OgNyYh5nyDc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 h1:WXb3TSNmHp2vHoCroCIB1foO/yQ36swABL8aOVeDpgg= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2 h1:cZqz+yOJ/R64LcKjNQOdARott/jP7BnUQ9Ah7KaZCvw= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/getkin/kin-openapi v0.76.0 h1:j77zg3Ec+k+r+GA3d8hBoXpAc6KX9TbBPrwQGBIy2sY= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c h1:iRTj5SRYwbvsygdwVp+y9kZT145Y1s6xOPpeOEIeGc4= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-gorp/gorp/v3 v3.0.5 h1:PUjzYdYu3HBOh8LE+UUmRG2P0IRDak9XMeGNvaeq4Ow= +github.com/go-gorp/gorp/v3 v3.0.5/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= +github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ= github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM= github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= @@ -734,18 +824,22 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= +github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 h1:JYghRBlGCZyCF2wNUJ8W0cwaQdtpcssJ4CgC406g+WU= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= github.com/hashicorp/consul/api v1.10.1 h1:MwZJp86nlnL+6+W1Zly4JUuVn9YHhMggBirMpHGD7kw= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= @@ -753,20 +847,38 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.8 h1:9Q2lu1YbbmiAgvYZ7Pr31RdlVonUpX+mmDL7Z7qTA2U= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.8/go.mod h1:qTCjxGig/kjuj3hk1z8pOUrzbse/GxB1tGfbrq8tGJg= github.com/hashicorp/go-memdb v1.3.2 h1:RBKHOsnSszpU6vxq80LzC2BaQjuuvoyaQbkLTf7V7g8= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.4.8 h1:CHGwpxYDOttQOY7HOWgETU9dyVjOXzniXDqJcYJE1zM= +github.com/hashicorp/go-plugin v1.4.8/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 h1:ET4pqyjiGmY09R5y+rSd70J2w45CtbWDNvGqWp/R3Ng= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.2/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2 h1:p4AKXPPS24tO8Wc8i1gLvSKdmkiSY5xuju57czJ/IJQ= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -778,17 +890,20 @@ github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG67 github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/vault/sdk v0.9.2 h1:H1kitfl1rG2SHbeGEyvhEqmIjVKE3E6c2q3ViKOs6HA= +github.com/hashicorp/vault/sdk v0.9.2/go.mod h1:gG0lA7P++KefplzvcD3vrfCmgxVAM7Z/SqX5NeOL/98= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c h1:rwmN+hgiyp8QyBqzdEX43lTjKAxaqCrYHaU5op5P9J8= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= @@ -798,58 +913,104 @@ github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZ github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/kopia/kopia v0.10.7 h1:6s0ZIZW3Ge2ozzefddASy7CIUadp/5tF9yCDKQfAKKI= +github.com/kopia/kopia v0.10.7/go.mod h1:0d9THPD+jwomPcXvPbCdmLyX6phQVP7AqcCcDEajfNA= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/kubernetes-csi/external-snapshotter/client/v3 v3.0.0 h1:OYDCOjVcx/5wNzlZ/At8otRibUlw0T6R0xOD31f32bw= +github.com/kubernetes-csi/external-snapshotter/client/v3 v3.0.0/go.mod h1:Q7VUue/CIrKbtpBdF04a1yjGGgsMaDws1HUxtjzgnEY= +github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA= +github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys= +github.com/kubernetes-csi/external-snapshotter/client/v6 v6.2.0 h1:cMM5AB37e9aRGjErygVT6EuBPB6s5a+l95OPERmSlVM= +github.com/kubernetes-csi/external-snapshotter/client/v6 v6.2.0/go.mod h1:VQVLCPGDX5l6V5PezjlDXLa+SpCbWSVU7B16cFWVVeE= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6 h1:wxyqOzKxsRJ6vVRL9sXQ64Z45wmBuQ+OTH9sLsC5rKc= github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.1 h1:keaAo8hRuAT0O3DfJ/wM3rufbAjGeJ1lAtWZHDjKGB0= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= @@ -859,52 +1020,76 @@ github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3 github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pashagolub/pgxmock/v2 v2.11.0 h1:ZUKqZy5Zf/5WJjAXHErjHngJBW5/3fEujGD+Cb0FuDI= +github.com/pashagolub/pgxmock/v2 v2.11.0/go.mod h1:D3YslkN/nJ4+umVqWmbwfSXugJIjPMChkGBG47OJpNw= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233 h1:jmJndGFBPjNWW+MAYarU/Nl8QrQVzbw4B/AYE0LzETo= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= +github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.71.0 h1:et+XkusxWLz+XNqZiyMom9tv9ACvNAUyLXti2LTiV7o= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.71.0/go.mod h1:3RiUkFmR9kmPZi9r/8a5jw0a9yg+LMmr7qa0wjqvSiI= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/protocolbuffers/txtpbfmt v0.0.0-20230328191034-3462fbc510c0 h1:sadMIsgmHpEOGbUs6VtHBXRR1OHevnj7hLx9ZcdNGW4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20230328191034-3462fbc510c0/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/replicatedhq/troubleshoot v0.57.0 h1:m9B31Mhgiz4Lwz+W4RvFkqhfYZLCwAqRPUwiwmSAAps= +github.com/replicatedhq/troubleshoot v0.57.0/go.mod h1:R5VdixzaBXfWLbP9mcLuZKs/bDCyGGS4+vFtKGWs9xE= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= +github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rubenv/sql-migrate v1.3.1 h1:Vx+n4Du8X8VTYuXbhNxdEUoh6wiJERA0GlWocR5FrbA= +github.com/rubenv/sql-migrate v1.3.1/go.mod h1:YzG/Vh82CwyhTFXy+Mf5ahAiiEOpAlHurg+23VEzcsk= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sagikazarmark/crypt v0.10.0 h1:96E1qrToLBU6fGzo+PRRz7KGOc9FkYFiPnR3/zf8Smg= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0 h1:QIF48X1cihydXibm+4wfAc0r/qyPyuFiPFRNphdMpEE= github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400 h1:091wFNQB3PXcL5+me0joH7EiyqQaI0wGMpEjVCkK04U= @@ -914,315 +1099,293 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec h1:q6XVwXmKvCRHRqesF3cSv6lNqqHi0QWOvgDlSohg8UA= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/sykesm/zap-logfmt v0.0.4 h1:U2WzRvmIWG1wDLCFY3sz8UeEmsdHQjHFNlIdmroVFaI= +github.com/sykesm/zap-logfmt v0.0.4/go.mod h1:AuBd9xQjAe3URrWT1BBDk2v2onAZHkZkWRMiYZXiZWA= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c h1:3eGShk3EQf5gJCYW+WzA0TEJQd37HLOmlYF7N0YJwv0= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83 h1:9AUN7+NK4IV+A11igqjQM5i8obiOAQo4SXgjaxe+orI= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= +github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vmware-tanzu/velero v1.10.1 h1:6WYOolZIygHb8FOZtpp8vCqCuy5Mk3qBF1S65L5cjuo= +github.com/vmware-tanzu/velero v1.10.1/go.mod h1:N0J+j8xGSmanGpy1zCRMH2DMGPpwkUj9EZIUXfOlanY= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b h1:0Ve0/CCjiAiyKddUMUn3RwIGlq2iTW4GuVzyoKBYO/8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= -github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973 h1:iCnkJ/qjKZGdZnlcj1N55AxPDan814kpc3s1cDpQKd8= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.7 h1:4DTF1WOM2ZZS/xMOkTFBOcb6XiHu/PKn3rVo6dbewQE= +github.com/yvasiyarov/gorelic v0.0.7/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA= go.etcd.io/etcd/api/v3 v3.5.8/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY= go.etcd.io/etcd/client/pkg/v3 v3.5.8/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v2 v2.305.8/go.mod h1:ZlAsxDK5/10I6xVHhFo9zinCMr/DDLKFetDDXlzKwqE= +go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= go.etcd.io/etcd/pkg/v3 v3.5.4 h1:V5Dvl7S39ZDwjkKqJG2BfXgxZ3QREqqKifWQgIw5IM0= go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE= go.etcd.io/etcd/pkg/v3 v3.5.6/go.mod h1:qATwUzDb6MLyGWq2nUj+jwXqZJcxkCuabh0P7Cuff3k= go.etcd.io/etcd/pkg/v3 v3.5.8/go.mod h1:C17MJkZHJIyJV+wWWx6Jz6YS6BfdkOnUkSwT9uuEO7s= +go.etcd.io/etcd/pkg/v3 v3.5.10 h1:WPR8K0e9kWl1gAhB5A7gEa5ZBTNkT9NdNWrR8Qpo1CM= go.etcd.io/etcd/raft/v3 v3.5.4 h1:YGrnAgRfgXloBNuqa+oBI/aRZMcK/1GS6trJePJ/Gqc= go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI= go.etcd.io/etcd/raft/v3 v3.5.6/go.mod h1:wL8kkRGx1Hp8FmZUuHfL3K2/OaGIDaXGr1N7i2G07J0= go.etcd.io/etcd/raft/v3 v3.5.8/go.mod h1:W6P5WxtOMfYNdLSEJX3vc8Pg6LOt+ewI9UCFKcnIexA= +go.etcd.io/etcd/raft/v3 v3.5.10 h1:cgNAYe7xrsrn/5kXMSaH8kM/Ky8mAdMqGOxyYwpP0LA= go.etcd.io/etcd/server/v3 v3.5.4 h1:CMAZd0g8Bn5NRhynW6pKhc4FRg41/0QYy3d7aNm9874= go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc= go.etcd.io/etcd/server/v3 v3.5.6/go.mod h1:6/Gfe8XTGXQJgLYQ65oGKMfPivb2EASLUSMSWN9Sroo= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.etcd.io/etcd/server/v3 v3.5.10 h1:4NOGyOwD5sUZ22PiWYKmfxqoeh72z6EhYjNosKGLmZg= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.27.0 h1:0BgiNWjN7rUWO9HdjF4L12r8OW86QkVQcYmCjnayJLo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel v1.2.0 h1:YOQDvxO1FayUcT9MIhJhgMyNO1WqoduiyvQHzGN0kUQ= -go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= -go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= +go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.2/go.mod h1:5Qn6qvgkMsLDX+sYK64rHb1FPhpn0UtxF+ouX1uhyJE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.2/go.mod h1:jWZUM2MWhWCJ9J9xVbRx7tzK1mXKpAlze4CeulycwVY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.2.0 h1:OiYdrCq1Ctwnovp6EofSPwlp5aGy4LgKNbkg7PtEUw8= go.opentelemetry.io/otel/internal/metric v0.25.0 h1:w/7RXe16WdPylaIXDgcYM6t/q0K5lXgSdZOEbIEyliE= go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.25.0 h1:7cXOnCADUsR3+EOqxPaSKwhEuNu0gz/56dRN1hpIdKw= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= +go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= +go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= -go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU= go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= +go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM= +go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/otel/trace v1.2.0 h1:Ys3iqbqZhcf28hHzrm5WAquMkDHNZTUkw7KHbuNjej0= -go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= -go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= -go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= +go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v3 v3.0.1 h1:Te7hKxV52TKCbNYq3t84tzKav3xhThdvSsSp/W89IyI= gomodules.xyz/orderedmap v0.1.0 h1:fM/+TGh/O1KkqGR5xjTKg6bU8OKBkg7p0Y+x/J9m8Os= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= +gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b h1:Qh4dB5D/WpoUUp3lSod7qgoyEHbDGPUWjIbnqdqqe1k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= +google.golang.org/api v0.161.0 h1:oYzk/bs26WN10AV7iU7MVJVXBH8oCPS2hHyBiEeFoSU= +google.golang.org/api v0.161.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe h1:USL2DhxfgRchafRvt/wYyyQNzwgL7ZiURcozOE/Pkvo= +google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8= +google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc h1:g3hIDl0jRNd9PPTs2uBzYuaD5mQuwOkZY0vSc0LR32o= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac h1:QXtV4qU5zS94SeHJhPqxJQF0XyxssnVrEZOUgp1+NuY= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -1231,30 +1394,70 @@ gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/square/go-jose.v2 v2.2.2 h1:orlkJ3myw8CN1nVQHBFfloD+L3egixIa4FvUP6RosSA= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +helm.sh/helm/v3 v3.12.3 h1:5y1+Sbty12t48T/t/CGNYUIME5BJ0WKfmW/sobYqkFg= +helm.sh/helm/v3 v3.12.3/go.mod h1:KPKQiX9IP5HX7o5YnnhViMnNuKiL/lJBVQ47GHe1R0k= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= k8s.io/apiserver v0.25.6 h1:32mn8HAlsEl1tpuiVmhAl0YCVkOugjybsJ6l6kf0c8k= k8s.io/apiserver v0.25.6/go.mod h1:IEp2B2/FvQ8GmdspscUoUS0iFF/GGc6NVrJ/cTM4OaA= k8s.io/apiserver v0.26.3/go.mod h1:CJe/VoQNcXdhm67EvaVjYXxR3QyfwpceKPuPaeLibTA= +k8s.io/apiserver v0.29.0 h1:Y1xEMjJkP+BIi0GSEv1BBrf1jLU9UPfAnnGGbbDdp7o= +k8s.io/cli-runtime v0.28.2/go.mod h1:bTpGOvpdsPtDKoyfG4EG041WIyFZLV9qq4rPlkyYfDA= +k8s.io/cli-runtime v0.28.3 h1:lvuJYVkwCqHEvpS6KuTZsUVwPePFjBfSGvuaLl2SxzA= +k8s.io/cli-runtime v0.28.3/go.mod h1:jeX37ZPjIcENVuXDDTskG3+FnVuZms5D9omDXS/2Jjc= k8s.io/code-generator v0.25.6 h1:md8jqhQiMqos8WaTY0ZxhDk8ttlmJl/ijCneJ8ahBNQ= k8s.io/code-generator v0.25.6/go.mod h1:aDxzxJynLKQkaa117y0FFcgZ5jG8+GobxZ2JUntmvKk= k8s.io/code-generator v0.26.3/go.mod h1:ryaiIKwfxEJEaywEzx3dhWOydpVctKYbqLajJf0O8dI= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/code-generator v0.28.3 h1:I847QvdpYx7xKiG2KVQeCSyNF/xU9TowaDAg601mvlw= +k8s.io/component-helpers v0.28.2/go.mod h1:pF1R5YWQ+sgf0i6EbVm+MQCzkYuqutDUibdrkvAa6aI= +k8s.io/component-helpers v0.28.3 h1:te9ieTGzcztVktUs92X53P6BamAoP73MK0qQP0WmDqc= +k8s.io/component-helpers v0.28.3/go.mod h1:oJR7I9ist5UAQ3y/CTdbw6CXxdMZ1Lw2Ua/EZEwnVLs= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/cri-api v0.28.3 h1:84ifk56rAy7yYI1zYqTjLLishpFgs3q7BkCKhoLhmFA= +k8s.io/cri-api v0.28.3/go.mod h1:MTdJO2fikImnX+YzE2Ccnosj3Hw2Cinw2fXYV3ppUIE= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20220913193501-391367153a38/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= k8s.io/klog v0.2.0 h1:0ElL0OHzF3N+OhoJTL0uca20SxtYt4X4+bzHeqrB83c= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kms v0.26.3/go.mod h1:69qGnf1NsFOQP07fBYqNLZklqEHSJF024JqYCaeVxHg= +k8s.io/kms v0.29.0 h1:KJ1zaZt74CgvgV3NR7tnURJ/mJOKC5X3nwon/WdwgxI= +k8s.io/kms v0.30.1/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20230918164632-68afd615200d/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kubelet v0.26.1 h1:wQyCQYmLW6GN3v7gVTxnc3jAE4zMYDlzdF3FZV4rKas= +k8s.io/kubelet v0.26.1/go.mod h1:gFVZ1Ab4XdjtnYdVRATwGwku7FhTxo6LVEZwYoQaDT8= +k8s.io/kubernetes v1.28.3 h1:XTci6gzk+JR51UZuZQCFJ4CsyUkfivSjLI4O1P9z6LY= +k8s.io/kubernetes v1.28.3/go.mod h1:NhAysZWvHtNcJFFHic87ofxQN7loylCQwg3ZvXVDbag= k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/sqlite v1.18.2 h1:S2uFiaNPd/vTAP/4EmyY8Qe2Quzu26A2L1e25xRNTio= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= +modernc.org/tcl v1.13.2 h1:5PQgL/29XkQ9wsEmmNPjzKs+7iPCaYqUJAhzPvQbjDA= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= +oras.land/oras-go v1.2.4 h1:djpBY2/2Cs1PV87GSJlxv4voajVOMZxqqtq9AB8YNvY= +oras.land/oras-go v1.2.4/go.mod h1:DYcGfb3YF1nKjcezfX2SNlDAeQFKSXmf+qrFmrh4324= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= @@ -1262,5 +1465,10 @@ rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 h1:+xBL5uTc+BkPBwmMi3vYfUJjq+N3K+H6PXeETwf5cPI= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0 h1:TgtAeesdhpm2SGwkQasmbeqDo8th5wOBA5h/AjTKA4I= sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU= sigs.k8s.io/gateway-api v0.4.0 h1:07IJkTt21NetZTHtPKJk2I4XIgDN4BAlTIq1wK7V11o= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= +sigs.k8s.io/kustomize/kyaml v0.14.3 h1:WpabVAKZe2YEp/irTSHwD6bfjwZnTtSDewd2BVJGMZs= +sigs.k8s.io/kustomize/kyaml v0.14.3/go.mod h1:npvh9epWysfQ689Rtt/U+dpOJDTBn8kUnF1O6VzvmZA= diff --git a/controllers/job/heartbeat/go.mod b/controllers/job/heartbeat/go.mod index 2dc00455183..30fce2a6df4 100644 --- a/controllers/job/heartbeat/go.mod +++ b/controllers/job/heartbeat/go.mod @@ -1,83 +1,84 @@ module github.com/labring/sealos/controllers/job/heartbeat -go 1.20 +go 1.22 -replace ( - k8s.io/api => k8s.io/api v0.25.6 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.6 - k8s.io/apimachinery => k8s.io/apimachinery v0.25.6 - k8s.io/client-go => k8s.io/client-go v0.25.6 - k8s.io/component-base => k8s.io/component-base v0.25.6 -) +toolchain go1.22.4 require ( github.com/go-resty/resty/v2 v2.10.0 - k8s.io/api v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715093553-26604f99fa5e + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.15.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/zapr v1.2.4 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect - github.com/google/uuid v1.1.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/onsi/ginkgo/v2 v2.10.0 // indirect - github.com/onsi/gomega v1.27.8 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect - go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 ) diff --git a/controllers/job/heartbeat/go.sum b/controllers/job/heartbeat/go.sum index 5c9389bcf15..1c653c745a2 100644 --- a/controllers/job/heartbeat/go.sum +++ b/controllers/job/heartbeat/go.sum @@ -1,116 +1,76 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-resty/resty/v2 v2.10.0 h1:Qla4W/+TMmv0fOeeRqzEpXPLfTUnR5HZ1+lGs+CkiCo= github.com/go-resty/resty/v2 v2.10.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715093553-26604f99fa5e h1:bg3rSQNTJl49nZ0TXFeLhjtxL+HWdSQvDon5EblDCYw= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715093553-26604f99fa5e/go.mod h1:7WBhRcClEuLy/bVMTFICX2jzhmQDsH6UODRONWqrQHY= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -118,60 +78,42 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs= -github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -179,171 +121,115 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.25.6 h1:MwdaCpHtGVSM5SiA6Hm4g2w5voMNiPCwBjOqz9YTlrg= -k8s.io/apiextensions-apiserver v0.25.6/go.mod h1:aXw8Xmhf6/gfGx3y0xkj8o8evTZbfOFqZeWIigg4XsE= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/component-base v0.25.6 h1:v3ci6FbXFcxpjyQJaaLq0MgzT3vyFzwUDWtO+KRv9Bk= -k8s.io/component-base v0.25.6/go.mod h1:k7DfcfJ8cOI6A2xTCfU5LxsnXV+lWw1ME8cRCHzIh6o= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/job/init/go.mod b/controllers/job/init/go.mod index 51eb393978d..7a3c5f8810e 100644 --- a/controllers/job/init/go.mod +++ b/controllers/job/init/go.mod @@ -1,96 +1,102 @@ module github.com/labring/sealos/controllers/job/init -go 1.20 - -replace ( - k8s.io/api => k8s.io/api v0.25.6 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.6 - k8s.io/apimachinery => k8s.io/apimachinery v0.25.6 - k8s.io/client-go => k8s.io/client-go v0.25.6 - k8s.io/component-base => k8s.io/component-base v0.25.6 -) +go 1.22 require ( - github.com/google/uuid v1.3.0 - github.com/labring/sealos/controllers/pkg v0.0.0-20231019082350-00726c66bb59 + github.com/google/uuid v1.6.0 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b github.com/labring/sealos/controllers/user v0.0.0 - go.mongodb.org/mongo-driver v1.12.1 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/matoous/go-nanoid/v2 v2.0.0 + gorm.io/gorm v1.25.5 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v12.0.0+incompatible + sigs.k8s.io/controller-runtime v0.17.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/zapr v1.2.4 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect github.com/imdario/mergo v0.3.16 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/labring/sealos/controllers/account v0.0.0-00010101000000-000000000000 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/onsi/ginkgo/v2 v2.10.0 // indirect - github.com/onsi/gomega v1.27.8 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/goleak v1.2.1 // indirect + go.mongodb.org/mongo-driver v1.12.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.27.4 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + gorm.io/driver/postgres v1.5.4 // indirect + k8s.io/api v0.29.0 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +replace ( + github.com/labring/sealos/controllers/account => ../../account + github.com/labring/sealos/controllers/pkg => ../../pkg + github.com/labring/sealos/controllers/user => ../../user ) -replace github.com/labring/sealos/controllers/user => ../../user +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) diff --git a/controllers/job/init/go.sum b/controllers/job/init/go.sum index c3412afbd67..976d2e0fbec 100644 --- a/controllers/job/init/go.sum +++ b/controllers/job/init/go.sum @@ -1,104 +1,73 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 h1:4GI5eviCwbPxDE311KryyyPUTO7IDVyHGp3Iyl+fEZY= +github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49/go.mod h1:sbm1DAsayX+XsXCOC2CFAAU9JZhX0SPKwnybDjSd0Ls= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= -github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -106,94 +75,74 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labring/sealos/controllers/pkg v0.0.0-20231019082350-00726c66bb59 h1:20dZz2heRm5Tazjw8oPPxcWKXfeGr6E2SY2yuSYbylw= -github.com/labring/sealos/controllers/pkg v0.0.0-20231019082350-00726c66bb59/go.mod h1:IicnrYCy4WeViK74v7a1VZ0ZCA+xnacvrheePG3N0rs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= +github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= +github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs= -github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -201,130 +150,78 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -332,38 +229,38 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.25.6 h1:MwdaCpHtGVSM5SiA6Hm4g2w5voMNiPCwBjOqz9YTlrg= -k8s.io/apiextensions-apiserver v0.25.6/go.mod h1:aXw8Xmhf6/gfGx3y0xkj8o8evTZbfOFqZeWIigg4XsE= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/component-base v0.25.6 h1:v3ci6FbXFcxpjyQJaaLq0MgzT3vyFzwUDWtO+KRv9Bk= -k8s.io/component-base v0.25.6/go.mod h1:k7DfcfJ8cOI6A2xTCfU5LxsnXV+lWw1ME8cRCHzIh6o= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= +gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI= +k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/license/api/v1/zz_generated.deepcopy.go b/controllers/license/api/v1/zz_generated.deepcopy.go index 3d8cd33e834..52297994b8b 100644 --- a/controllers/license/api/v1/zz_generated.deepcopy.go +++ b/controllers/license/api/v1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright 2023. diff --git a/controllers/license/cmd/manager/main.go b/controllers/license/cmd/manager/main.go index 9435f3925ee..a20494a5e1c 100644 --- a/controllers/license/cmd/manager/main.go +++ b/controllers/license/cmd/manager/main.go @@ -24,8 +24,6 @@ import ( database2 "github.com/labring/sealos/controllers/pkg/database" "github.com/labring/sealos/controllers/pkg/database/cockroach" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/apimachinery/pkg/runtime" @@ -34,6 +32,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" accountv1 "github.com/labring/sealos/controllers/account/api/v1" licensev1 "github.com/labring/sealos/controllers/license/api/v1" @@ -75,9 +74,10 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "90cbb0a1.sealos.io", diff --git a/controllers/license/config/crd/bases/license.sealos.io_licenses.yaml b/controllers/license/config/crd/bases/license.sealos.io_licenses.yaml index b9683e72d61..244b674f9d1 100644 --- a/controllers/license/config/crd/bases/license.sealos.io_licenses.yaml +++ b/controllers/license/config/crd/bases/license.sealos.io_licenses.yaml @@ -17,8 +17,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.14.0 name: licenses.license.sealos.io spec: group: license.sealos.io @@ -35,14 +34,19 @@ spec: description: License is the Schema for the licenses API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -83,9 +87,3 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/controllers/license/config/rbac/role.yaml b/controllers/license/config/rbac/role.yaml index 1835d48e89b..b55a4a1febe 100644 --- a/controllers/license/config/rbac/role.yaml +++ b/controllers/license/config/rbac/role.yaml @@ -16,7 +16,6 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - creationTimestamp: null name: manager-role rules: - apiGroups: diff --git a/controllers/license/go.mod b/controllers/license/go.mod index e6b453d9214..562ed596360 100644 --- a/controllers/license/go.mod +++ b/controllers/license/go.mod @@ -3,49 +3,41 @@ module github.com/labring/sealos/controllers/license go 1.22 require ( - github.com/go-logr/logr v1.3.0 + github.com/go-logr/logr v1.4.1 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/labring/sealos/controllers/account v0.0.0-00010101000000-000000000000 - github.com/labring/sealos/controllers/pkg v0.0.0-20240402041753-99ca1d9840de + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 - github.com/onsi/ginkgo/v2 v2.11.0 - github.com/onsi/gomega v1.27.10 + github.com/onsi/ginkgo/v2 v2.14.0 + github.com/onsi/gomega v1.30.0 go.mongodb.org/mongo-driver v1.12.1 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.2 - sigs.k8s.io/controller-runtime v0.15.2 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v12.0.0+incompatible + sigs.k8s.io/controller-runtime v0.17.2 ) require ( - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.4 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/go-task/slim-sprig v2.20.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect @@ -54,7 +46,8 @@ require ( github.com/imdario/mergo v0.3.16 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -63,37 +56,36 @@ require ( github.com/labring/sealos/controllers/user v0.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matoous/go-nanoid/v2 v2.0.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.6.6 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/net v0.22.0 // indirect - golang.org/x/oauth2 v0.9.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc v1.57.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect @@ -101,14 +93,14 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/postgres v1.5.4 // indirect gorm.io/gorm v1.25.5 // indirect - k8s.io/apiextensions-apiserver v0.28.1 // indirect - k8s.io/component-base v0.28.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230918164632-68afd615200d // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace ( @@ -117,11 +109,10 @@ replace ( ) replace ( - k8s.io/api => k8s.io/api v0.25.6 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.6 - k8s.io/apimachinery => k8s.io/apimachinery v0.25.6 - k8s.io/client-go => k8s.io/client-go v0.25.6 - k8s.io/component-base => k8s.io/component-base v0.25.6 - k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.13.0 + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 ) diff --git a/controllers/license/go.sum b/controllers/license/go.sum index b081223d17b..935715e88f8 100644 --- a/controllers/license/go.sum +++ b/controllers/license/go.sum @@ -1,44 +1,11 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -46,29 +13,19 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 h1:4GI5eviCwbPxDE311KryyyPUTO7IDVyHGp3Iyl+fEZY= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49/go.mod h1:sbm1DAsayX+XsXCOC2CFAAU9JZhX0SPKwnybDjSd0Ls= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= @@ -80,42 +37,22 @@ github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vb github.com/go-task/slim-sprig v2.20.0+incompatible/go.mod h1:N/mhXZITr/EQAOErEHciKvO1bFei2Lld2Ym6h96pdy0= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -123,10 +60,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= @@ -135,9 +70,10 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -151,8 +87,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -160,15 +94,13 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labring/sealos/controllers/pkg v0.0.0-20240402041753-99ca1d9840de h1:OJrjNeweyMJIx+1pwz8kI93w032JhZmf18NfJsbzrgw= -github.com/labring/sealos/controllers/pkg v0.0.0-20240402041753-99ca1d9840de/go.mod h1:AfmezipIDk4DzuSwM6KZHtJexJmAmrvbzMu8iio30kA= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b h1:nftWTQWwbYMbteQkfp5HyKN3nT69FCKPekA8hl2z+VI= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b/go.mod h1:7WBhRcClEuLy/bVMTFICX2jzhmQDsH6UODRONWqrQHY= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -183,70 +115,56 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -254,90 +172,58 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= @@ -345,45 +231,19 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -392,42 +252,37 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.25.6 h1:MwdaCpHtGVSM5SiA6Hm4g2w5voMNiPCwBjOqz9YTlrg= -k8s.io/apiextensions-apiserver v0.25.6/go.mod h1:aXw8Xmhf6/gfGx3y0xkj8o8evTZbfOFqZeWIigg4XsE= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/component-base v0.25.6 h1:v3ci6FbXFcxpjyQJaaLq0MgzT3vyFzwUDWtO+KRv9Bk= -k8s.io/component-base v0.25.6/go.mod h1:k7DfcfJ8cOI6A2xTCfU5LxsnXV+lWw1ME8cRCHzIh6o= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 h1:OmK1d0WrkD3IPfkskvroRykOulHVHf0s0ZIFRjyt+UI= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI= +k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/node/controllers/gpu_controller.go b/controllers/node/controllers/gpu_controller.go index 6e14b8db02d..8225aef1971 100644 --- a/controllers/node/controllers/gpu_controller.go +++ b/controllers/node/controllers/gpu_controller.go @@ -37,7 +37,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/source" ) type GpuReconciler struct { @@ -279,7 +278,7 @@ func (r *GpuReconciler) SetupWithManager(mgr ctrl.Manager) error { return useGPU(event.Object) }, })). - Watches(&source.Kind{Type: &corev1.Node{}}, &handler.EnqueueRequestForObject{}, builder.WithPredicates(predicate.Funcs{ + Watches(&corev1.Node{}, &handler.EnqueueRequestForObject{}, builder.WithPredicates(predicate.Funcs{ CreateFunc: func(event event.CreateEvent) bool { return hasGPU(event.Object) }, diff --git a/controllers/node/go.mod b/controllers/node/go.mod index 7411f2a39af..0b15858104e 100644 --- a/controllers/node/go.mod +++ b/controllers/node/go.mod @@ -1,73 +1,84 @@ module github.com/labring/sealos/controllers/node -go 1.20 +go 1.21 + +toolchain go1.22.4 require ( - github.com/go-logr/logr v1.2.4 - github.com/onsi/ginkgo/v2 v2.9.1 - github.com/onsi/gomega v1.27.4 - k8s.io/api v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/go-logr/logr v1.4.1 + github.com/onsi/ginkgo/v2 v2.14.0 + github.com/onsi/gomega v1.30.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.0.0-00010101000000-000000000000 +) + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect - golang.org/x/tools v0.7.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.16.1 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/controllers/node/go.sum b/controllers/node/go.sum index 50183c2ea87..83f4fc864cb 100644 --- a/controllers/node/go.sum +++ b/controllers/node/go.sum @@ -1,628 +1,206 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= -github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= -k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/node/main.go b/controllers/node/main.go index 48f3cd36087..d310473e50a 100644 --- a/controllers/node/main.go +++ b/controllers/node/main.go @@ -30,6 +30,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "github.com/labring/sealos/controllers/node/controllers" //+kubebuilder:scaffold:imports @@ -64,9 +65,10 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "0f9d0ffa.sealos.io", diff --git a/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstoragebuckets.yaml b/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstoragebuckets.yaml index 7fed9f8e3ea..254bd7fcfc7 100644 --- a/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstoragebuckets.yaml +++ b/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstoragebuckets.yaml @@ -76,5 +76,5 @@ status: acceptedNames: kind: "" plural: "" - conditions: [ ] - storedVersions: [ ] + conditions: [] + storedVersions: [] diff --git a/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstorageusers.yaml b/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstorageusers.yaml index 8b6746e5be3..d4f1fa1e20e 100644 --- a/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstorageusers.yaml +++ b/controllers/objectstorage/config/crd/bases/objectstorage.sealos.io_objectstorageusers.yaml @@ -80,5 +80,5 @@ status: acceptedNames: kind: "" plural: "" - conditions: [ ] - storedVersions: [ ] + conditions: [] + storedVersions: [] diff --git a/controllers/objectstorage/config/rbac/role.yaml b/controllers/objectstorage/config/rbac/role.yaml index 8b8c8ccf15e..c0deac9fd3e 100644 --- a/controllers/objectstorage/config/rbac/role.yaml +++ b/controllers/objectstorage/config/rbac/role.yaml @@ -31,6 +31,18 @@ rules: - patch - update - watch + - apiGroups: + - "" + resources: + - resourcequotas + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - objectstorage.sealos.io resources: diff --git a/controllers/objectstorage/controllers/objectstoragebucket_controller.go b/controllers/objectstorage/controllers/objectstoragebucket_controller.go index e5257c9228c..75f3637c6f2 100644 --- a/controllers/objectstorage/controllers/objectstoragebucket_controller.go +++ b/controllers/objectstorage/controllers/objectstoragebucket_controller.go @@ -22,7 +22,6 @@ import ( "crypto/sha256" "encoding/hex" "fmt" - "strings" "time" diff --git a/controllers/objectstorage/controllers/objectstorageuser_controller.go b/controllers/objectstorage/controllers/objectstorageuser_controller.go index 6babf07e30a..adc3ccd0f28 100644 --- a/controllers/objectstorage/controllers/objectstorageuser_controller.go +++ b/controllers/objectstorage/controllers/objectstorageuser_controller.go @@ -34,6 +34,7 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/rand" @@ -56,7 +57,6 @@ type ObjectStorageUserReconciler struct { ExternalEndpoint string OSUDetectionCycle time.Duration QuotaEnabled bool - DefaultQuota int64 } const ( @@ -69,6 +69,7 @@ const ( OSExternalEndpointEnv = "OSExternalEndpoint" OSNamespace = "OSNamespace" OSAdminSecret = "OSAdminSecret" + QuotaEnabled = "QuotaEnabled" OSKeySecret = "object-storage-key" OSKeySecretAccessKey = "accessKey" @@ -76,12 +77,16 @@ const ( OSKeySecretInternal = "internal" OSKeySecretExternal = "external" OSKeySecretBucket = "bucket" + + ResourceQuotaPrefix = "quota-" + ResourceObjectStorageSize = "objectstorage/size" ) //+kubebuilder:rbac:groups=objectstorage.sealos.io,resources=objectstorageusers,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=objectstorage.sealos.io,resources=objectstorageusers/status,verbs=get;update;patch //+kubebuilder:rbac:groups=objectstorage.sealos.io,resources=objectstorageusers/finalizers,verbs=update //+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=core,resources=resourcequotas,verbs=get;list;watch;create;update;patch;delete func (r *ObjectStorageUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { username := req.Name @@ -136,7 +141,15 @@ func (r *ObjectStorageUserReconciler) Reconcile(ctx context.Context, req ctrl.Re return ctrl.Result{}, nil } - updated := r.initObjectStorageUser(user, username) + resourceQuota := &corev1.ResourceQuota{} + if err := r.Get(ctx, client.ObjectKey{Name: ResourceQuotaPrefix + userNamespace, Namespace: userNamespace}, resourceQuota); err != nil { + r.Logger.Error(err, "failed to get resource quota", "name", ResourceQuotaPrefix+userNamespace, "namespace", userNamespace) + return ctrl.Result{}, err + } + + quota := resourceQuota.Spec.Hard.Name(ResourceObjectStorageSize, resource.BinarySI) + + updated := r.initObjectStorageUser(user, username, quota.Value()) accessKey := user.Status.AccessKey secretKey := user.Status.SecretKey @@ -337,11 +350,11 @@ func (r *ObjectStorageUserReconciler) deleteObjectStorageUser(ctx context.Contex return nil } -func (r *ObjectStorageUserReconciler) initObjectStorageUser(user *objectstoragev1.ObjectStorageUser, username string) bool { +func (r *ObjectStorageUserReconciler) initObjectStorageUser(user *objectstoragev1.ObjectStorageUser, username string, quota int64) bool { var updated = false - if user.Status.Quota != r.DefaultQuota { - user.Status.Quota = r.DefaultQuota + if user.Status.Quota != quota { + user.Status.Quota = quota updated = true } @@ -418,12 +431,9 @@ func (r *ObjectStorageUserReconciler) SetupWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to get the endpoint or namespace or admin secret env of object storage") } - quotaEnabled := env.GetBoolWithDefault("quotaEnabled", true) + quotaEnabled := env.GetBoolWithDefault(QuotaEnabled, true) r.QuotaEnabled = quotaEnabled - defaultQuota := env.GetInt64EnvWithDefault("defaultQuota", 107374182400) - r.DefaultQuota = defaultQuota - return ctrl.NewControllerManagedBy(mgr). For(&objectstoragev1.ObjectStorageUser{}). Complete(r) diff --git a/controllers/objectstorage/go.mod b/controllers/objectstorage/go.mod index c6fee0f8d9c..83d958137a0 100644 --- a/controllers/objectstorage/go.mod +++ b/controllers/objectstorage/go.mod @@ -1,56 +1,63 @@ module github/labring/sealos/controllers/objectstorage -go 1.20 +go 1.21 + +toolchain go1.22.4 + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) require ( - github.com/go-logr/logr v1.2.3 + github.com/go-logr/logr v1.4.1 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b github.com/minio/madmin-go/v3 v3.0.29 - github.com/minio/minio-go/v7 v7.0.63 - github.com/onsi/ginkgo/v2 v2.1.4 - github.com/onsi/gomega v1.19.0 - k8s.io/apimachinery v0.25.0 - k8s.io/client-go v0.25.0 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/minio/minio-go/v7 v7.0.64 + github.com/onsi/ginkgo/v2 v2.14.0 + github.com/onsi/gomega v1.30.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.15.2 ) require ( - cloud.google.com/go v0.97.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.8.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -59,10 +66,10 @@ require ( github.com/philhofer/fwd v1.1.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/prom2json v1.3.3 // indirect github.com/rs/xid v1.5.0 // indirect github.com/safchain/ethtool v0.3.0 // indirect @@ -74,31 +81,31 @@ require ( github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.16.1 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.25.0 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/controllers/objectstorage/go.sum b/controllers/objectstorage/go.sum index 29a655831df..ba482c0c243 100644 --- a/controllers/objectstorage/go.sum +++ b/controllers/objectstorage/go.sum @@ -1,263 +1,104 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= -github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b h1:nftWTQWwbYMbteQkfp5HyKN3nT69FCKPekA8hl2z+VI= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b/go.mod h1:7WBhRcClEuLy/bVMTFICX2jzhmQDsH6UODRONWqrQHY= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE= github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/minio/madmin-go/v3 v3.0.29 h1:3bNLArtxIFud5wyb5/DnF5DGLBvcSJyzCA44EclX1Ow= github.com/minio/madmin-go/v3 v3.0.29/go.mod h1:4QN2NftLSV7MdlT50dkrenOMmNVHluxTvlqJou3hte8= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= -github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= +github.com/minio/minio-go/v7 v7.0.64 h1:Zdza8HwOzkld0ZG/og50w56fKi6AAyfqfifmasD9n2Q= +github.com/minio/minio-go/v7 v7.0.64/go.mod h1:R4WVUR6ZTedlCcGwZRauLMIKjgyaWxhs4Mqi/OMPmEc= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -267,37 +108,34 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo= github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0= @@ -308,223 +146,78 @@ github.com/shirou/gopsutil/v3 v3.23.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -533,279 +226,76 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0= -k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU= -k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0= -k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= -k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/objectstorage/main.go b/controllers/objectstorage/main.go index 32e065ad5cf..0a6934bd910 100644 --- a/controllers/objectstorage/main.go +++ b/controllers/objectstorage/main.go @@ -20,8 +20,6 @@ import ( "flag" "os" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/apimachinery/pkg/runtime" @@ -30,6 +28,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" objectstoragev1 "github/labring/sealos/controllers/objectstorage/api/v1" "github/labring/sealos/controllers/objectstorage/controllers" @@ -66,9 +65,10 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "a704a113.sealos.io", diff --git a/controllers/pkg/crypto/crypto.go b/controllers/pkg/crypto/crypto.go index e55763cfd85..f43f6568421 100644 --- a/controllers/pkg/crypto/crypto.go +++ b/controllers/pkg/crypto/crypto.go @@ -30,7 +30,7 @@ import ( "strconv" ) -const defaultEncryptionKey = "0123456789ABCDEF0123456789ABCDEF" +const defaultEncryptionKey = "Bg1c3Dd5e9e0F84bdF0A5887cF43aB63" var encryptionKey = defaultEncryptionKey @@ -79,56 +79,6 @@ func DecryptInt64(in string) (int64, error) { return strconv.ParseInt(string(out), 10, 64) } -func DecryptFloat64(in string) (float64, error) { - out, err := Decrypt(in) - if err != nil { - return 0, fmt.Errorf("failed to decrpt balance: %w", err) - } - return strconv.ParseFloat(string(out), 64) -} - -func EncryptFloat64(in float64) (*string, error) { - out, err := Encrypt([]byte(strconv.FormatFloat(in, 'f', -1, 64))) - return &out, err -} - -// DecryptInt64WithKey decrypts the given ciphertext using AES-GCM. -func DecryptInt64WithKey(in string, encryptionKey []byte) (int64, error) { - out, err := DecryptWithKey(in, encryptionKey) - if err != nil { - return 0, fmt.Errorf("failed to decrpt balance: %w", err) - } - return strconv.ParseInt(string(out), 10, 64) -} - -func RechargeBalance(rawBalance *string, amount int64) error { - balanceInt, err := DecryptInt64(*rawBalance) - if err != nil { - return fmt.Errorf("failed to recharge balance: %w", err) - } - balanceInt += amount - encryptBalance, err := EncryptInt64(balanceInt) - if err != nil { - return fmt.Errorf("failed to recharge balance: %w", err) - } - *rawBalance = *encryptBalance - return nil -} - -func DeductBalance(balance *string, amount int64) error { - balanceInt, err := DecryptInt64(*balance) - if err != nil { - return fmt.Errorf("failed to deduct balance: %w", err) - } - balanceInt -= amount - encryptBalance, err := EncryptInt64(balanceInt) - if err != nil { - return fmt.Errorf("failed to deduct balance: %w", err) - } - *balance = *encryptBalance - return nil -} - // Decrypt decrypts the given ciphertext using AES-GCM. func Decrypt(ciphertextBase64 string) ([]byte, error) { return DecryptWithKey(ciphertextBase64, []byte(encryptionKey)) diff --git a/controllers/pkg/database/cockroach/accountv2.go b/controllers/pkg/database/cockroach/accountv2.go index e0c53c50f99..5f5fe47e449 100644 --- a/controllers/pkg/database/cockroach/accountv2.go +++ b/controllers/pkg/database/cockroach/accountv2.go @@ -107,13 +107,13 @@ func (c *Cockroach) GetUser(ops *types.UserQueryOpts) (*types.User, error) { } else if ops.Owner != "" { userCr, err := c.GetUserCr(ops) if err != nil { - return nil, fmt.Errorf("failed to get user: %v", err) + return nil, fmt.Errorf("failed to get user cr: %v", err) } queryUser.UID = userCr.UserUID } var user types.User if err := c.DB.Where(queryUser).First(&user).Error; err != nil { - return nil, fmt.Errorf("failed to get user: %v", err) + return nil, err } return &user, nil } @@ -160,6 +160,17 @@ func (c *Cockroach) GetUserUID(ops *types.UserQueryOpts) (uuid.UUID, error) { return userCr.UserUID, nil } +func (c *Cockroach) GetWorkspace(namespaces ...string) ([]types.Workspace, error) { + if len(namespaces) == 0 { + return nil, fmt.Errorf("empty namespaces") + } + var workspaces []types.Workspace + if err := c.Localdb.Where("id IN ?", namespaces).Find(&workspaces).Error; err != nil { + return nil, fmt.Errorf("failed to get workspaces: %v", err) + } + return workspaces, nil +} + func checkOps(ops *types.UserQueryOpts) error { if ops.Owner == "" && ops.UID == uuid.Nil && ops.ID == "" { return fmt.Errorf("empty query opts") @@ -220,7 +231,7 @@ func (c *Cockroach) GetTransfer(ops *types.GetTransfersReq) (*types.GetTransfers func (c *Cockroach) performTransferQuery(ops *types.GetTransfersReq, limit, offset int, start, end time.Time, transfers *[]types.Transfer, count *int64) error { var err error - query := c.DB.Limit(limit).Offset(offset). + query := c.DB.Model(&types.Transfer{}).Limit(limit).Offset(offset). Where("created_at BETWEEN ? AND ?", start, end) countQuery := c.DB.Model(&types.Transfer{}). Where("created_at BETWEEN ? AND ?", start, end) @@ -232,13 +243,13 @@ func (c *Cockroach) performTransferQuery(ops *types.GetTransfersReq, limit, offs } else { switch ops.Type { case types.TypeTransferIn: - userCondition = `"toUserUid" = ? AND "toUserId" = ?` + userCondition = `"toUserUid" = ? OR "toUserId" = ?` args = append(args, ops.UID, ops.ID) case types.TypeTransferOut: - userCondition = `"fromUserUid" = ? AND "fromUserId" = ?` + userCondition = `"fromUserUid" = ? OR "fromUserId" = ?` args = append(args, ops.UID, ops.ID) default: - userCondition = `("fromUserUid" = ? AND "fromUserId" = ?) OR ("toUserUid" = ? AND "toUserId" = ?)` + userCondition = `"fromUserUid" = ? OR "fromUserId" = ? OR "toUserUid" = ? OR "toUserId" = ?` args = append(args, ops.UID, ops.ID, ops.UID, ops.ID) } } @@ -246,6 +257,7 @@ func (c *Cockroach) performTransferQuery(ops *types.GetTransfersReq, limit, offs query = query.Where(userCondition, args...) countQuery = countQuery.Where(userCondition, args...) + query = query.Order("created_at DESC") err = query.Find(transfers).Error if err != nil { return fmt.Errorf("failed to get transfer: %v", err) @@ -276,18 +288,8 @@ func (c *Cockroach) getAccount(ops *types.UserQueryOpts) (*types.Account, error) if ops.IgnoreEmpty && errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } - return nil, fmt.Errorf("failed to search account from db: %w", err) - } - balance, err := crypto.DecryptInt64(account.EncryptBalance) - if err != nil { - return nil, fmt.Errorf("failed to descrypt balance: %v", err) - } - deductionBalance, err := crypto.DecryptInt64(account.EncryptDeductionBalance) - if err != nil { - return nil, fmt.Errorf("failed to descrypt deduction balance: %v", err) + return nil, err } - account.Balance = balance - account.DeductionBalance = deductionBalance return &account, nil } @@ -317,52 +319,35 @@ func (c *Cockroach) updateBalance(tx *gorm.DB, ops *types.UserQueryOpts, amount } ops.UID = user.UserUID } - var account types.Account - //TODO update UserUid = ? - if err := tx.Where(&types.Account{UserUID: ops.UID}).First(&account).Error; err != nil { - return fmt.Errorf("failed to get account: %w", err) + var account = &types.Account{} + if err := tx.Where(&types.Account{UserUID: ops.UID}).First(account).Error; err != nil { + // if not found, create a new account and retry + if !errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("failed to get account: %w", err) + } + if account, err = c.NewAccount(ops); err != nil { + return fmt.Errorf("failed to create account: %v", err) + } } - - if err := c.updateWithAccount(isDeduction, add, &account, amount); err != nil { + if err := c.updateWithAccount(isDeduction, add, account, amount); err != nil { return err } - if err := tx.Save(&account).Error; err != nil { + if err := tx.Save(account).Error; err != nil { return fmt.Errorf("failed to update account balance: %w", err) } return nil } func (c *Cockroach) updateWithAccount(isDeduction bool, add bool, account *types.Account, amount int64) error { - var fieldToUpdate string + balancePtr := &account.Balance if isDeduction { - fieldToUpdate = account.EncryptDeductionBalance - } else { - fieldToUpdate = account.EncryptBalance + balancePtr = &account.DeductionBalance } - - currentBalance, err := crypto.DecryptInt64(fieldToUpdate) - if err != nil { - return fmt.Errorf("failed to decrypt balance: %w", err) - } - if add { - currentBalance += amount - } else { - currentBalance -= amount - } - - newEncryptBalance, err := crypto.EncryptInt64(currentBalance) - if err != nil { - return fmt.Errorf("failed to encrypt balance: %v", err) - } - if isDeduction { - account.EncryptDeductionBalance = *newEncryptBalance - account.DeductionBalance = currentBalance + *balancePtr += amount } else { - account.EncryptBalance = *newEncryptBalance - account.Balance = currentBalance + *balancePtr -= amount } - return nil } @@ -618,6 +603,29 @@ func (c *Cockroach) payment(payment *types.Payment, updateBalance bool) error { }) } +func (c *Cockroach) GetRegions() ([]types.Region, error) { + var regions []types.Region + if err := c.DB.Find(®ions).Error; err != nil { + return nil, fmt.Errorf("failed to get regions: %v", err) + } + return regions, nil +} + +func (c *Cockroach) GetLocalRegion() types.Region { + if c.LocalRegion.Domain == "" { + regions, err := c.GetRegions() + if err == nil { + for i := range regions { + if regions[i].UID == c.LocalRegion.UID { + c.LocalRegion = ®ions[i] + return *c.LocalRegion + } + } + } + } + return *c.LocalRegion +} + func (c *Cockroach) GetPayment(ops *types.UserQueryOpts, startTime, endTime time.Time) ([]types.Payment, error) { userUID, err := c.GetUserUID(ops) if err != nil { @@ -636,20 +644,186 @@ func (c *Cockroach) GetPayment(ops *types.UserQueryOpts, startTime, endTime time return payment, nil } +func (c *Cockroach) GetPaymentWithID(paymentID string) (*types.Payment, error) { + var payment types.Payment + if err := c.DB.Where(types.Payment{ID: paymentID}).First(&payment).Error; err != nil { + return nil, fmt.Errorf("failed to get payment: %w", err) + } + return &payment, nil +} + +func (c *Cockroach) GetPaymentWithLimit(ops *types.UserQueryOpts, req types.LimitReq, invoiced *bool) ([]types.Payment, types.LimitResp, error) { + var payment []types.Payment + var total int64 + var limitResp types.LimitResp + page, pageSize := req.Page, req.PageSize + userUID, err := c.GetUserUID(ops) + if err != nil { + return nil, limitResp, fmt.Errorf("failed to get user uid: %v", err) + } + + queryPayment := types.Payment{PaymentRaw: types.PaymentRaw{UserUID: userUID}} + query := c.DB.Model(&types.Payment{}).Where(queryPayment) + if invoiced != nil { + query = query.Where("invoiced_at = ?", *invoiced) + } + if !req.StartTime.IsZero() { + query = query.Where("created_at >= ?", req.StartTime) + } + if !req.EndTime.IsZero() { + query = query.Where("created_at <= ?", req.EndTime) + } + if err := query.Count(&total).Error; err != nil { + return nil, limitResp, fmt.Errorf("failed to get total count: %v", err) + } + totalPage := (total + int64(pageSize) - 1) / int64(pageSize) + if err := query.Order("created_at DESC"). + Limit(pageSize). + Offset((page - 1) * pageSize). + Find(&payment).Error; err != nil { + return nil, limitResp, fmt.Errorf("failed to get payment: %v", err) + } + limitResp = types.LimitResp{ + Total: total, + TotalPage: totalPage, + } + return payment, limitResp, nil +} + +func (c *Cockroach) GetUnInvoicedPaymentListWithIds(ids []string) ([]types.Payment, error) { + var payment []types.Payment + if err := c.DB.Where("id IN ?", ids).Where("invoiced_at = ?", false).Find(&payment).Error; err != nil { + return nil, fmt.Errorf("failed to get payment: %w", err) + } + return payment, nil +} + func (c *Cockroach) SetPaymentInvoice(ops *types.UserQueryOpts, paymentIDList []string) error { userUID, err := c.GetUserUID(ops) if err != nil { return fmt.Errorf("failed to get user uid: %v", err) } - var payment []types.Payment - if err := c.DB.Where(types.Payment{PaymentRaw: types.PaymentRaw{UserUID: userUID}}).Where("id IN ?", paymentIDList).Find(&payment).Error; err != nil { - return fmt.Errorf("failed to get payment: %w", err) + if err := c.DB.Model(&types.Payment{}).Where(types.Payment{PaymentRaw: types.PaymentRaw{UserUID: userUID}}).Where("id IN ?", paymentIDList).Update("invoiced_at", true).Error; err != nil { + return fmt.Errorf("failed to save payment: %v", err) + } + return nil +} + +func (c *Cockroach) SetPaymentInvoiceWithDB(ops *types.UserQueryOpts, paymentIDList []string, DB *gorm.DB) error { + userUID, err := c.GetUserUID(ops) + if err != nil { + return fmt.Errorf("failed to get user uid: %v", err) } - for i := range payment { - payment[i].InvoicedAt = true - if err := c.DB.Save(&payment[i]).Error; err != nil { - return fmt.Errorf("failed to save payment: %v", err) + if err := DB.Model(&types.Payment{}).Where(types.Payment{PaymentRaw: types.PaymentRaw{UserUID: userUID}}).Where("id IN ?", paymentIDList).Update("invoiced_at", true).Error; err != nil { + return fmt.Errorf("failed to save payment: %v", err) + } + return nil +} + +func (c *Cockroach) CreateInvoiceWithDB(i *types.Invoice, DB *gorm.DB) error { + if i.ID == "" { + id, err := gonanoid.New(12) + if err != nil { + return fmt.Errorf("failed to generate invoice id: %v", err) } + i.ID = id + } + if i.CreatedAt.IsZero() { + i.CreatedAt = time.Now() + } + if err := DB.Create(i).Error; err != nil { + return fmt.Errorf("failed to save invoice: %v", err) + } + return nil +} + +// create invoicePayments +func (c *Cockroach) CreateInvoicePaymentsWithDB(invoicePayments []types.InvoicePayment, DB *gorm.DB) error { + if err := DB.Create(invoicePayments).Error; err != nil { + return fmt.Errorf("failed to save invoice payments: %v", err) + } + return nil +} + +// GetInvoiceWithID +func (c *Cockroach) GetInvoiceWithID(invoiceID string) (*types.Invoice, error) { + var invoice types.Invoice + if err := c.DB.Where(types.Invoice{ID: invoiceID}).First(&invoice).Error; err != nil { + return nil, fmt.Errorf("failed to get invoice: %v", err) + } + return &invoice, nil +} + +func (c *Cockroach) GetInvoice(userID string, req types.LimitReq) ([]types.Invoice, types.LimitResp, error) { + var invoices []types.Invoice + var total int64 + var limitResp types.LimitResp + + query := c.DB.Model(&types.Invoice{}).Where("user_id = ?", userID) + + if !req.StartTime.IsZero() { + query = query.Where("created_at >= ?", req.StartTime) + } + if !req.EndTime.IsZero() { + query = query.Where("created_at <= ?", req.EndTime) + } + + if req.Page < 1 { + req.Page = 1 + } + if req.PageSize < 1 { + req.PageSize = 10 + } + + if err := query.Count(&total).Error; err != nil { + return nil, limitResp, fmt.Errorf("failed to get total count: %v", err) + } + + totalPage := (total + int64(req.PageSize) - 1) / int64(req.PageSize) + + if err := query.Limit(req.PageSize). + Offset((req.Page - 1) * req.PageSize). + Find(&invoices).Error; err != nil { + return nil, limitResp, fmt.Errorf("failed to get invoices: %v", err) + } + + limitResp = types.LimitResp{ + Total: total, + TotalPage: totalPage, + } + + return invoices, limitResp, nil +} + +func (c *Cockroach) GetInvoicePayments(invoiceID string) ([]types.InvoicePayment, error) { + var invoicePayments []types.InvoicePayment + query := c.DB.Model(&types.InvoicePayment{}).Where("invoice_id = ?", invoiceID) + if err := query.Find(&invoicePayments).Error; err != nil { + return nil, fmt.Errorf("failed to get invoice payments: %v", err) + } + + return invoicePayments, nil +} + +func (c *Cockroach) GetPaymentWithInvoice(invoiceID string) ([]types.Payment, error) { + invoicePayments, err := c.GetInvoicePayments(invoiceID) + if err != nil { + return nil, fmt.Errorf("failed to get invoice payments: %v", err) + } + var paymentIDs []string + for _, invoicePayment := range invoicePayments { + paymentIDs = append(paymentIDs, invoicePayment.PaymentID) + } + var payments []types.Payment + if err := c.DB.Where("id IN ?", paymentIDs).Find(&payments).Error; err != nil { + return nil, fmt.Errorf("failed to get payments: %v", err) + } + return payments, nil +} + +func (c *Cockroach) SetInvoiceStatus(ids []string, stats string) error { + if err := c.DB.Model(&types.Invoice{}).Where("id IN ?", ids).Update("status", stats).Error; err != nil { + return fmt.Errorf("failed to update invoice status: %v", err) } return nil } @@ -811,7 +985,7 @@ func (c *Cockroach) transferAccount(from, to *types.UserQueryOpts, amount int64, } func (c *Cockroach) InitTables() error { - return CreateTableIfNotExist(c.DB, types.Account{}, types.ErrorAccountCreate{}, types.ErrorPaymentCreate{}, types.Payment{}, types.Transfer{}, types.Region{}) + return CreateTableIfNotExist(c.DB, types.Account{}, types.ErrorAccountCreate{}, types.ErrorPaymentCreate{}, types.Payment{}, types.Transfer{}, types.Region{}, types.Invoice{}, types.InvoicePayment{}) } func NewCockRoach(globalURI, localURI string) (*Cockroach, error) { @@ -885,3 +1059,48 @@ func (c *Cockroach) Close() error { } return db.Close() } + +func (c *Cockroach) GetGiftCodeWithCode(code string) (*types.GiftCode, error) { + var giftCode types.GiftCode + if err := c.DB.Where(&types.GiftCode{Code: code}).First(&giftCode).Error; err != nil { + return nil, fmt.Errorf("failed to get gift code: %w", err) + } + return &giftCode, nil +} + +func (c *Cockroach) UseGiftCode(giftCode *types.GiftCode, userID string) error { + return c.DB.Transaction(func(tx *gorm.DB) error { + ops := &types.UserQueryOpts{ID: userID} + // Update the user's balance + if err := c.updateBalance(tx, ops, giftCode.CreditAmount, false, true); err != nil { + return fmt.Errorf("failed to update user balance: %w", err) + } + + message := "created by use gift code" + // Create an AccountTransaction record + accountTransaction := &types.AccountTransaction{ + ID: uuid.New(), + Type: "GiftCode", + UserUID: ops.UID, + DeductionBalance: 0, + Balance: giftCode.CreditAmount, + Message: &message, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + BillingID: giftCode.ID, + } + if err := tx.Create(accountTransaction).Error; err != nil { + return fmt.Errorf("failed to create account transaction: %w", err) + } + + // Mark the gift code as used + giftCode.Used = true + giftCode.UsedBy = ops.UID + giftCode.UsedAt = time.Now() + if err := tx.Save(giftCode).Error; err != nil { + return fmt.Errorf("failed to update gift code: %w", err) + } + + return nil + }) +} diff --git a/controllers/pkg/database/interface.go b/controllers/pkg/database/interface.go index 4cd6afa1b04..642269f532f 100644 --- a/controllers/pkg/database/interface.go +++ b/controllers/pkg/database/interface.go @@ -36,6 +36,7 @@ type Interface interface { Account Traffic CVM + Creator } type CVM interface { @@ -49,11 +50,14 @@ type Account interface { GetBillingHistoryNamespaceList(ns *accountv1.NamespaceBillingHistorySpec, owner string) ([]string, error) GetBillingHistoryNamespaces(startTime, endTime *time.Time, billType int, owner string) ([]string, error) SaveBillings(billing ...*resources.Billing) error + SaveObjTraffic(obs ...*types.ObjectStorageTraffic) error + GetAllLatestObjTraffic(startTime, endTime time.Time) ([]types.ObjectStorageTraffic, error) + HandlerTimeObjBucketSentTraffic(startTime, endTime time.Time, bucket string) (int64, error) + GetTimeObjBucketBucket(startTime, endTime time.Time) ([]string, error) QueryBillingRecords(billingRecordQuery *accountv1.BillingRecordQuery, owner string) error GetUnsettingBillingHandler(owner string) ([]resources.BillingHandler, error) UpdateBillingStatus(orderID string, status resources.BillingStatus) error GetUpdateTimeForCategoryAndPropertyFromMetering(category string, property string) (time.Time, error) - GetAllPricesMap() (map[string]resources.Price, error) GetAllPayment() ([]resources.Billing, error) InitDefaultPropertyTypeLS() error SavePropertyTypes(types []resources.PropertyType) error @@ -90,23 +94,27 @@ type AccountV2 interface { Close() error GetUserCr(user *types.UserQueryOpts) (*types.RegionUserCr, error) GetUser(ops *types.UserQueryOpts) (*types.User, error) - CreateUser(oAuth *types.OauthProvider, regionUserCr *types.RegionUserCr, user *types.User, workspace *types.Workspace, userWorkspace *types.UserWorkspace) error GetAccount(user *types.UserQueryOpts) (*types.Account, error) - SetAccountCreateLocalRegion(account *types.Account, region string) error + GetRegions() ([]types.Region, error) + GetLocalRegion() types.Region GetUserOauthProvider(ops *types.UserQueryOpts) ([]types.OauthProvider, error) + GetWorkspace(namespaces ...string) ([]types.Workspace, error) + GetUserAccountRechargeDiscount(user *types.UserQueryOpts) (*types.RechargeDiscount, error) + SetAccountCreateLocalRegion(account *types.Account, region string) error + CreateUser(oAuth *types.OauthProvider, regionUserCr *types.RegionUserCr, user *types.User, workspace *types.Workspace, userWorkspace *types.UserWorkspace) error AddBalance(user *types.UserQueryOpts, balance int64) error ReduceBalance(ops *types.UserQueryOpts, amount int64) error ReduceDeductionBalance(ops *types.UserQueryOpts, amount int64) error NewAccount(user *types.UserQueryOpts) (*types.Account, error) Payment(payment *types.Payment) error SavePayment(payment *types.Payment) error + GetUnInvoicedPaymentListWithIds(ids []string) ([]types.Payment, error) CreateErrorPaymentCreate(payment types.Payment, errorMsg string) error CreateAccount(ops *types.UserQueryOpts, account *types.Account) (*types.Account, error) CreateErrorAccountCreate(account *types.Account, owner, errorMsg string) error TransferAccount(from, to *types.UserQueryOpts, amount int64) error TransferAccountAll(from, to *types.UserQueryOpts) error TransferAccountV1(owner string, account *types.Account) (*types.Account, error) - GetUserAccountRechargeDiscount(user *types.UserQueryOpts) (*types.RechargeDiscount, error) AddDeductionBalance(user *types.UserQueryOpts, balance int64) error AddDeductionBalanceWithFunc(ops *types.UserQueryOpts, amount int64, preDo, postDo func() error) error } @@ -115,6 +123,7 @@ type Creator interface { CreateBillingIfNotExist() error //suffix by day, eg: monitor_20200101 CreateMonitorTimeSeriesIfNotExist(collTime time.Time) error + CreateTTLTrafficTimeSeries() error } type MeteringOwnerTimeResult struct { diff --git a/controllers/pkg/database/mongo/account.go b/controllers/pkg/database/mongo/account.go index 0264d6c826e..53c8adb3ac9 100644 --- a/controllers/pkg/database/mongo/account.go +++ b/controllers/pkg/database/mongo/account.go @@ -22,6 +22,8 @@ import ( "strings" "time" + "github.com/labring/sealos/controllers/pkg/types" + "github.com/labring/sealos/controllers/pkg/utils/env" "github.com/labring/sealos/controllers/pkg/common" @@ -30,7 +32,6 @@ import ( gonanoid "github.com/matoous/go-nanoid/v2" accountv1 "github.com/labring/sealos/controllers/account/api/v1" - "github.com/labring/sealos/controllers/pkg/crypto" "github.com/labring/sealos/controllers/pkg/resources" "github.com/labring/sealos/controllers/pkg/utils/logger" @@ -58,6 +59,7 @@ const ( DefaultMeteringConn = "metering" DefaultMonitorConn = "monitor" DefaultBillingConn = "billing" + DefaultObjTrafficConn = "objectstorage-traffic" DefaultUserConn = "user" DefaultPricesConn = "prices" DefaultPropertiesConn = "properties" @@ -65,13 +67,6 @@ const ( DefaultTrafficConn = "traffic" ) -const DefaultRetentionDay = 30 - -// override this value at build time -const defaultCryptoKey = "Af0b2Bc5e9d0C84adF0A5887cF43aB63" - -var cryptoKey = defaultCryptoKey - type mongoDB struct { Client *mongo.Client AccountDB string @@ -83,7 +78,7 @@ type mongoDB struct { MonitorConnPrefix string MeteringConn string BillingConn string - PricesConn string + ObjTrafficConn string PropertiesConn string TrafficConn string } @@ -255,6 +250,130 @@ func (m *mongoDB) SaveBillings(billing ...*resources.Billing) error { return err } +func (m *mongoDB) SaveObjTraffic(obs ...*types.ObjectStorageTraffic) error { + traffic := make([]interface{}, len(obs)) + for i, ob := range obs { + traffic[i] = ob + } + _, err := m.getObjTrafficCollection().InsertMany(context.Background(), traffic) + return err +} + +func (m *mongoDB) GetAllLatestObjTraffic(startTime, endTime time.Time) ([]types.ObjectStorageTraffic, error) { + pipeline := []bson.M{ + { + "$match": bson.M{ + "time": bson.M{ + "$gt": startTime, + "$lte": endTime, + }, + }, + }, + { + "$sort": bson.M{"time": -1}, + }, + { + "$group": bson.M{ + "_id": bson.M{"user": "$user", "bucket": "$bucket"}, + "latestDoc": bson.M{"$first": "$$ROOT"}, + }, + }, + { + "$replaceRoot": bson.M{"newRoot": "$latestDoc"}, + }, + } + + cursor, err := m.getObjTrafficCollection().Aggregate(context.Background(), pipeline) + if err != nil { + return nil, err + } + defer cursor.Close(context.Background()) + + var results []types.ObjectStorageTraffic + if err = cursor.All(context.Background(), &results); err != nil { + return nil, err + } + + return results, nil +} + +func (m *mongoDB) HandlerTimeObjBucketSentTraffic(startTime, endTime time.Time, bucket string) (int64, error) { + pipeline := []bson.M{ + { + "$match": bson.M{ + "time": bson.M{ + "$gt": startTime, + "$lte": endTime, + }, + "bucket": bucket, + }, + }, + { + "$group": bson.M{ + "_id": nil, + "totalSent": bson.M{"$sum": "$sent"}, + }, + }, + } + cursor, err := m.getObjTrafficCollection().Aggregate(context.Background(), pipeline) + if err != nil { + return 0, err + } + defer cursor.Close(context.Background()) + + var result struct { + TotalSent int64 `bson:"totalSent"` + } + if cursor.Next(context.Background()) { + if err := cursor.Decode(&result); err != nil { + return 0, err + } + return result.TotalSent, nil + } + if err := cursor.Err(); err != nil { + return 0, err + } + return 0, nil +} + +func (m *mongoDB) GetTimeObjBucketBucket(startTime, endTime time.Time) ([]string, error) { + pipeline := []bson.M{ + { + "$match": bson.M{ + "time": bson.M{ + "$gt": startTime, + "$lte": endTime, + }, + }, + }, + { + "$group": bson.M{ + "_id": nil, + "buckets": bson.M{"$addToSet": "$bucket"}, + }, + }, + } + cursor, err := m.getObjTrafficCollection().Aggregate(context.Background(), pipeline) + if err != nil { + return nil, err + } + defer cursor.Close(context.Background()) + + var result struct { + Buckets []string `bson:"buckets"` + } + if cursor.Next(context.Background()) { + if err := cursor.Decode(&result); err != nil { + return nil, err + } + return result.Buckets, nil + } + if err := cursor.Err(); err != nil { + return nil, err + } + return nil, nil +} + // InsertMonitor insert monitor data to mongodb collection monitor + time (eg: monitor_20200101) // The monitor data is saved daily 2020-12-01 00:00:00 - 2020-12-01 23:59:59 => monitor_20201201 func (m *mongoDB) InsertMonitor(ctx context.Context, monitors ...*resources.Monitor) error { @@ -306,36 +425,6 @@ func (m *mongoDB) GetDistinctMonitorCombinations(startTime, endTime time.Time) ( return monitors, nil } -func (m *mongoDB) GetAllPricesMap() (map[string]resources.Price, error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - cursor, err := m.getPricesCollection().Find(ctx, bson.M{}) - if err != nil { - return nil, fmt.Errorf("get all prices error: %v", err) - } - var prices []struct { - Property string `json:"property" bson:"property"` - Price string `json:"price" bson:"price"` - Detail string `json:"detail" bson:"detail"` - } - if err = cursor.All(ctx, &prices); err != nil { - return nil, fmt.Errorf("get all prices error: %v", err) - } - var pricesMap = make(map[string]resources.Price, len(prices)) - for i := range prices { - price, err := crypto.DecryptInt64WithKey(prices[i].Price, []byte(cryptoKey)) - if err != nil { - return nil, fmt.Errorf("decrypt price error: %v", err) - } - pricesMap[prices[i].Property] = resources.Price{ - Price: price, - Detail: prices[i].Detail, - Property: prices[i].Property, - } - } - return pricesMap, nil -} - func (m *mongoDB) GetAllPayment() ([]resources.Billing, error) { filter := bson.M{ "type": 1, @@ -393,7 +482,7 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou minutes := endTime.Sub(startTime).Minutes() groupStage := bson.D{ - primitive.E{Key: "_id", Value: bson.D{{Key: "type", Value: "$type"}, {Key: "name", Value: "$name"}, {Key: "category", Value: "$category"}}}, + primitive.E{Key: "_id", Value: bson.D{{Key: "type", Value: "$type"}, {Key: "name", Value: "$name"}, {Key: "category", Value: "$category"}, {Key: "parent_type", Value: "$parent_type"}, {Key: "parent_name", Value: "$parent_name"}}}, primitive.E{Key: "count", Value: bson.D{{Key: "$sum", Value: 1}}}, } @@ -401,6 +490,8 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou primitive.E{Key: "_id", Value: 0}, primitive.E{Key: "type", Value: "$_id.type"}, primitive.E{Key: "name", Value: "$_id.name"}, + primitive.E{Key: "parent_type", Value: "$_id.parent_type"}, + primitive.E{Key: "parent_name", Value: "$_id.parent_name"}, primitive.E{Key: "category", Value: "$_id.category"}, } @@ -464,16 +555,18 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou } defer cursor.Close(context.Background()) - var appCostsMap = make(map[string]map[uint8][]resources.AppCost) + var appCostsMap = make(map[string]map[string][]resources.AppCost) // map[ns/type]int64 var nsTypeAmount = make(map[string]int64) for cursor.Next(context.Background()) { var result struct { - Type uint8 `bson:"type"` - Namespace string `bson:"category"` - Name string `bson:"name"` - Used resources.EnumUsedMap `bson:"used"` + Type uint8 `bson:"type"` + Namespace string `bson:"category"` + Name string `bson:"name"` + ParentType uint8 `bson:"parent_type"` + ParentName string `bson:"parent_name"` + Used resources.EnumUsedMap `bson:"used"` } err := cursor.Decode(&result) @@ -485,12 +578,14 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou //logger.Info("generate billing data", "result", result) if _, ok := appCostsMap[result.Namespace]; !ok { - appCostsMap[result.Namespace] = make(map[uint8][]resources.AppCost) + appCostsMap[result.Namespace] = make(map[string][]resources.AppCost) } - if _, ok := appCostsMap[result.Namespace][result.Type]; !ok { - appCostsMap[result.Namespace][result.Type] = make([]resources.AppCost, 0) + strType := strconv.Itoa(int(result.Type)) + if _, ok := appCostsMap[result.Namespace][strType]; !ok { + appCostsMap[result.Namespace][strType] = make([]resources.AppCost, 0) } appCost := resources.AppCost{ + Type: result.Type, Used: result.Used, Name: result.Name, UsedAmount: make(map[uint8]int64), @@ -507,13 +602,17 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou if appCost.Amount == 0 { continue } - nsTypeAmount[result.Namespace+strconv.Itoa(int(result.Type))] += appCost.Amount - appCostsMap[result.Namespace][result.Type] = append(appCostsMap[result.Namespace][result.Type], appCost) + key := result.Namespace + "/" + strType + if result.ParentType != 0 && result.ParentName != "" { + key = result.Namespace + "/" + strconv.Itoa(int(result.ParentType)) + "/" + result.ParentName + } + nsTypeAmount[key] += appCost.Amount + appCostsMap[result.Namespace][key] = append(appCostsMap[result.Namespace][key], appCost) } for ns, appCostMap := range appCostsMap { for tp, appCost := range appCostMap { - amountt := nsTypeAmount[ns+strconv.Itoa(int(tp))] + amountt := nsTypeAmount[tp] if amountt == 0 { continue } @@ -521,11 +620,21 @@ func (m *mongoDB) GenerateBillingData(startTime, endTime time.Time, prols *resou if err != nil { return nil, 0, fmt.Errorf("generate billing id error: %v", err) } + // tp = ns/type/parentName && parentName not contain "/" + appType, appName := 0, "" + switch strings.Count(tp, "/") { + case 1: + appType, _ = strconv.Atoi(strings.Split(tp, "/")[1]) + case 2: + appType, _ = strconv.Atoi(strings.Split(tp, "/")[1]) + appName = strings.Split(tp, "/")[2] + } billing := resources.Billing{ OrderID: id, Type: accountv1.Consumption, Namespace: ns, - AppType: tp, + AppType: uint8(appType), + AppName: appName, AppCosts: appCost, Amount: amountt, Owner: owner, @@ -901,13 +1010,12 @@ func (m *mongoDB) getMonitorCollectionName(collTime time.Time) string { return fmt.Sprintf("%s_%s", m.MonitorConnPrefix, collTime.Format("20060102")) } -func (m *mongoDB) getPricesCollection() *mongo.Collection { - return m.Client.Database(m.AccountDB).Collection(m.PricesConn) -} - func (m *mongoDB) getBillingCollection() *mongo.Collection { return m.Client.Database(m.AccountDB).Collection(m.BillingConn) } +func (m *mongoDB) getObjTrafficCollection() *mongo.Collection { + return m.Client.Database(m.AccountDB).Collection(m.ObjTrafficConn) +} func (m *mongoDB) getPropertiesCollection() *mongo.Collection { return m.Client.Database(m.AccountDB).Collection(m.PropertiesConn) @@ -964,6 +1072,21 @@ func (m *mongoDB) CreateTimeSeriesIfNotExist(dbName, collectionName string) erro return m.Client.Database(dbName).RunCommand(context.TODO(), cmd).Err() } +func (m *mongoDB) CreateTTLTrafficTimeSeries() error { + // Check if the collection already exists + if exist, err := m.collectionExist(m.AccountDB, m.ObjTrafficConn); exist || err != nil { + return err + } + // If the collection does not exist, create it + cmd := bson.D{ + primitive.E{Key: "create", Value: m.ObjTrafficConn}, + primitive.E{Key: "timeseries", Value: bson.D{{Key: "timeField", Value: "time"}}}, + //default ttl set 30 days + primitive.E{Key: "expireAfterSeconds", Value: 30 * 24 * 60 * 60}, + } + return m.Client.Database(m.AccountDB).RunCommand(context.TODO(), cmd).Err() +} + func (m *mongoDB) DropMonitorCollectionsOlderThan(days int) error { db := m.Client.Database(m.AccountDB) // Get the current time minus the number of days @@ -1008,7 +1131,7 @@ func NewMongoInterface(ctx context.Context, URL string) (database.Interface, err MeteringConn: DefaultMeteringConn, MonitorConnPrefix: DefaultMonitorConn, BillingConn: DefaultBillingConn, - PricesConn: DefaultPricesConn, + ObjTrafficConn: DefaultObjTrafficConn, PropertiesConn: DefaultPropertiesConn, TrafficConn: env.GetEnvWithDefault(EnvTrafficConn, DefaultTrafficConn), CvmConn: env.GetEnvWithDefault(EnvCVMConn, DefaultCVMConn), diff --git a/controllers/pkg/database/mongo/account_test.go b/controllers/pkg/database/mongo/account_test.go index 14d31d37204..f8480747a61 100644 --- a/controllers/pkg/database/mongo/account_test.go +++ b/controllers/pkg/database/mongo/account_test.go @@ -22,6 +22,8 @@ import ( "testing" "time" + "github.com/labring/sealos/controllers/pkg/types" + "github.com/labring/sealos/controllers/pkg/resources" "github.com/dustin/go-humanize" @@ -479,25 +481,6 @@ func TestMongoDB_GetBillingLastUpdateTime(t *testing.T) { t.Logf("lastUpdateTime: %v", lastUpdateTime) } -func TestMongoDB_GetAllPricesMap(t *testing.T) { - dbCTX := context.Background() - - m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) - if err != nil { - t.Errorf("failed to connect mongo: error = %v", err) - } - defer func() { - if err = m.Disconnect(dbCTX); err != nil { - t.Errorf("failed to disconnect mongo: error = %v", err) - } - }() - pricesMap, err := m.GetAllPricesMap() - if err != nil { - t.Fatalf("failed to get all prices map: %v", err) - } - t.Logf("pricesMap: %v", pricesMap) -} - func TestMongoDB_DropMonitorCollectionsOlderThan(t *testing.T) { dbCTX := context.Background() m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) @@ -614,3 +597,120 @@ func Test_mongoDB_GetDistinctMonitorCombinations(t *testing.T) { } t.Logf("monitorCombinations: %v", monitorCombinations) } + +func Test_mongoDB_CreateTTLTrafficTimeSeries(t *testing.T) { + dbCTX := context.Background() + + m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) + if err != nil { + t.Errorf("failed to connect mongo: error = %v", err) + } + defer func() { + if err = m.Disconnect(dbCTX); err != nil { + t.Errorf("failed to disconnect mongo: error = %v", err) + } + }() + + if err = m.CreateTTLTrafficTimeSeries(); err != nil { + t.Fatalf("failed to create TTL traffic time series: %v", err) + } + t.Logf("create TTL traffic time series success") +} + +func Test_mongoDB_SaveObjTraffic(t *testing.T) { + dbCTX := context.Background() + + m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) + if err != nil { + t.Errorf("failed to connect mongo: error = %v", err) + } + defer func() { + if err = m.Disconnect(dbCTX); err != nil { + t.Errorf("failed to disconnect mongo: error = %v", err) + } + }() + var traffic []*types.ObjectStorageTraffic + for i := 0; i < 10; i++ { + traffic = append(traffic, &types.ObjectStorageTraffic{ + Time: time.Now().UTC(), + User: "user-" + fmt.Sprint(i), + Bucket: "bucket-" + fmt.Sprint(i), + TotalSent: int64(1000 + i), + Sent: int64(100 + i), + }) + } + if err = m.SaveObjTraffic(traffic...); err != nil { + t.Fatalf("failed to save object storage traffic: %v", err) + } + t.Logf("save object storage traffic success") +} + +func Test_mongoDB_GetAllLatestObjTraffic(t *testing.T) { + dbCTX := context.Background() + + m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) + if err != nil { + t.Errorf("failed to connect mongo: error = %v", err) + } + defer func() { + if err = m.Disconnect(dbCTX); err != nil { + t.Errorf("failed to disconnect mongo: error = %v", err) + } + }() + + traffic, err := m.GetAllLatestObjTraffic(time.Now().Add(-time.Hour), time.Now()) + if err != nil { + t.Fatalf("failed to save object storage traffic: %v", err) + } + t.Logf("save object storage traffic success") + for _, tf := range traffic { + t.Logf("traffic: %#+v", tf) + } +} + +func Test_mongoDB_HandlerTimeObjBucketSentTraffic(t *testing.T) { + dbCTX := context.Background() + + m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) + if err != nil { + t.Errorf("failed to connect mongo: error = %v", err) + } + defer func() { + if err = m.Disconnect(dbCTX); err != nil { + t.Errorf("failed to disconnect mongo: error = %v", err) + } + }() + + bytes, err := m.HandlerTimeObjBucketSentTraffic(time.Now().UTC().Add(-time.Hour), time.Now().UTC(), "bucket-6") + if err != nil { + t.Fatalf("failed to handle time object bucket usage: %v", err) + } + t.Logf("handle time object bucket usage success: %v", bytes) +} + +func init() { + os.Setenv("MONGODB_URI", "") +} + +func Test_mongoDB_GetTimeObjBucketBucket(t *testing.T) { + dbCTX := context.Background() + + m, err := NewMongoInterface(dbCTX, os.Getenv("MONGODB_URI")) + if err != nil { + t.Errorf("failed to connect mongo: error = %v", err) + } + defer func() { + if err = m.Disconnect(dbCTX); err != nil { + t.Errorf("failed to disconnect mongo: error = %v", err) + } + }() + + buckets, err := m.GetTimeObjBucketBucket(time.Now().UTC().Add(-10*time.Hour), time.Now().UTC()) + if err != nil { + t.Fatalf("failed to get time object bucket bucket: %v", err) + } + t.Logf("get time object bucket bucket success: len: %v", len(buckets)) + for _, bucket := range buckets { + t.Logf("bucket: %#+v", bucket) + } +} diff --git a/controllers/pkg/go.mod b/controllers/pkg/go.mod index 8e556f8d66c..4151613e102 100644 --- a/controllers/pkg/go.mod +++ b/controllers/pkg/go.mod @@ -1,14 +1,16 @@ module github.com/labring/sealos/controllers/pkg -go 1.20 +go 1.22 + +toolchain go1.22.4 replace ( - k8s.io/api => k8s.io/api v0.25.6 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.6 - k8s.io/apimachinery => k8s.io/apimachinery v0.25.6 - k8s.io/client-go => k8s.io/client-go v0.25.6 - k8s.io/component-base => k8s.io/component-base v0.25.6 - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.13.0 + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 ) replace ( @@ -20,15 +22,15 @@ require ( github.com/containers/storage v1.50.2 github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 github.com/dustin/go-humanize v1.0.1 - github.com/go-logr/logr v1.2.4 + github.com/go-logr/logr v1.4.1 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/google/uuid v1.6.0 github.com/labring/sealos/controllers/account v0.0.0-00010101000000-000000000000 github.com/matoous/go-nanoid/v2 v2.0.0 github.com/minio/minio-go/v7 v7.0.64 - github.com/prometheus/client_golang v1.15.1 - github.com/prometheus/client_model v0.4.0 - github.com/prometheus/common v0.44.0 + github.com/prometheus/client_golang v1.18.0 + github.com/prometheus/client_model v0.5.0 + github.com/prometheus/common v0.45.0 github.com/prometheus/prom2json v1.3.3 github.com/spf13/pflag v1.0.5 github.com/stripe/stripe-go/v74 v74.30.0 @@ -40,11 +42,11 @@ require ( gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/postgres v1.5.4 gorm.io/gorm v1.25.5 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.2 - sigs.k8s.io/controller-runtime v0.15.2 - sigs.k8s.io/yaml v1.3.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.17.2 + sigs.k8s.io/yaml v1.4.0 ) require ( @@ -52,17 +54,17 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -79,6 +81,7 @@ require ( github.com/labring/sealos/controllers/user v0.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/moby/sys/mountinfo v0.6.2 // indirect @@ -89,7 +92,7 @@ require ( github.com/opencontainers/runc v1.1.9 // indirect github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -101,25 +104,26 @@ require ( github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/net v0.22.0 // indirect - golang.org/x/oauth2 v0.9.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/controllers/pkg/go.sum b/controllers/pkg/go.sum index e3cc2f1bfed..5af680fa90a 100644 --- a/controllers/pkg/go.sum +++ b/controllers/pkg/go.sum @@ -1,21 +1,9 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containers/storage v1.50.2 h1:Fys4BjFUVNRBEXlO70hFI48VW4EXsgnGisTpk9tTMsE= github.com/containers/storage v1.50.2/go.mod h1:dpspZsUrcKD8SpTofvKWhwPDHD0MkO4Q7VE+oYdWkiA= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -26,79 +14,57 @@ github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49/go.mod h1:sbm1DAsayX+XsXCOC2CFAAU9JZhX0SPKwnybDjSd0Ls= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= +github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -107,7 +73,6 @@ github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/ github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -115,6 +80,7 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -127,9 +93,9 @@ github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/q github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -141,6 +107,8 @@ github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.64 h1:Zdza8HwOzkld0ZG/og50w56fKi6AAyfqfifmasD9n2Q= @@ -160,52 +128,52 @@ github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.2 h1:HFB2fbVIlhIfCfOW81bZFbiC/RvnpXSdhbF2/DJr134= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/runc v1.1.9 h1:XR0VIHTGce5eWPkaPesqTBrhW2yAcaraWfsEalNwQLM= github.com/opencontainers/runc v1.1.9/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo= github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= @@ -220,9 +188,6 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -230,8 +195,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -243,38 +208,24 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= -golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -282,20 +233,15 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -306,7 +252,6 @@ golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= @@ -316,56 +261,29 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -375,42 +293,38 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.25.6 h1:MwdaCpHtGVSM5SiA6Hm4g2w5voMNiPCwBjOqz9YTlrg= -k8s.io/apiextensions-apiserver v0.25.6/go.mod h1:aXw8Xmhf6/gfGx3y0xkj8o8evTZbfOFqZeWIigg4XsE= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/component-base v0.25.6 h1:v3ci6FbXFcxpjyQJaaLq0MgzT3vyFzwUDWtO+KRv9Bk= -k8s.io/component-base v0.25.6/go.mod h1:k7DfcfJ8cOI6A2xTCfU5LxsnXV+lWw1ME8cRCHzIh6o= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/pkg/objectstorage/metric_parser.go b/controllers/pkg/objectstorage/metric_parser.go index 1d4b0ee602f..47ec3345433 100644 --- a/controllers/pkg/objectstorage/metric_parser.go +++ b/controllers/pkg/objectstorage/metric_parser.go @@ -75,13 +75,18 @@ func NewMetricsClient(endpoint string, accessKeyID, secretAccessKey string, secu return privateNewMetricsClient(endpointURL, jwtToken, secure) } -// BucketUsageTotalBytesMetrics - returns Bucket Metrics in Prometheus format +// BucketUsageTotalBytesMetrics - returns Bucket Usage Total Metrics in Prometheus format func (client *MetricsClient) BucketUsageTotalBytesMetrics(ctx context.Context) ([]*prom2json.Family, error) { - return client.fetchMetrics(ctx, "bucket", "minio_bucket_usage_total_bytes") + return client.fetchMetrics(ctx, "bucket", []string{"minio_bucket_usage_total_bytes"}) +} + +// BucketUsageAndTrafficBytesMetrics - returns Bucket Usage And Traffic Metrics in Prometheus format +func (client *MetricsClient) BucketUsageAndTrafficBytesMetrics(ctx context.Context) ([]*prom2json.Family, error) { + return client.fetchMetrics(ctx, "bucket", []string{"minio_bucket_usage_total_bytes", "minio_bucket_traffic_sent_bytes", "minio_bucket_traffic_received_bytes"}) } // fetchMetrics - returns Metrics of given subsystem in Prometheus format -func (client *MetricsClient) fetchMetrics(ctx context.Context, subSystem string, metricsName string) ([]*prom2json.Family, error) { +func (client *MetricsClient) fetchMetrics(ctx context.Context, subSystem string, metricsName []string) ([]*prom2json.Family, error) { reqData := metricsRequestData{ relativePath: "/v2/metrics/" + subSystem, } @@ -119,7 +124,7 @@ func closeResponse(resp *http.Response) { } } -func parsePrometheusResults(reader io.Reader, prefix string) (results []*prom2json.Family, err error) { +func parsePrometheusResults(reader io.Reader, prefix []string) (results []*prom2json.Family, err error) { filteredReader, err := filterMetricsByPrefix(reader, prefix) if err != nil { return nil, err @@ -136,10 +141,11 @@ func parsePrometheusResults(reader io.Reader, prefix string) (results []*prom2js }() for mf := range mfChan { - if !strings.Contains(mf.GetName(), prefix) { - continue + for i := range prefix { + if strings.Contains(mf.GetName(), prefix[i]) { + results = append(results, prom2json.NewFamily(mf)) + } } - results = append(results, prom2json.NewFamily(mf)) } if err := <-errChan; err != nil { return nil, err @@ -147,7 +153,7 @@ func parsePrometheusResults(reader io.Reader, prefix string) (results []*prom2js return results, nil } -func filterMetricsByPrefix(reader io.Reader, prefix string) (io.Reader, error) { +func filterMetricsByPrefix(reader io.Reader, prefix []string) (io.Reader, error) { var buf bytes.Buffer for { line, err := readLine(reader) @@ -156,11 +162,17 @@ func filterMetricsByPrefix(reader io.Reader, prefix string) (io.Reader, error) { } else if err != nil { return nil, err } - if bytes.HasPrefix(line, []byte("#")) || !bytes.HasPrefix(line, []byte(prefix)) { + + if bytes.HasPrefix(line, []byte("#")) { continue } - if _, err := buf.Write(line); err != nil { - return nil, err + + for i := range prefix { + if bytes.HasPrefix(line, []byte(prefix[i])) { + if _, err := buf.Write(line); err != nil { + return nil, err + } + } } } return &buf, nil diff --git a/controllers/pkg/objectstorage/objectstorage.go b/controllers/pkg/objectstorage/objectstorage.go index 2e69d26966e..ccc2985e33e 100644 --- a/controllers/pkg/objectstorage/objectstorage.go +++ b/controllers/pkg/objectstorage/objectstorage.go @@ -145,12 +145,24 @@ func QueryPrometheus(host, bucketName, instance string, startTime, endTime time. return 0, fmt.Errorf("failed to query Prometheus: %w", err) } + if rcvdValues[0] <= 0 || rcvdValues[1] <= 0 { + fmt.Println("[Warning] The metrics retrieved by vector-metrics are less than or equal to 0.", "bucket:", bucketName) + fmt.Printf("received bytes: {startTime: {time: %v, value: %v}, endTime: {time: %v, value: %v}}\n", startTime.Format(timeFormat), rcvdValues[0], endTime.Format(timeFormat), rcvdValues[1]) + return 0, nil + } + sentQuery := fmt.Sprintf("sum(minio_bucket_traffic_sent_bytes{bucket=\"%s\", instance=\"%s\"})", bucketName, instance) sentValues, err := queryPrometheus(ctx, v1api, sentQuery, startTime, endTime) if err != nil { return 0, fmt.Errorf("failed to query Prometheus: %w", err) } + if sentValues[0] <= 0 || sentValues[1] <= 0 { + fmt.Println("[Warning] The metrics retrieved by vector-metrics are less than or equal to 0.", "bucket:", bucketName) + fmt.Printf("sent bytes: {startTime: {time: %v, value: %v}, endTime: {time: %v, value: %v}}\n", startTime.Format(timeFormat), sentValues[0], endTime.Format(timeFormat), sentValues[1]) + return 0, nil + } + receivedDiff := rcvdValues[1] - rcvdValues[0] sentDiff := sentValues[1] - sentValues[0] @@ -187,6 +199,10 @@ func extractValues(result1, result2 model.Value) (int64, int64) { type MetricData struct { // key: bucket name, value: usage Usage map[string]int64 + // key: bucket name, value: traffic sent + Sent map[string]int64 + // key: bucket name, value: traffic received + Received map[string]int64 } type Metrics map[string]MetricData @@ -225,6 +241,57 @@ func QueryUserUsage(client *MetricsClient) (Metrics, error) { return obMetrics, err } +func QueryUserUsageAndTraffic(client *MetricsClient) (Metrics, error) { + obMetrics := make(Metrics) + bucketMetrics, err := client.BucketUsageAndTrafficBytesMetrics(context.TODO()) + if err != nil { + return nil, fmt.Errorf("failed to get bucket traffic metrics: %w", err) + } + for _, bucketMetric := range bucketMetrics { + if !isUsageAndTrafficBytesTargetMetric(bucketMetric.Name) { + continue + } + + for _, metrics := range bucketMetric.Metrics { + promMetrics := metrics.(prom2json.Metric) + floatValue, err := strconv.ParseFloat(promMetrics.Value, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse %s to float value", promMetrics.Value) + } + intValue := int64(floatValue) + if bucket := promMetrics.Labels["bucket"]; bucket != "" { + //fmt.Println("debug info", "type:", bucketMetric.Name, "promMetrics:", promMetrics) + user := getUserWithBucket(bucket) + if user == "" { + //fmt.Println("debug info", "false bucket:", bucket) + continue + } + //fmt.Println("debug info", "true bucket:", bucket, "user:", user) + metricData, exists := obMetrics[user] + if !exists { + metricData = MetricData{ + Usage: make(map[string]int64), + Sent: make(map[string]int64), + Received: make(map[string]int64), + } + } + if bucketMetric.Name == "minio_bucket_usage_total_bytes" { + metricData.Usage[bucket] += intValue + } + if bucketMetric.Name == "minio_bucket_traffic_sent_bytes" { + metricData.Sent[bucket] += intValue + } + if bucketMetric.Name == "minio_bucket_traffic_received_bytes" { + metricData.Received[bucket] += intValue + } + obMetrics[user] = metricData + } + } + } + + return obMetrics, err +} + func isUsageBytesTargetMetric(name string) bool { targetMetrics := []string{ "minio_bucket_usage_total_bytes", @@ -237,8 +304,27 @@ func isUsageBytesTargetMetric(name string) bool { return false } +func isUsageAndTrafficBytesTargetMetric(name string) bool { + targetMetrics := []string{ + "minio_bucket_usage_total_bytes", + "minio_bucket_traffic_sent_bytes", + "minio_bucket_traffic_received_bytes", + } + for _, target := range targetMetrics { + if name == target { + return true + } + } + return false +} + func getUserWithBucket(bucket string) string { - return strings.Split(bucket, "-")[0] + re := regexp.MustCompile(`^([a-zA-Z0-9]{8})-(.*)$`) + matches := re.FindStringSubmatch(bucket) + if len(matches) == 3 { + return matches[1] + } + return "" } /* @@ -256,25 +342,25 @@ func getUserWithBucket(bucket string) string { 6/halo-faxdridb-pg-yhxnjm.tar.gz */ -func GetUserBakFileSize(client *minio.Client) map[string]int64 { - bucket := "file-backup" - userUsageMap := make(map[string]int64) - objectsCh := client.ListObjects(context.Background(), bucket, minio.ListObjectsOptions{Recursive: true}) - for object := range objectsCh { - user := extractNamespace(object.Key) - if user != "" { - userUsageMap[user] += object.Size - } - } - - return userUsageMap -} - -func extractNamespace(input string) string { - re := regexp.MustCompile(`ns-(\w+)`) - matches := re.FindStringSubmatch(input) - if len(matches) < 2 { - return "" - } - return matches[1] -} +//func GetUserBakFileSize(client *minio.Client) map[string]int64 { +// bucket := "file-backup" +// userUsageMap := make(map[string]int64) +// objectsCh := client.ListObjects(context.Background(), bucket, minio.ListObjectsOptions{Recursive: true}) +// for object := range objectsCh { +// user := extractNamespace(object.Key) +// if user != "" { +// userUsageMap[user] += object.Size +// } +// } +// +// return userUsageMap +//} + +//func extractNamespace(input string) string { +// re := regexp.MustCompile(`ns-(\w+)`) +// matches := re.FindStringSubmatch(input) +// if len(matches) < 2 { +// return "" +// } +// return matches[1] +//} diff --git a/controllers/pkg/objectstorage/objectstorage_test.go b/controllers/pkg/objectstorage/objectstorage_test.go index 7cd466b0cda..e10c48d2439 100644 --- a/controllers/pkg/objectstorage/objectstorage_test.go +++ b/controllers/pkg/objectstorage/objectstorage_test.go @@ -62,14 +62,20 @@ func TestQueryUserUsage(t *testing.T) { } } -func TestGetUserBakFileSize(t *testing.T) { - objStorageClient, err := objectstoragev1.NewOSClient("objectstorageapi.192.168.0.55.nip.io", "username", "passw0rd") +func TestQueryUserTraffic(t *testing.T) { + obClient, err := NewMetricsClient("objectstorageapi.192.168.0.55.nip.io", "username", "passw0rd", false) if err != nil { - t.Fatalf("NewOSClient error: %v", err) + t.Error(err) } - bakFileSize := GetUserBakFileSize(objStorageClient) + metrics, err := QueryUserUsageAndTraffic(obClient) if err != nil { - t.Fatalf("GetUserBakFileSize error: %v", err) + t.Error(err) + } + + for user, metric := range metrics { + fmt.Println("user:", user) + fmt.Println("usage:", metric.Usage) + fmt.Println("sent:", metric.Sent) + fmt.Println("received:", metric.Received) } - fmt.Println(bakFileSize) } diff --git a/controllers/pkg/resources/named.go b/controllers/pkg/resources/named.go index 44cd8cb5d9c..5e214a12ccd 100644 --- a/controllers/pkg/resources/named.go +++ b/controllers/pkg/resources/named.go @@ -17,6 +17,8 @@ package resources import ( "strings" + "github.com/labring/sealos/controllers/pkg/utils/label" + corev1 "k8s.io/api/core/v1" sealos_networkmanager "github.com/dinoallo/sealos-networkmanager-protoapi" @@ -46,29 +48,42 @@ const ( TerminalIDLabelKey = "TerminalID" AppLabelKey = "app" AppDeployLabelKey = "cloud.sealos.io/app-deploy-manager" + AppStoreDeployLabelKey = "cloud.sealos.io/deploy-on-sealos" JobNameLabelKey = "job-name" ACMEChallengeKey = "acme.cert-manager.io/http01-solver" KubeBlocksBackUpName = "kubeblocks-backup-data" dataProtectionBackupRepoKey = "dataprotection.kubeblocks.io/backup-repo-name" + InstanceLabelKey = "app.kubernetes.io/instance" ) type ResourceNamed struct { _name string // db or app or terminal or job or other - _type string - labels map[string]string + _type string + parentType string + parentName string + labels map[string]string } func NewResourceNamed(cr client.Object) *ResourceNamed { labels := cr.GetLabels() p := &ResourceNamed{labels: labels} switch { + case cr.GetName() == KubeBlocksBackUpName || labels[dataProtectionBackupRepoKey] != "": + p._type = DBBackup + p._name = KubeBlocksBackUpName + if labels[InstanceLabelKey] != "" { + p._name = labels[InstanceLabelKey] + } case labels[DBPodLabelComponentNameKey] != "": p._type = DB p._name = labels[DBPodLabelInstanceKey] - case labels[TerminalIDLabelKey] != "": + case labels[TerminalIDLabelKey] != "" || (labels[label.AppManagedBy] == label.DefaultManagedBy && labels[label.AppPartOf] == "terminal"): p._type = TERMINAL p._name = "" + case labels[label.AppPartOf] == "devbox": + p._type = DevBox + p._name = labels[label.AppName] case labels[AppLabelKey] != "": p._type = APP p._name = labels[AppLabelKey] @@ -81,9 +96,6 @@ func NewResourceNamed(cr client.Object) *ResourceNamed { case labels[ACMEChallengeKey] != "": p._type = APP p._name = getACMEResolverName(cr) - case cr.GetName() == KubeBlocksBackUpName || labels[dataProtectionBackupRepoKey] != "": - p._type = JOB - p._name = KubeBlocksBackUpName default: p._type = OTHER p._name = "" @@ -91,6 +103,15 @@ func NewResourceNamed(cr client.Object) *ResourceNamed { return p } +func (r *ResourceNamed) SetInstanceParent(instances map[string]struct{}) { + for ins := range instances { + if strings.HasPrefix(r._name, ins) { + r.parentType = AppStore + r.parentName = ins + } + } +} + func NewObjStorageResourceNamed(bucket string) *ResourceNamed { return &ResourceNamed{ _type: ObjectStorage, @@ -121,22 +142,30 @@ func getACMEResolverName(obj client.Object) string { return pod.Name } -func (p *ResourceNamed) Type() uint8 { - return AppType[p._type] +func (r *ResourceNamed) Type() uint8 { + return AppType[r._type] +} + +func (r *ResourceNamed) ParentType() uint8 { + return AppType[r.parentType] +} + +func (r *ResourceNamed) ParentName() string { + return r.parentName } -func (p *ResourceNamed) Labels() map[string]string { +func (r *ResourceNamed) Labels() map[string]string { label := make(map[string]string) - switch p.Type() { + switch r.Type() { case db: - label[DBPodLabelComponentNameKey] = p.labels[DBPodLabelComponentNameKey] - label[DBPodLabelInstanceKey] = p.labels[DBPodLabelInstanceKey] + label[DBPodLabelComponentNameKey] = r.labels[DBPodLabelComponentNameKey] + label[DBPodLabelInstanceKey] = r.labels[DBPodLabelInstanceKey] case terminal: - label[TerminalIDLabelKey] = p.labels[TerminalIDLabelKey] + label[TerminalIDLabelKey] = r.labels[TerminalIDLabelKey] case app: - label[AppLabelKey] = p.labels[AppLabelKey] + label[AppLabelKey] = r.labels[AppLabelKey] case job: - label[JobNameLabelKey] = p.labels[JobNameLabelKey] + label[JobNameLabelKey] = r.labels[JobNameLabelKey] //case other: //default: } @@ -151,8 +180,8 @@ var notExistLabels = func() map[uint8][]*sealos_networkmanager.Label { return labels }() -func (p *ResourceNamed) GetNotExistLabels() []*sealos_networkmanager.Label { - return notExistLabels[p.Type()] +func (r *ResourceNamed) GetNotExistLabels() []*sealos_networkmanager.Label { + return notExistLabels[r.Type()] } func getNotExistLabels(tp uint8) []*sealos_networkmanager.Label { @@ -185,41 +214,41 @@ func getNotExistLabels(tp uint8) []*sealos_networkmanager.Label { return labels } -func (p *ResourceNamed) GetInLabels() []*sealos_networkmanager.Label { +func (r *ResourceNamed) GetInLabels() []*sealos_networkmanager.Label { var labelsEqual []*sealos_networkmanager.Label - switch p.Type() { + switch r.Type() { case db: labelsEqual = append(labelsEqual, &sealos_networkmanager.Label{ Key: DBPodLabelComponentNameKey, - Value: []string{p.labels[DBPodLabelComponentNameKey]}, + Value: []string{r.labels[DBPodLabelComponentNameKey]}, }) case terminal: labelsEqual = append(labelsEqual, &sealos_networkmanager.Label{ Key: TerminalIDLabelKey, - Value: []string{p.labels[TerminalIDLabelKey]}, + Value: []string{r.labels[TerminalIDLabelKey]}, }) case app: labelsEqual = append(labelsEqual, &sealos_networkmanager.Label{ Key: AppLabelKey, - Value: []string{p.labels[AppLabelKey]}, + Value: []string{r.labels[AppLabelKey]}, }) case job: labelsEqual = append(labelsEqual, &sealos_networkmanager.Label{ Key: JobNameLabelKey, - Value: []string{p.labels[JobNameLabelKey]}, + Value: []string{r.labels[JobNameLabelKey]}, }) } return labelsEqual } -func (p *ResourceNamed) TypeString() string { - return p._type +func (r *ResourceNamed) TypeString() string { + return r._type } -func (p *ResourceNamed) Name() string { - return p._name +func (r *ResourceNamed) Name() string { + return r._name } -func (p *ResourceNamed) String() string { - return p._type + "/" + p._name +func (r *ResourceNamed) String() string { + return r._type + "/" + r._name } diff --git a/controllers/pkg/resources/resources.go b/controllers/pkg/resources/resources.go index f94abb6712a..ffe94d3267d 100644 --- a/controllers/pkg/resources/resources.go +++ b/controllers/pkg/resources/resources.go @@ -15,15 +15,11 @@ package resources import ( - "fmt" "strings" "time" "github.com/labring/sealos/controllers/pkg/common" - "github.com/labring/sealos/controllers/pkg/crypto" - "github.com/labring/sealos/controllers/pkg/utils/logger" - "github.com/labring/sealos/controllers/pkg/gpu" "github.com/labring/sealos/controllers/pkg/utils/env" @@ -79,11 +75,13 @@ type Price struct { type Monitor struct { Time time.Time `json:"time" bson:"time"` // equal namespace - Category string `json:"category" bson:"category"` - Type uint8 `json:"type" bson:"type"` - Name string `json:"name" bson:"name"` - Used EnumUsedMap `json:"used" bson:"used"` - Property string `json:"property,omitempty" bson:"property,omitempty"` + Category string `json:"category" bson:"category"` + Type uint8 `json:"type" bson:"type"` + ParentType uint8 `json:"parent_type" bson:"parent_type"` + ParentName string `json:"parent_name" bson:"parent_name"` + Name string `json:"name" bson:"name"` + Used EnumUsedMap `json:"used" bson:"used"` + Property string `json:"property,omitempty" bson:"property,omitempty"` } type BillingType int @@ -98,6 +96,7 @@ type Billing struct { //UsedAmount Used `json:"used_amount" bson:"used_amount"` AppCosts []AppCost `json:"app_costs,omitempty" bson:"app_costs,omitempty"` + AppName string `json:"app_name,omitempty" bson:"app_name,omitempty"` AppType uint8 `json:"app_type,omitempty" bson:"app_type,omitempty"` Amount int64 `json:"amount" bson:"amount,omitempty"` @@ -127,6 +126,7 @@ type Transfer struct { } type AppCost struct { + Type uint8 `json:"type" bson:"type"` Used EnumUsedMap `json:"used" bson:"used"` UsedAmount EnumUsedMap `json:"used_amount" bson:"used_amount"` Amount int64 `json:"amount" bson:"amount,omitempty"` @@ -162,6 +162,9 @@ const ( other objectStorage cvm + appStore + dbBackup + devBox ) const ( @@ -172,14 +175,17 @@ const ( OTHER = "OTHER" ObjectStorage = "OBJECT-STORAGE" CVM = "CLOUD-VM" + AppStore = "APP-STORE" + DBBackup = "DB-BACKUP" + DevBox = "DEV-BOX" ) var AppType = map[string]uint8{ - DB: db, APP: app, TERMINAL: terminal, JOB: job, OTHER: other, ObjectStorage: objectStorage, CVM: cvm, + DB: db, APP: app, TERMINAL: terminal, JOB: job, OTHER: other, ObjectStorage: objectStorage, CVM: cvm, AppStore: appStore, DBBackup: dbBackup, DevBox: devBox, } var AppTypeReverse = map[uint8]string{ - db: DB, app: APP, terminal: TERMINAL, job: JOB, other: OTHER, objectStorage: ObjectStorage, cvm: CVM, + db: DB, app: APP, terminal: TERMINAL, job: JOB, other: OTHER, objectStorage: ObjectStorage, cvm: CVM, appStore: AppStore, dbBackup: DBBackup, devBox: DevBox, } // resource consumption @@ -287,11 +293,6 @@ func ConvertEnumUsedToString(costs map[uint8]int64) (costsMap map[string]int64) } func NewPropertyTypeLS(types []PropertyType) (ls *PropertyTypeLS) { - types, err := decryptPrice(types) - if err != nil { - logger.Warn("failed to decrypt price : %v", err) - types = DefaultPropertyTypeList - } return newPropertyTypeLS(types) } @@ -311,21 +312,6 @@ func newPropertyTypeLS(types []PropertyType) (ls *PropertyTypeLS) { return } -func decryptPrice(types []PropertyType) ([]PropertyType, error) { - for i := range types { - if types[i].EncryptUnitPrice == "" { - return types, fmt.Errorf("encrypt %s unit price is empty", types[i].Name) - } - price, err := crypto.DecryptFloat64(types[i].EncryptUnitPrice) - if err != nil { - return types, fmt.Errorf("failed to decrypt %s unit price : %v", types[i].Name, err) - } - types[i].UnitPrice = price - logger.Info("parse properties", types[i].Enum, types[i].UnitPrice) - } - return types, nil -} - type PropertyTypeEnumMap map[uint8]PropertyType type PropertyTypeStringMap map[string]PropertyType @@ -339,8 +325,10 @@ const ResourceGPU corev1.ResourceName = gpu.NvidiaGpuKey const ResourceNetwork = "network" const ( - ResourceRequestGpu corev1.ResourceName = "requests." + gpu.NvidiaGpuKey - ResourceLimitGpu corev1.ResourceName = "limits." + gpu.NvidiaGpuKey + ResourceRequestGpu corev1.ResourceName = "requests." + gpu.NvidiaGpuKey + ResourceLimitGpu corev1.ResourceName = "limits." + gpu.NvidiaGpuKey + ResourceObjectStorageSize corev1.ResourceName = "objectstorage/size" + ResourceObjectStorageBucket corev1.ResourceName = "objectstorage/bucket" ) func NewGpuResource(product string) corev1.ResourceName { @@ -378,19 +366,23 @@ func GetDefaultLimitRange(ns, name string) *corev1.LimitRange { } const ( - QuotaLimitsCPU = "QUOTA_LIMITS_CPU" - QuotaLimitsMemory = "QUOTA_LIMITS_MEMORY" - QuotaLimitsStorage = "QUOTA_LIMITS_STORAGE" - QuotaLimitsGPU = "QUOTA_LIMITS_GPU" - QuotaLimitsNodePorts = "QUOTA_LIMITS_NODE_PORTS" + QuotaLimitsCPU = "QUOTA_LIMITS_CPU" + QuotaLimitsMemory = "QUOTA_LIMITS_MEMORY" + QuotaLimitsStorage = "QUOTA_LIMITS_STORAGE" + QuotaLimitsGPU = "QUOTA_LIMITS_GPU" + QuotaLimitsNodePorts = "QUOTA_LIMITS_NODE_PORTS" + QuotaObjectStorageSize = "QUOTA_OBJECT_STORAGE_SIZE" + QuotaObjectStorageBucket = "QUOTA_OBJECT_STORAGE_BUCKET" ) const ( - DefaultQuotaLimitsCPU = "16" - DefaultQuotaLimitsMemory = "64Gi" - DefaultQuotaLimitsStorage = "100Gi" - DefaultQuotaLimitsGPU = "8" - DefaultQuotaLimitsNodePorts = "3" + DefaultQuotaLimitsCPU = "16" + DefaultQuotaLimitsMemory = "64Gi" + DefaultQuotaLimitsStorage = "100Gi" + DefaultQuotaLimitsGPU = "8" + DefaultQuotaLimitsNodePorts = "10" + DefaultQuotaObjectStorageSize = "100Gi" + DefaultQuotaObjectStorageBucket = "5" ) func DefaultResourceQuotaHard() corev1.ResourceList { @@ -402,6 +394,8 @@ func DefaultResourceQuotaHard() corev1.ResourceList { corev1.ResourceRequestsStorage: resource.MustParse(env.GetEnvWithDefault(QuotaLimitsStorage, DefaultQuotaLimitsStorage)), corev1.ResourceLimitsEphemeralStorage: resource.MustParse(env.GetEnvWithDefault(QuotaLimitsStorage, DefaultQuotaLimitsStorage)), corev1.ResourceServicesNodePorts: resource.MustParse(env.GetEnvWithDefault(QuotaLimitsNodePorts, DefaultQuotaLimitsNodePorts)), + ResourceObjectStorageSize: resource.MustParse(env.GetEnvWithDefault(QuotaObjectStorageSize, DefaultQuotaObjectStorageSize)), + ResourceObjectStorageBucket: resource.MustParse(env.GetEnvWithDefault(QuotaObjectStorageBucket, DefaultQuotaObjectStorageBucket)), //TODO storage.diskio.read, storage.diskio.write } } diff --git a/controllers/pkg/types/global.go b/controllers/pkg/types/global.go index 2a20bdcb95e..87097db16a5 100644 --- a/controllers/pkg/types/global.go +++ b/controllers/pkg/types/global.go @@ -21,8 +21,9 @@ import ( ) type Account struct { - UserUID uuid.UUID `gorm:"column:userUid;type:uuid;default:gen_random_uuid();primary_key"` - ActivityBonus int64 `gorm:"column:activityBonus;type:bigint;not null"` + UserUID uuid.UUID `gorm:"column:userUid;type:uuid;default:gen_random_uuid();primary_key"` + ActivityBonus int64 `gorm:"column:activityBonus;type:bigint;not null"` + // Discard EncryptBalance and EncryptDeductionBalance EncryptBalance string `gorm:"column:encryptBalance;type:text;not null"` EncryptDeductionBalance string `gorm:"column:encryptDeductionBalance;type:text;not null"` CreatedAt time.Time `gorm:"type:timestamp(3) with time zone;default:current_timestamp()"` @@ -103,15 +104,23 @@ func (Transfer) TableName() string { } type User struct { - UID uuid.UUID `gorm:"type:uuid;default:gen_random_uuid();primary_key"` - CreatedAt time.Time `gorm:"column:createdAt;type:timestamp(3) with time zone;default:current_timestamp()"` - UpdatedAt time.Time `gorm:"column:updatedAt;type:timestamp(3) with time zone;default:current_timestamp()"` - AvatarURI string `gorm:"column:avatarUri;type:text"` - Nickname string `gorm:"type:text"` - ID string `gorm:"type:text;not null;unique"` - Name string `gorm:"type:text;not null"` + UID uuid.UUID `gorm:"type:uuid;default:gen_random_uuid();primary_key"` + CreatedAt time.Time `gorm:"column:createdAt;type:timestamp(3) with time zone;default:current_timestamp()"` + UpdatedAt time.Time `gorm:"column:updatedAt;type:timestamp(3) with time zone;default:current_timestamp()"` + AvatarURI string `gorm:"column:avatarUri;type:text"` + Nickname string `gorm:"type:text"` + ID string `gorm:"type:text;not null;unique"` + Name string `gorm:"type:text;not null"` + Status UserStatus `gorm:"column:status;type:UserStatus;default:'NORMAL_USER'::defaultdb.public.'UserStatus';not null"` } +type UserStatus string + +const ( + UserStatusNormal UserStatus = "NORMAL_USER" + UserStatusLock UserStatus = "LOCK_USER" +) + func (User) TableName() string { return "User" } @@ -245,3 +254,69 @@ type Payment struct { func (Payment) TableName() string { return "Payment" } + +type InvoiceStatus string + +const ( + PendingInvoiceStatus = "PENDING" + CompletedInvoiceStatus = "COMPLETED" + RejectedInvoiceStatus = "REJECTED" +) + +type Invoice struct { + ID string `gorm:"type:text;primary_key" json:"id" bson:"id"` + UserID string `gorm:"type:text;not null" json:"userID" bson:"userID"` + CreatedAt time.Time `gorm:"type:timestamp(3) with time zone;default:current_timestamp()" bson:"createdAt" json:"createdAt"` + UpdatedAt time.Time `gorm:"type:timestamp(3) with time zone;default:current_timestamp()" bson:"updatedAt" json:"updatedAt"` + Detail string `gorm:"type:text;not null" json:"detail" bson:"detail"` + Remark string `gorm:"type:text" json:"remark" bson:"remark"` + TotalAmount int64 `gorm:"type:bigint;not null" json:"totalAmount" bson:"totalAmount"` + // Pending, Completed, Rejected + Status InvoiceStatus `gorm:"type:text;not null" json:"status" bson:"status"` +} + +type InvoicePayment struct { + InvoiceID string `gorm:"type:text"` + PaymentID string `gorm:"type:text;primary_key"` + Amount int64 `gorm:"type:bigint;not null"` +} + +func (Invoice) TableName() string { + return "Invoice" +} + +func (InvoicePayment) TableName() string { + return "InvoicePayment" +} + +type GiftCode struct { + ID uuid.UUID `gorm:"column:id;type:uuid;default:gen_random_uuid();primary_key"` + Code string `gorm:"column:code;type:text;not null;unique"` + CreditAmount int64 `gorm:"column:creditAmount;type:bigint;default:0;not null"` + Used bool `gorm:"column:used;type:boolean;default:false;not null"` + UsedBy uuid.UUID `gorm:"column:usedBy;type:uuid"` + UsedAt time.Time `gorm:"column:usedAt;type:timestamp(3) with time zone"` + CreatedAt time.Time `gorm:"column:createdAt;type:timestamp(3) with time zone;default:current_timestamp()"` + ExpiredAt time.Time `gorm:"column:expiredAt;type:timestamp(3) with time zone"` + Comment string `gorm:"column:comment;type:text"` +} + +func (GiftCode) TableName() string { + return "GiftCode" +} + +type AccountTransaction struct { + ID uuid.UUID `gorm:"column:id;type:uuid;default:gen_random_uuid();primary_key"` + Type string `gorm:"column:type;type:text"` + UserUID uuid.UUID `gorm:"column:userUid;type:uuid"` + DeductionBalance int64 `gorm:"column:deduction_balance;type:bigint"` + Balance int64 `gorm:"column:balance;type:bigint"` + Message *string `gorm:"column:message;type:text"` + CreatedAt time.Time `gorm:"column:created_at;type:timestamp(3) with time zone;default:current_timestamp()"` + UpdatedAt time.Time `gorm:"column:updated_at;type:timestamp(3) with time zone;default:current_timestamp()"` + BillingID uuid.UUID `gorm:"column:billing_id;type:uuid"` +} + +func (AccountTransaction) TableName() string { + return "AccountTransaction" +} diff --git a/controllers/pkg/types/traffic.go b/controllers/pkg/types/traffic.go new file mode 100644 index 00000000000..44adde50d3a --- /dev/null +++ b/controllers/pkg/types/traffic.go @@ -0,0 +1,28 @@ +// Copyright © 2024 sealos. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import "time" + +type ObjectStorageTraffic struct { + Time time.Time `json:"time" bson:"time"` + User string `json:"user" bson:"user"` + Bucket string `json:"bucket" bson:"bucket"` + //bytes + TotalSent int64 `json:"totalSent" bson:"totalSent"` + + //The sent traffic since the last time + Sent int64 `json:"sent" bson:"sent"` +} diff --git a/controllers/resources/config/rbac/role.yaml b/controllers/resources/config/rbac/role.yaml index 9ae57392009..64d2d82e730 100644 --- a/controllers/resources/config/rbac/role.yaml +++ b/controllers/resources/config/rbac/role.yaml @@ -84,25 +84,17 @@ rules: - list - watch - apiGroups: - - infra.sealos.io + - app.sealos.io resources: - - infras + - instances verbs: - get - list - watch - apiGroups: - - infra.sealos.io + - app.sealos.io resources: - - infras/finalizers - verbs: - - get - - list - - watch -- apiGroups: - - infra.sealos.io - resources: - - infras/status + - instances/status verbs: - get - list diff --git a/controllers/resources/controllers/monitor_controller.go b/controllers/resources/controllers/monitor_controller.go index 456bb007e9c..bc1995c37e8 100644 --- a/controllers/resources/controllers/monitor_controller.go +++ b/controllers/resources/controllers/monitor_controller.go @@ -25,6 +25,14 @@ import ( "sync" "time" + "github.com/labring/sealos/controllers/pkg/types" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + appv1 "github.com/labring/sealos/controllers/app/api/v1" + + kbv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1" + "golang.org/x/sync/errgroup" "github.com/labring/sealos/controllers/pkg/utils/env" @@ -74,7 +82,8 @@ type MonitorReconciler struct { TrafficClient database.Interface Properties *resources.PropertyTypeLS PromURL string - currentObjectMetrics map[string]objstorage.MetricData + lastObjectMetrics objstorage.Metrics + currentObjectMetrics objstorage.Metrics ObjStorageClient *minio.Client ObjStorageMetricsClient *objstorage.MetricsClient ObjStorageUserBackupSize map[string]int64 @@ -104,11 +113,12 @@ const ( //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=resourcequotas,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=resourcequotas/status,verbs=get;list;watch -//+kubebuilder:rbac:groups=infra.sealos.io,resources=infras,verbs=get;list;watch -//+kubebuilder:rbac:groups=infra.sealos.io,resources=infras/status,verbs=get;list;watch -//+kubebuilder:rbac:groups=infra.sealos.io,resources=infras/finalizers,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=services/status,verbs=get;list;watch +//+kubebuilder:rbac:groups=app.sealos.io,resources=instances,verbs=get;list;watch +//+kubebuilder:rbac:groups=app.sealos.io,resources=instances/status,verbs=get;list;watch +//+kubebuilder:rbac:groups=dataprotection.apecloud.io,resources=backups,verbs=get;list;watch +//+kubebuilder:rbac:groups=dataprotection.apecloud.io,resources=backups/status,verbs=get;list;watch func NewMonitorReconciler(mgr ctrl.Manager) (*MonitorReconciler, error) { r := &MonitorReconciler{ @@ -143,6 +153,12 @@ func InitIndexField(mgr ctrl.Manager) error { }); err != nil { return err } + if err := mgr.GetFieldIndexer().IndexField(context.Background(), &kbv1alpha1.Backup{}, "status.phase", func(rawObj client.Object) []string { + backup := rawObj.(*kbv1alpha1.Backup) + return []string{string(backup.Status.Phase)} + }); err != nil { + return err + } return mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Service{}, "spec.type", func(rawObj client.Object) []string { svc := rawObj.(*corev1.Service) return []string{string(svc.Spec.Type)} @@ -275,22 +291,52 @@ func (r *MonitorReconciler) processNamespaceList(namespaceList *corev1.Namespace }(&namespaceList.Items[i]) } wg.Wait() + if err := r.monitorObjectStorageTraffic(); err != nil { + r.Logger.Error(err, "failed to monitor object storage traffic") + } logger.Info("end processNamespaceList", "time", time.Now().Format("2006-01-02 15:04:05")) return nil } func (r *MonitorReconciler) preMonitorResourceUsage() error { if r.ObjStorageMetricsClient != nil { - metrics, err := objstorage.QueryUserUsage(r.ObjStorageMetricsClient) + metrics, err := objstorage.QueryUserUsageAndTraffic(r.ObjStorageMetricsClient) if err != nil { + r.lastObjectMetrics = r.currentObjectMetrics return fmt.Errorf("failed to query object storage metrics: %w", err) } + if r.currentObjectMetrics != nil { + r.lastObjectMetrics = r.currentObjectMetrics + } else { + latestObjTrafficSentMetrics := make(objstorage.Metrics) + startTime, endTime := time.Now().UTC().Add(-time.Hour), time.Now().UTC() + traffic, err := r.DBClient.GetAllLatestObjTraffic(startTime, endTime) + if err != nil { + return fmt.Errorf("failed to get all latest object storage traffic: %w", err) + } + for i := range traffic { + user := traffic[i].User + bucket := traffic[i].Bucket + if _, ok := metrics[user]; !ok { + continue + } + + if traffic[i].Time.Before(time.Now().Add(-time.Hour)) { + continue + } + + if _, ok := latestObjTrafficSentMetrics[user]; !ok { + latestObjTrafficSentMetrics[user] = objstorage.MetricData{ + Sent: make(map[string]int64), + } + } + + latestObjTrafficSentMetrics[user].Sent[bucket] = traffic[i].TotalSent + } + r.lastObjectMetrics = latestObjTrafficSentMetrics + } r.currentObjectMetrics = metrics - logger.Info("success query object storage resource usage", "time", time.Now().Format("2006-01-02 15:04:05")) - } - if r.ObjStorageClient != nil { - r.ObjStorageUserBackupSize = objstorage.GetUserBakFileSize(r.ObjStorageClient) - logger.Info("success query object storage backup size", "time", time.Now().Format("2006-01-02 15:04:05")) + logger.Info("success query object storage usage and traffic metrics", "time", time.Now().Format("2006-01-02 15:04:05")) } return nil } @@ -299,12 +345,15 @@ func (r *MonitorReconciler) monitorResourceUsage(namespace *corev1.Namespace) er timeStamp := time.Now().UTC() resUsed := map[string]map[corev1.ResourceName]*quantity{} resNamed := make(map[string]*resources.ResourceNamed) - - if err := r.monitorPodResourceUsage(namespace.Name, resUsed, resNamed); err != nil { + instances, err := r.getInstances(namespace.Name) + if err != nil { + return fmt.Errorf("failed to get instances: %v", err) + } + if err := r.monitorPodResourceUsage(namespace.Name, resUsed, resNamed, instances); err != nil { return fmt.Errorf("failed to monitor pod resource usage: %v", err) } - if err := r.monitorPVCResourceUsage(namespace.Name, resUsed, resNamed); err != nil { + if err := r.monitorPVCResourceUsage(namespace.Name, resUsed, resNamed, instances); err != nil { return fmt.Errorf("failed to monitor PVC resource usage: %v", err) } @@ -312,7 +361,7 @@ func (r *MonitorReconciler) monitorResourceUsage(namespace *corev1.Namespace) er return fmt.Errorf("failed to monitor backup resource usage: %v", err) } - if err := r.monitorServiceResourceUsage(namespace.Name, resUsed, resNamed); err != nil { + if err := r.monitorServiceResourceUsage(namespace.Name, resUsed, resNamed, instances); err != nil { return fmt.Errorf("failed to monitor service resource usage: %v", err) } @@ -328,17 +377,36 @@ func (r *MonitorReconciler) monitorResourceUsage(namespace *corev1.Namespace) er continue } monitors = append(monitors, &resources.Monitor{ - Category: namespace.Name, - Used: used, - Time: timeStamp, - Type: resNamed[name].Type(), - Name: resNamed[name].Name(), + Category: namespace.Name, + Used: used, + Time: timeStamp, + Type: resNamed[name].Type(), + Name: resNamed[name].Name(), + ParentType: resNamed[name].ParentType(), + ParentName: resNamed[name].ParentName(), }) } return r.DBClient.InsertMonitor(context.Background(), monitors...) } -func (r *MonitorReconciler) monitorPodResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed) error { +func (r *MonitorReconciler) getInstances(namespace string) (map[string]struct{}, error) { + instances := make(map[string]struct{}) + insList := metav1.PartialObjectMetadataList{} + insList.SetGroupVersionKind(appv1.GroupVersion.WithKind("InstanceList")) + if err := r.List(context.Background(), &insList, client.InNamespace(namespace)); err != nil { + return nil, fmt.Errorf("failed to list instances: %v", err) + } + for i := range insList.Items { + name := insList.Items[i].Labels[resources.AppStoreDeployLabelKey] + if name == "" { + name = insList.Items[i].Name + } + instances[name] = struct{}{} + } + return instances, nil +} + +func (r *MonitorReconciler) monitorPodResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed, instances map[string]struct{}) error { podList := &corev1.PodList{} if err := r.List(context.Background(), podList, &client.ListOptions{ Namespace: namespace, @@ -352,6 +420,7 @@ func (r *MonitorReconciler) monitorPodResourceUsage(namespace string, resUsed ma continue } podResNamed := resources.NewResourceNamed(pod) + podResNamed.SetInstanceParent(instances) resNamed[podResNamed.String()] = podResNamed if resUsed[podResNamed.String()] == nil { resUsed[podResNamed.String()] = initResources() @@ -383,7 +452,7 @@ func (r *MonitorReconciler) monitorPodResourceUsage(namespace string, resUsed ma return nil } -func (r *MonitorReconciler) monitorPVCResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed) error { +func (r *MonitorReconciler) monitorPVCResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed, instances map[string]struct{}) error { pvcList := &corev1.PersistentVolumeClaimList{} if err := r.List(context.Background(), pvcList, &client.ListOptions{ Namespace: namespace, @@ -397,6 +466,7 @@ func (r *MonitorReconciler) monitorPVCResourceUsage(namespace string, resUsed ma continue } pvcRes := resources.NewResourceNamed(pvc) + pvcRes.SetInstanceParent(instances) if resUsed[pvcRes.String()] == nil { resNamed[pvcRes.String()] = pvcRes resUsed[pvcRes.String()] = initResources() @@ -407,24 +477,31 @@ func (r *MonitorReconciler) monitorPVCResourceUsage(namespace string, resUsed ma } func (r *MonitorReconciler) monitorDatabaseBackupUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed) error { - if r.ObjStorageUserBackupSize == nil { - return nil + backupList := &kbv1alpha1.BackupList{} + if err := r.List(context.Background(), backupList, &client.ListOptions{ + Namespace: namespace, + FieldSelector: fields.OneTermEqualSelector("status.phase", string(kbv1alpha1.BackupPhaseCompleted)), + }); err != nil { + return fmt.Errorf("failed to list backup: %v", err) } - backupSize := r.ObjStorageUserBackupSize[getBackupObjectStorageName(namespace)] - if backupSize <= 0 { + if len(backupList.Items) == 0 { return nil } - - backupRes := resources.NewObjStorageResourceNamed("DB-BACKUP") - if resUsed[backupRes.String()] == nil { - resNamed[backupRes.String()] = backupRes - resUsed[backupRes.String()] = initResources() + for i := range backupList.Items { + backup := &backupList.Items[i] + backupRes := resources.NewResourceNamed(backup) + //fmt.Printf("backup name: %v, backup size: %v, backupRes: %s \n", backupList.Items[i].Name, backupList.Items[i].Status.TotalSize, backupRes.String()) + if resUsed[backupRes.String()] == nil { + resNamed[backupRes.String()] = backupRes + resUsed[backupRes.String()] = initResources() + } + resUsed[backupRes.String()][corev1.ResourceStorage].Add(resource.MustParse(backup.Status.TotalSize)) } - resUsed[backupRes.String()][corev1.ResourceStorage].Add(*resource.NewQuantity(backupSize, resource.BinarySI)) return nil } -func (r *MonitorReconciler) monitorServiceResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed) error { +// instance is the app instance name +func (r *MonitorReconciler) monitorServiceResourceUsage(namespace string, resUsed map[string]map[corev1.ResourceName]*quantity, resNamed map[string]*resources.ResourceNamed, instances map[string]struct{}) error { svcList := &corev1.ServiceList{} if err := r.List(context.Background(), svcList, &client.ListOptions{ Namespace: namespace, @@ -442,6 +519,7 @@ func (r *MonitorReconciler) monitorServiceResourceUsage(namespace string, resUse port[svcPort.NodePort] = struct{}{} } svcRes := resources.NewResourceNamed(svc) + svcRes.SetInstanceParent(instances) if resUsed[svcRes.String()] == nil { resNamed[svcRes.String()] = svcRes resUsed[svcRes.String()] = initResources() @@ -452,10 +530,6 @@ func (r *MonitorReconciler) monitorServiceResourceUsage(namespace string, resUse return nil } -func getBackupObjectStorageName(namespace string) string { - return strings.TrimPrefix(namespace, "ns-") -} - func (r *MonitorReconciler) getResourceUsed(podResource map[corev1.ResourceName]*quantity) (bool, map[uint8]int64) { used := map[uint8]int64{} isEmpty := true @@ -492,6 +566,41 @@ func (r *MonitorReconciler) monitorObjectStorageUsage(namespace string, resMap m return nil } +func (r *MonitorReconciler) monitorObjectStorageTraffic() error { + if r.currentObjectMetrics == nil { + return nil + } + var objTraffic []*types.ObjectStorageTraffic + now := time.Now().UTC() + for user, metric := range r.currentObjectMetrics { + if len(metric.Sent) == 0 { + continue + } + for bucket, m := range metric.Sent { + sent := int64(0) + if r.lastObjectMetrics != nil && r.lastObjectMetrics[user].Sent != nil { + if _, ok := r.lastObjectMetrics[user].Sent[bucket]; ok { + ss := m - r.lastObjectMetrics[user].Sent[bucket] + if ss > 0 { + sent = ss + } + } + } + objTraffic = append(objTraffic, &types.ObjectStorageTraffic{ + Time: now, + User: user, + Bucket: bucket, + TotalSent: m, + Sent: sent, + }) + } + } + if err := r.DBClient.SaveObjTraffic(objTraffic...); err != nil { + return fmt.Errorf("failed to save object storage traffic: %w", err) + } + return nil +} + func (r *MonitorReconciler) MonitorTrafficUsed(startTime, endTime time.Time) error { logger.Info("start getTrafficUsed", "startTime", startTime.Format(time.RFC3339), "endTime", endTime.Format(time.RFC3339)) execTime := time.Now().UTC() @@ -510,9 +619,9 @@ func (r *MonitorReconciler) MonitorTrafficUsed(startTime, endTime time.Time) err } func (r *MonitorReconciler) monitorObjectStorageTrafficUsed(startTime, endTime time.Time) error { - buckets, err := objstorage.ListAllObjectStorageBucket(r.ObjStorageClient) + buckets, err := r.DBClient.GetTimeObjBucketBucket(startTime, endTime) if err != nil { - return fmt.Errorf("failed to list object storage buckets: %w", err) + return fmt.Errorf("failed to get object storage buckets: %w", err) } r.Logger.Info("object storage buckets", "buckets len", len(buckets)) wg, _ := errgroup.WithContext(context.Background()) @@ -530,15 +639,16 @@ func (r *MonitorReconciler) monitorObjectStorageTrafficUsed(startTime, endTime t } func (r *MonitorReconciler) handlerObjectStorageTrafficUsed(startTime, endTime time.Time, bucket string) error { - bytes, err := objstorage.GetObjectStorageFlow(r.PromURL, bucket, r.ObjectStorageInstance, startTime, endTime) + bytes, err := r.DBClient.HandlerTimeObjBucketSentTraffic(startTime, endTime, bucket) if err != nil { return fmt.Errorf("failed to get object storage flow: %w", err) } - unit := r.Properties.StringMap[resources.ResourceNetwork].Unit - used := int64(math.Ceil(float64(resource.NewQuantity(bytes, resource.BinarySI).MilliValue()) / float64(unit.MilliValue()))) - if used <= 0 { + // Because the obtained traffic includes traffic communicating with the controller, filter out traffic smaller than 1 MB + if bytes < 1024*1024 { return nil } + unit := r.Properties.StringMap[resources.ResourceNetwork].Unit + used := int64(math.Ceil(float64(resource.NewQuantity(bytes, resource.BinarySI).MilliValue()) / float64(unit.MilliValue()))) namespace := "ns-" + strings.SplitN(bucket, "-", 2)[0] ro := resources.Monitor{ @@ -591,7 +701,6 @@ func (r *MonitorReconciler) handlerTrafficUsed(startTime, endTime time.Time, mon Time: endTime.Add(-1 * time.Minute), Type: monitor.Type, } - r.Logger.Info("monitor traffic used", "monitor", ro) err = r.DBClient.InsertMonitor(context.Background(), &ro) if err != nil { return fmt.Errorf("failed to insert monitor: %w", err) diff --git a/controllers/resources/controllers/suite_test.go b/controllers/resources/controllers/suite_test.go index ffc210c2e6f..10a8043a04b 100644 --- a/controllers/resources/controllers/suite_test.go +++ b/controllers/resources/controllers/suite_test.go @@ -26,7 +26,6 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" //+kubebuilder:scaffold:imports @@ -44,7 +43,7 @@ func TestAPIs(t *testing.T) { RunSpecsWithDefaultAndCustomReporters(t, "Controller Suite", - []Reporter{printer.NewlineReporter{}}) + []Reporter{}) } var _ = BeforeSuite(func() { diff --git a/controllers/resources/deploy/manifests/deploy.yaml b/controllers/resources/deploy/manifests/deploy.yaml index b3f4f34c103..9f99ddc571b 100644 --- a/controllers/resources/deploy/manifests/deploy.yaml +++ b/controllers/resources/deploy/manifests/deploy.yaml @@ -134,25 +134,33 @@ rules: - list - watch - apiGroups: - - infra.sealos.io + - app.sealos.io resources: - - infras + - instances verbs: - get - list - watch - apiGroups: - - infra.sealos.io + - app.sealos.io resources: - - infras/finalizers + - instances/status verbs: - get - list - watch - apiGroups: - - infra.sealos.io + - dataprotection.kubeblocks.io resources: - - infras/status + - backups + verbs: + - get + - list + - watch +- apiGroups: + - dataprotection.kubeblocks.io + resources: + - backups/status verbs: - get - list diff --git a/controllers/resources/go.mod b/controllers/resources/go.mod index fcbdefa2c8f..8dfe62ca9e6 100644 --- a/controllers/resources/go.mod +++ b/controllers/resources/go.mod @@ -1,77 +1,86 @@ module github.com/labring/sealos/controllers/resources -go 1.20 +go 1.22 + +toolchain go1.22.4 + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) require ( - github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 - github.com/go-logr/logr v1.2.4 - github.com/labring/sealos/controllers/pkg v0.0.0-00010101000000-000000000000 - github.com/minio/minio-go/v7 v7.0.63 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.27.8 - github.com/spf13/cobra v1.7.0 - golang.org/x/sync v0.4.0 - google.golang.org/grpc v1.57.0 - k8s.io/api v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/go-logr/logr v1.4.1 + github.com/labring/sealos/controllers/app v0.0.0-20240807070504-eb838607f089 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b + github.com/labring/sealos/controllers/user v0.0.0 + github.com/minio/minio-go/v7 v7.0.64 + github.com/onsi/ginkgo v1.16.4 + github.com/onsi/gomega v1.30.0 + golang.org/x/sync v0.6.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v12.0.0+incompatible + sigs.k8s.io/controller-runtime v0.17.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/containers/storage v1.50.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/go-units v0.5.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.4 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/klauspost/pgzip v1.2.6 // indirect github.com/labring/sealos/controllers/account v0.0.0 // indirect - github.com/labring/sealos/controllers/user v0.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matoous/go-nanoid/v2 v2.0.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/montanaflynn/stats v0.6.6 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect - github.com/opencontainers/runc v1.1.9 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/prom2json v1.3.3 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/ulikunitz/xz v0.5.11 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -79,31 +88,35 @@ require ( go.mongodb.org/mongo-driver v1.12.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + gorm.io/driver/postgres v1.5.4 // indirect + gorm.io/gorm v1.25.5 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace ( diff --git a/controllers/resources/go.sum b/controllers/resources/go.sum index 1aedcb0c68f..ce0e893fa40 100644 --- a/controllers/resources/go.sum +++ b/controllers/resources/go.sum @@ -1,139 +1,116 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containers/storage v1.50.2 h1:Fys4BjFUVNRBEXlO70hFI48VW4EXsgnGisTpk9tTMsE= -github.com/containers/storage v1.50.2/go.mod h1:dpspZsUrcKD8SpTofvKWhwPDHD0MkO4Q7VE+oYdWkiA= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49 h1:4GI5eviCwbPxDE311KryyyPUTO7IDVyHGp3Iyl+fEZY= github.com/dinoallo/sealos-networkmanager-protoapi v0.0.0-20230928031328-cf9649d6af49/go.mod h1:sbm1DAsayX+XsXCOC2CFAAU9JZhX0SPKwnybDjSd0Ls= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= -github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labring/sealos/controllers/app v0.0.0-20240807070504-eb838607f089 h1:UVeQQ61npBKmrT7r6GrLLmCMUSgAY3c5/fFEAjVN+II= +github.com/labring/sealos/controllers/app v0.0.0-20240807070504-eb838607f089/go.mod h1:F/fdFEzWKs0mDmXWDxcaAVPv2SKfl/DXH4X4pimApHE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= @@ -143,64 +120,57 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= -github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= +github.com/minio/minio-go/v7 v7.0.64 h1:Zdza8HwOzkld0ZG/og50w56fKi6AAyfqfifmasD9n2Q= +github.com/minio/minio-go/v7 v7.0.64/go.mod h1:R4WVUR6ZTedlCcGwZRauLMIKjgyaWxhs4Mqi/OMPmEc= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/opencontainers/runc v1.1.9 h1:XR0VIHTGce5eWPkaPesqTBrhW2yAcaraWfsEalNwQLM= -github.com/opencontainers/runc v1.1.9/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo= +github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -212,35 +182,24 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -248,52 +207,34 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -304,88 +245,59 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -398,39 +310,39 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYs gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= -k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo= -k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= +gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI= +k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/resources/main.go b/controllers/resources/main.go index fe1cec343a5..61f70d7f789 100644 --- a/controllers/resources/main.go +++ b/controllers/resources/main.go @@ -23,22 +23,19 @@ import ( "os" "time" - "github.com/labring/sealos/controllers/pkg/objectstorage" - - "github.com/labring/sealos/controllers/pkg/utils/env" - - "github.com/labring/sealos/controllers/pkg/database/mongo" + objectstoragev1 "github/labring/sealos/controllers/objectstorage/api/v1" "github.com/labring/sealos/controllers/pkg/database" - + "github.com/labring/sealos/controllers/pkg/database/mongo" + "github.com/labring/sealos/controllers/pkg/objectstorage" "github.com/labring/sealos/controllers/pkg/resources" + "github.com/labring/sealos/controllers/pkg/utils/env" - "github.com/labring/sealos/controllers/resources/controllers" + "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1" - objectstoragev1 "github/labring/sealos/controllers/objectstorage/api/v1" + appv1 "github.com/labring/sealos/controllers/app/api/v1" + "github.com/labring/sealos/controllers/resources/controllers" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/apimachinery/pkg/runtime" @@ -47,6 +44,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" //+kubebuilder:scaffold:imports ) @@ -57,6 +55,8 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(appv1.AddToScheme(scheme)) + utilruntime.Must(v1alpha1.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme } @@ -78,9 +78,10 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "a63686c3.sealos.io", @@ -184,6 +185,10 @@ func main() { } else { reconciler.Logger.Info("minio info not found, please check env: MINIO_ENDPOINT, MINIO_AK, MINIO_SK, MINIO_METRICS_ADDR") } + err = reconciler.DBClient.CreateTTLTrafficTimeSeries() + if err != nil { + reconciler.Logger.Error(err, "failed to create ttl traffic time series") + } // timer creates tomorrow's timing table in advance to ensure that tomorrow's table exists // Execute immediately and then every 24 hours. time.AfterFunc(time.Until(getNextMidnight()), func() { diff --git a/controllers/terminal/controllers/suite_test.go b/controllers/terminal/controllers/suite_test.go index fc1b2da42cc..d5279fbb534 100644 --- a/controllers/terminal/controllers/suite_test.go +++ b/controllers/terminal/controllers/suite_test.go @@ -26,7 +26,6 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" @@ -46,7 +45,7 @@ func TestAPIs(t *testing.T) { RunSpecsWithDefaultAndCustomReporters(t, "Controller Suite", - []Reporter{printer.NewlineReporter{}}) + []Reporter{}) } var _ = BeforeSuite(func() { diff --git a/controllers/terminal/controllers/terminal_controller.go b/controllers/terminal/controllers/terminal_controller.go index 0ad83c324a5..355d034924a 100644 --- a/controllers/terminal/controllers/terminal_controller.go +++ b/controllers/terminal/controllers/terminal_controller.go @@ -26,14 +26,12 @@ import ( networkingv1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" @@ -42,6 +40,8 @@ import ( terminalv1 "github.com/labring/sealos/controllers/terminal/api/v1" ) +const TerminalPartOf = "terminal" + const ( Protocol = "https://" FinalizerName = "terminal.sealos.io/finalizer" @@ -50,10 +50,6 @@ const ( LetterBytes = "abcdefghijklmnopqrstuvwxyz0123456789" ) -const ( - TerminalPartOf = "terminal" -) - const ( DefaultDomain = "cloud.sealos.io" DefaultPort = "" @@ -133,6 +129,9 @@ func (r *TerminalReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c PartOf: TerminalPartOf, }) + //Note: Fixme: For `Forward Compatibility` usage only, old resource controller need this label. + recLabels["TerminalID"] = terminal.Name + var hostname string if err := r.syncDeployment(ctx, terminal, &hostname, recLabels); err != nil { logger.Error(err, "create deployment failed") @@ -378,23 +377,6 @@ func (r *TerminalReconciler) getPort() string { return ":" + r.CtrConfig.Global.CloudPort } -func NewCache() cache.NewCacheFunc { - cacheLabelSelector := cache.ObjectSelector{ - Label: labels.SelectorFromSet(labels.Set{ - label.AppManagedBy: label.DefaultManagedBy, - label.AppPartOf: TerminalPartOf, - }), - } - - return cache.BuilderWithOptions(cache.Options{ - SelectorsByObject: cache.SelectorsByObject{ - &appsv1.Deployment{}: cacheLabelSelector, - &corev1.Service{}: cacheLabelSelector, - &networkingv1.Ingress{}: cacheLabelSelector, - }, - }) -} - // SetupWithManager sets up the controller with the Manager. func (r *TerminalReconciler) SetupWithManager(mgr ctrl.Manager) error { r.recorder = mgr.GetEventRecorderFor("sealos-terminal-controller") diff --git a/controllers/terminal/go.mod b/controllers/terminal/go.mod index c10687209f3..2b38a2c8a18 100644 --- a/controllers/terminal/go.mod +++ b/controllers/terminal/go.mod @@ -1,75 +1,87 @@ module github.com/labring/sealos/controllers/terminal -go 1.20 +go 1.22 + +toolchain go1.22.4 + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 +) require ( github.com/jaevor/go-nanoid v1.3.0 github.com/labring/sealos/controllers/pkg v0.0.0-00010101000000-000000000000 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.27.4 - k8s.io/api v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/onsi/gomega v1.30.0 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.17.2 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.15.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.27.2 // indirect - k8s.io/component-base v0.27.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/labring/sealos/controllers/pkg => ../pkg diff --git a/controllers/terminal/go.sum b/controllers/terminal/go.sum index 60c32abbe54..3669e5348df 100644 --- a/controllers/terminal/go.sum +++ b/controllers/terminal/go.sum @@ -1,123 +1,88 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jaevor/go-nanoid v1.3.0 h1:nD+iepesZS6pr3uOVf20vR9GdGgJW1HPaR46gtrxzkg= github.com/jaevor/go-nanoid v1.3.0/go.mod h1:SI+jFaPuddYkqkVQoNGHs81navCtH388TcrH0RqFKgY= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -132,96 +97,68 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -230,76 +167,44 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= -gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -308,40 +213,35 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= -k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo= -k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/terminal/main.go b/controllers/terminal/main.go index c54a11ca5ad..aaba10a2b02 100644 --- a/controllers/terminal/main.go +++ b/controllers/terminal/main.go @@ -20,18 +20,24 @@ import ( "flag" "os" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. - _ "k8s.io/client-go/plugin/pkg/client/auth" - + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" configpkg "github.com/labring/sealos/controllers/pkg/config" + "github.com/labring/sealos/controllers/pkg/utils/label" terminalv1 "github.com/labring/sealos/controllers/terminal/api/v1" "github.com/labring/sealos/controllers/terminal/controllers" //+kubebuilder:scaffold:imports @@ -67,10 +73,16 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + cacheObjLabelSelector := labels.SelectorFromSet(labels.Set{ + label.AppManagedBy: label.DefaultManagedBy, + label.AppPartOf: controllers.TerminalPartOf, + }) + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "50686b4e.sealos.io", @@ -87,7 +99,14 @@ func main() { // LeaderElectionReleaseOnCancel: true, // add custom cache for memory footprint optimization - NewCache: controllers.NewCache(), + NewCache: func(config *rest.Config, opts cache.Options) (cache.Cache, error) { + opts.ByObject = map[client.Object]cache.ByObject{ + &appsv1.Deployment{}: {Label: cacheObjLabelSelector}, + &corev1.Service{}: {Label: cacheObjLabelSelector}, + &networkingv1.Ingress{}: {Label: cacheObjLabelSelector}, + } + return cache.New(config, opts) + }, }) if err != nil { setupLog.Error(err, "unable to start manager") diff --git a/controllers/user/api/v1/operationrequest_webhook.go b/controllers/user/api/v1/operationrequest_webhook.go index 5e93a8c4f49..7878431fa49 100644 --- a/controllers/user/api/v1/operationrequest_webhook.go +++ b/controllers/user/api/v1/operationrequest_webhook.go @@ -24,6 +24,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // log is for logging in this package. @@ -65,10 +66,10 @@ type ReqValidator struct { client.Client } -func (r ReqValidator) ValidateCreate(ctx context.Context, obj runtime.Object) error { +func (r ReqValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { req, ok := obj.(*Operationrequest) if !ok { - return errors.New("obj convert Operationrequest is error") + return admission.Warnings{"obj convert Operationrequest is error"}, errors.New("obj convert Operationrequest is error") } // todo check request, _ := admission.RequestFromContext(ctx), request.UserInfo.Username if legal @@ -78,34 +79,34 @@ func (r ReqValidator) ValidateCreate(ctx context.Context, obj runtime.Object) er err := r.List(ctx, &reqList, client.InNamespace(req.Namespace), client.MatchingLabels{UserLabelOwnerKey: req.Spec.User}) if client.IgnoreNotFound(err) != nil { operationrequestlog.Error(err, "list operationrequest error") - return err + return admission.Warnings{"list operationrequest error"}, err } for _, item := range reqList.Items { if item.Status.Phase != RequestCompleted { operationrequestlog.Info("there is a request not completed, can not create new request", "name", item.Name, "phase", item.Status.Phase) - return errors.New("there is a request not completed, can not create new request") + return admission.Warnings{"there is a request not completed, can not create new request"}, errors.New("there is a request not completed, can not create new request") } } - return nil + return admission.Warnings{}, nil } -func (r ReqValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) error { +func (r ReqValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { // todo check request, _ := admission.RequestFromContext(ctx), request.UserInfo.Username if legal oldReq, ok := oldObj.(*Operationrequest) if !ok { - return errors.New("obj convert Operationrequest error") + return admission.Warnings{"obj convert Operationrequest error"}, errors.New("obj convert Operationrequest error") } newReq, ok := newObj.(*Operationrequest) if !ok { - return errors.New("obj convert Operationrequest error") + return admission.Warnings{"obj convert Operationrequest error"}, errors.New("obj convert Operationrequest error") } if oldReq.Spec != newReq.Spec { - return errors.New("operation request spec do not support update") + return admission.Warnings{"operation request spec do not support update"}, errors.New("operation request spec do not support update") } - return nil + return admission.Warnings{}, nil } -func (r ReqValidator) ValidateDelete(_ context.Context, _ runtime.Object) error { - return nil +func (r ReqValidator) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { + return admission.Warnings{}, nil } diff --git a/controllers/user/api/v1/user_webhook.go b/controllers/user/api/v1/user_webhook.go index 956fb92435d..df7f4e55acd 100644 --- a/controllers/user/api/v1/user_webhook.go +++ b/controllers/user/api/v1/user_webhook.go @@ -21,6 +21,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // log is for logging in this package. @@ -59,25 +60,25 @@ func (r *User) Default() { var _ webhook.Validator = &User{} // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *User) ValidateCreate() error { +func (r *User) ValidateCreate() (admission.Warnings, error) { userlog.Info("validate create", "name", r.Name) if err := r.validateCSRExpirationSeconds(); err != nil { - return err + return admission.Warnings{}, err } - return validateAnnotationKeyNotEmpty(r.ObjectMeta, UserAnnotationDisplayKey) + return admission.Warnings{}, validateAnnotationKeyNotEmpty(r.ObjectMeta, UserAnnotationDisplayKey) } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *User) ValidateUpdate(_ runtime.Object) error { +func (r *User) ValidateUpdate(_ runtime.Object) (admission.Warnings, error) { userlog.Info("validate update", "name", r.Name) if err := r.validateCSRExpirationSeconds(); err != nil { - return err + return admission.Warnings{}, err } - return validateAnnotationKeyNotEmpty(r.ObjectMeta, UserAnnotationDisplayKey) + return admission.Warnings{}, validateAnnotationKeyNotEmpty(r.ObjectMeta, UserAnnotationDisplayKey) } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *User) ValidateDelete() error { +func (r *User) ValidateDelete() (admission.Warnings, error) { userlog.Info("validate delete", "name", r.Name) - return nil + return admission.Warnings{}, nil } diff --git a/controllers/user/api/v1/webhook_suite_test.go b/controllers/user/api/v1/webhook_suite_test.go index 2e806a5612e..594b21a0449 100644 --- a/controllers/user/api/v1/webhook_suite_test.go +++ b/controllers/user/api/v1/webhook_suite_test.go @@ -34,7 +34,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" ) @@ -52,7 +51,7 @@ func TestAPIs(t *testing.T) { RunSpecsWithDefaultAndCustomReporters(t, "Webhook Suite", - []Reporter{printer.NewlineReporter{}}) + []Reporter{}) } var _ = BeforeSuite(func() { @@ -95,12 +94,12 @@ var _ = BeforeSuite(func() { // start webhook server using Manager webhookInstallOptions := &testEnv.WebhookInstallOptions mgr, err := ctrl.NewManager(cfg, ctrl.Options{ - Scheme: scheme, - Host: webhookInstallOptions.LocalServingHost, - Port: webhookInstallOptions.LocalServingPort, - CertDir: webhookInstallOptions.LocalServingCertDir, - LeaderElection: false, - MetricsBindAddress: "0", + Scheme: scheme, + //Host: webhookInstallOptions.LocalServingHost, + //Port: webhookInstallOptions.LocalServingPort, + //CertDir: webhookInstallOptions.LocalServingCertDir, + LeaderElection: false, + //MetricsBindAddress: "0", }) Expect(err).NotTo(HaveOccurred()) diff --git a/controllers/user/controllers/adapt_rolebinding_controller.go b/controllers/user/controllers/adapt_rolebinding_controller.go new file mode 100644 index 00000000000..735d4baa487 --- /dev/null +++ b/controllers/user/controllers/adapt_rolebinding_controller.go @@ -0,0 +1,137 @@ +/* +Copyright 2022 labring. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controllers + +import ( + "context" + + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + + "github.com/labring/sealos/controllers/user/controllers/helper/config" + + "sigs.k8s.io/controller-runtime/pkg/builder" + + v1 "k8s.io/api/rbac/v1" + + "sigs.k8s.io/controller-runtime/pkg/event" + + userv1 "github.com/labring/sealos/controllers/user/api/v1" + + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// TODO This controller is used to adapt the old RoleBinding. only need to deploy the logic once for conversion and delete the controller in the future + +// AdaptRoleBindingReconciler reconciles a RoleBinding object, Old Role bindings are backward compatible and will be deleted in the future +type AdaptRoleBindingReconciler struct { + client.Client + Scheme *runtime.Scheme + Logger logr.Logger +} + +func (r *AdaptRoleBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + rolebinding := &v1.RoleBinding{} + if err := r.Get(ctx, req.NamespacedName, rolebinding); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + // old rolebinding only has one subject + if len(rolebinding.Subjects) != 1 { + return ctrl.Result{}, nil + } + + if rolebinding.Subjects[0].Namespace != config.GetUserSystemNamespace() { + userName := rolebinding.GetAnnotations()[userAnnotationOwnerKey] + user := &userv1.User{} + if err := r.Get(ctx, client.ObjectKey{Name: userName}, user); err != nil { + r.Logger.Error(err, "get user failed") + return ctrl.Result{}, err + } + appendSubject := rolebinding.Subjects[0].DeepCopy() + appendSubject.Namespace = config.GetUserSystemNamespace() + rolebinding.Subjects = append(rolebinding.Subjects, *appendSubject) + if err := r.Update(ctx, rolebinding); err != nil { + r.Logger.Error(err, "update rolebinding failed") + return ctrl.Result{}, err + } + if err := controllerutil.SetControllerReference(user, rolebinding, r.Scheme); err != nil { + r.Logger.Error(err, "set controller reference failed") + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil +} + +// SetupWithManager sets up the controller with the Manager. +func (r *AdaptRoleBindingReconciler) SetupWithManager(mgr ctrl.Manager) error { + const controllerName = "adapt_rolebinding_controller" + if r.Client == nil { + r.Client = mgr.GetClient() + } + r.Logger = ctrl.Log.WithName(controllerName) + r.Scheme = mgr.GetScheme() + r.Logger.V(1).Info("init reconcile AdaptRoleBinding controller") + return ctrl.NewControllerManagedBy(mgr). + For(&v1.RoleBinding{}, builder.WithPredicates(WorkspacePredicate{})). + Complete(r) +} + +type WorkspacePredicate struct { +} + +func (WorkspacePredicate) Create(e event.CreateEvent) bool { + return isWorkspaceObject(e.Object) +} + +func (WorkspacePredicate) Delete(_ event.DeleteEvent) bool { + return false +} + +func (WorkspacePredicate) Update(_ event.UpdateEvent) bool { + return false +} + +func (WorkspacePredicate) Generic(_ event.GenericEvent) bool { + return false +} + +func isWorkspaceObject(obj client.Object) bool { + rolebinding, ok := obj.(*v1.RoleBinding) + if !ok { + return false + } + anno := obj.GetAnnotations() + if anno == nil { + return false + } + if anno["user.sealos.io/owner"] == "" { + return false + } + if len(obj.GetOwnerReferences()) > 0 { + return false + } + + for _, sub := range rolebinding.Subjects { + if sub.Namespace == config.GetUserSystemNamespace() { + return false + } + } + return true +} diff --git a/controllers/user/controllers/helper/config/rbac.go b/controllers/user/controllers/helper/config/rbac.go index d3bf86fca92..03f2712b93f 100644 --- a/controllers/user/controllers/helper/config/rbac.go +++ b/controllers/user/controllers/helper/config/rbac.go @@ -26,6 +26,10 @@ import ( userv1 "github.com/labring/sealos/controllers/user/api/v1" ) +func GetUserSystemNamespace() string { + return "user-system" +} + func GetDefaultNamespace() string { return os.Getenv("NAMESPACE_NAME") } @@ -35,7 +39,7 @@ func GetUsersSubject(user string) []rbacv1.Subject { { Kind: "ServiceAccount", Name: user, - Namespace: GetUsersNamespace(user), + Namespace: GetUserSystemNamespace(), }, } } diff --git a/controllers/user/controllers/operationrequest_controller.go b/controllers/user/controllers/operationrequest_controller.go index edbfd966217..d9bcab550d8 100644 --- a/controllers/user/controllers/operationrequest_controller.go +++ b/controllers/user/controllers/operationrequest_controller.go @@ -135,22 +135,37 @@ func (r *OperationReqReconciler) reconcile(ctx context.Context, request *userv1. "rolebinding.roleRef", rolebinding.RoleRef, ) + user := &userv1.User{} + if err := r.Get(ctx, client.ObjectKey{Name: config.GetUserNameByNamespace(request.Namespace)}, user); err != nil { + r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to get user", "Failed to get user %s", request.Spec.User) + return ctrl.Result{}, err + } + if request.Spec.Role == userv1.OwnerRoleType { + if user.Name == user.Annotations[userv1.UserAnnotationOwnerKey] { + // 不允许转移个人空间 + r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to grant role", "Failed to grant role %s to user %s, cannot transfer personal workspace", request.Spec.Role, request.Spec.User) + return ctrl.Result{}, r.updateRequestStatus(ctx, request, userv1.RequestFailed) + } + } + bindUser := &userv1.User{} + if err := r.Get(ctx, client.ObjectKey{Name: request.Spec.User}, bindUser); err != nil { + r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to get bind user", "Failed to get bind user %s", request.Spec.User) + return ctrl.Result{}, err + } + setUpOwnerReferenceFc := func() error { + return ctrl.SetControllerReference(bindUser, rolebinding, r.Scheme) + } + // handle OperationRequest, create or delete rolebinding switch request.Spec.Action { case userv1.Grant: r.Recorder.Eventf(request, v1.EventTypeNormal, "Grant", "Grant role %s to user %s", request.Spec.Role, request.Spec.User) - if _, err := ctrl.CreateOrUpdate(ctx, r.Client, rolebinding, func() error { return nil }); err != nil { + if _, err := ctrl.CreateOrUpdate(ctx, r.Client, rolebinding, setUpOwnerReferenceFc); err != nil { r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to create/update rolebinding", "Failed to create rolebinding %s/%s", rolebinding.Namespace, rolebinding.Name) return ctrl.Result{}, err } if request.Spec.Role == userv1.OwnerRoleType { // update user annotation - user := &userv1.User{} - if err := r.Get(ctx, client.ObjectKey{Name: config.GetUserNameByNamespace(request.Namespace)}, user); err != nil { - r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to get user", "Failed to get user %s", request.Spec.User) - return ctrl.Result{}, err - } - user.Annotations[userv1.UserAnnotationOwnerKey] = request.Spec.User if err := r.Update(ctx, user); err != nil { r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to update user", "Failed to update user %s", request.Spec.User) @@ -169,18 +184,12 @@ func (r *OperationReqReconciler) reconcile(ctx context.Context, request *userv1. r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to delete rolebinding", "Failed to delete rolebinding %s/%s", rolebinding.Namespace, rolebinding.Name) return ctrl.Result{}, err } - if _, err := ctrl.CreateOrUpdate(ctx, r.Client, rolebinding, func() error { return nil }); err != nil { + if _, err := ctrl.CreateOrUpdate(ctx, r.Client, rolebinding, setUpOwnerReferenceFc); err != nil { r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to create/update rolebinding", "Failed to create rolebinding %s/%s", rolebinding.Namespace, rolebinding.Name) return ctrl.Result{}, err } if request.Spec.Role == userv1.OwnerRoleType { // update user annotation - user := &userv1.User{} - if err := r.Get(ctx, client.ObjectKey{Name: config.GetUserNameByNamespace(request.Namespace)}, user); err != nil { - r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to get user", "Failed to get user %s", request.Spec.User) - return ctrl.Result{}, err - } - user.Annotations[userv1.UserAnnotationOwnerKey] = request.Spec.User if err := r.Update(ctx, user); err != nil { r.Recorder.Eventf(request, v1.EventTypeWarning, "Failed to update user", "Failed to update user %s", request.Spec.User) @@ -260,7 +269,7 @@ func conventRequestToRolebinding(request *userv1.Operationrequest) *rbacv1.RoleB { Kind: rbacv1.ServiceAccountKind, Name: request.Spec.User, - Namespace: config.GetUsersNamespace(request.Spec.User), + Namespace: config.GetUserSystemNamespace(), }, }, RoleRef: rbacv1.RoleRef{ diff --git a/controllers/user/controllers/user_controller.go b/controllers/user/controllers/user_controller.go index 121228f3ff7..d05598b4e5a 100644 --- a/controllers/user/controllers/user_controller.go +++ b/controllers/user/controllers/user_controller.go @@ -23,6 +23,7 @@ import ( "strconv" "time" + "github.com/go-logr/logr" "golang.org/x/exp/rand" utilcontroller "github.com/labring/operator-sdk/controller" @@ -31,38 +32,36 @@ import ( "github.com/labring/sealos/controllers/user/controllers/helper/config" "github.com/labring/sealos/controllers/user/controllers/helper/kubeconfig" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/predicate" - + v1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/client-go/rest" - kubecontroller "sigs.k8s.io/controller-runtime/pkg/controller" - - "github.com/go-logr/logr" - v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + kubecontroller "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/predicate" userv1 "github.com/labring/sealos/controllers/user/api/v1" "github.com/labring/sealos/controllers/user/controllers/helper" ) -var userAnnotationCreatorKey = userv1.UserAnnotationCreatorKey -var userAnnotationOwnerKey = userv1.UserAnnotationOwnerKey -var userLabelOwnerKey = userv1.UserLabelOwnerKey +const ( + userAnnotationCreatorKey = userv1.UserAnnotationCreatorKey + userAnnotationOwnerKey = userv1.UserAnnotationOwnerKey + userLabelOwnerKey = userv1.UserLabelOwnerKey +) // UserReconciler reconciles a User object type UserReconciler struct { @@ -135,13 +134,15 @@ func (r *UserReconciler) SetupWithManager(mgr ctrl.Manager, opts utilcontroller. r.Logger.V(1).Info("init reconcile controller user") r.minRequeueDuration = minRequeueDuration r.maxRequeueDuration = maxRequeueDuration - owner := &handler.EnqueueRequestForOwner{OwnerType: &userv1.User{}, IsController: true} + + ownerEventHandler := handler.EnqueueRequestForOwner(r.Scheme, r.Client.RESTMapper(), &userv1.User{}, handler.OnlyControllerOwner()) + return ctrl.NewControllerManagedBy(mgr). - For(&userv1.User{}, builder.WithPredicates( - predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))). - Watches(&source.Kind{Type: &v1.ServiceAccount{}}, owner). - Watches(&source.Kind{Type: &rbacv1.Role{}}, owner). - Watches(&source.Kind{Type: &rbacv1.RoleBinding{}}, owner). + For(&userv1.User{}, builder.WithPredicates(predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))). + Watches(&rbacv1.Role{}, ownerEventHandler). + Watches(&rbacv1.RoleBinding{}, ownerEventHandler). + Watches(&v1.Secret{}, ownerEventHandler). + Watches(&v1.ServiceAccount{}, ownerEventHandler). WithOptions(kubecontroller.Options{ MaxConcurrentReconciles: utilcontroller.GetConcurrent(opts), RateLimiter: utilcontroller.GetRateLimiter(opts), @@ -379,22 +380,15 @@ func (r *UserReconciler) syncServiceAccount(ctx context.Context, user *userv1.Us } }() ctx = context.WithValue(ctx, ctxKey("reNew"), false) - sa := &v1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: user.Name, - Namespace: config.GetDefaultNamespace(), - }, - } - _ = r.Delete(context.Background(), sa) if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { var change controllerutil.OperationResult var err error - sa = &v1.ServiceAccount{} + sa := &v1.ServiceAccount{} sa.Name = user.Name - sa.Namespace = config.GetUsersNamespace(user.Name) + sa.Namespace = config.GetUserSystemNamespace() sa.Labels = map[string]string{} if err = r.Get(context.Background(), client.ObjectKey{ - Namespace: config.GetUsersNamespace(user.Name), + Namespace: config.GetUserSystemNamespace(), Name: user.Name, }, sa); err != nil { if apierrors.IsNotFound(err) { @@ -424,12 +418,12 @@ func (r *UserReconciler) syncServiceAccount(ctx context.Context, user *userv1.Us ctx = context.WithValue(ctx, ctxKey("reNew"), true) } saCondition.Message = fmt.Sprintf("sync namespace sa %s/%s successfully", sa.Name, sa.ResourceVersion) + ctx = context.WithValue(ctx, ctxKey("serviceAccount"), sa) return nil }); err != nil { helper.SetConditionError(saCondition, "SyncUserError", err) r.Recorder.Eventf(user, v1.EventTypeWarning, "syncUserServiceAccount", "Sync User namespace sa %s is error: %v", user.Name, err) } - ctx = context.WithValue(ctx, ctxKey("serviceAccount"), sa) return ctx } @@ -460,7 +454,7 @@ func (r *UserReconciler) syncServiceAccountSecrets(ctx context.Context, user *us secretName := sa.Secrets[0].Name secrets := &v1.Secret{} secrets.Name = secretName - secrets.Namespace = config.GetUsersNamespace(user.Name) + secrets.Namespace = config.GetUserSystemNamespace() var err error if err = r.Get(ctx, client.ObjectKeyFromObject(secrets), secrets); err == nil { return nil @@ -512,44 +506,27 @@ func (r *UserReconciler) syncKubeConfig(ctx context.Context, user *userv1.User) r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Sync User namespace kubeconfig %s is error: %v", user.Name, "serviceAccount not found") return ctx } - cfg := kubeconfig.NewConfig(user.Name, "", user.Spec.CSRExpirationSeconds).WithServiceAccountConfig(config.GetUsersNamespace(user.Name), sa) - var apiConfig *api.Config - var err error - apiConfig, event, err := syncReNewConfig(user) - if event != nil { - r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", *event) - } user.Status.ObservedCSRExpirationSeconds = user.Spec.CSRExpirationSeconds + cfg := kubeconfig.NewConfig(user.Name, "", user.Spec.CSRExpirationSeconds).WithServiceAccountConfig(config.GetUserSystemNamespace(), sa) + apiConfig, err := cfg.Apply(r.config, r.Client) if err != nil { - r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "syncReNewConfig event %s is error: %v", user.Name, err) + helper.SetConditionError(userCondition, "SyncKubeConfigError", err) + r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Sync KubeConfig apply %s is error: %v", user.Name, err) return ctx } - if ok, val := ctx.Value(ctxKey("reNew")).(bool); ok { - if val { - apiConfig = nil - } - } if apiConfig == nil { - apiConfig, err = cfg.Apply(r.config, r.Client) - if err != nil { - helper.SetConditionError(userCondition, "SyncKubeConfigError", err) - r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Sync KubeConfig apply %s is error: %v", user.Name, err) - return ctx - } - if apiConfig == nil { - helper.SetConditionError(userCondition, "SyncKubeConfigError", errors.New("api.config is nil")) - r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Sync KubeConfig apply %s is error: %v", user.Name, errors.New("api.config is nil")) - return ctx - } - kubeData, err := clientcmd.Write(*apiConfig) - if err != nil { - helper.SetConditionError(userCondition, "OutputKubeConfigError", err) - r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Output KubeConfig apply %s is error: %v", user.Name, err) - return ctx - } - user.Status.KubeConfig = string(kubeData) - userCondition.Message = fmt.Sprintf("renew sync kube config successfully hash %s", hash.HashToString(user.Status.KubeConfig)) + helper.SetConditionError(userCondition, "SyncKubeConfigError", errors.New("api.config is nil")) + r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Sync KubeConfig apply %s is error: %v", user.Name, errors.New("api.config is nil")) + return ctx + } + kubeData, err := clientcmd.Write(*apiConfig) + if err != nil { + helper.SetConditionError(userCondition, "OutputKubeConfigError", err) + r.Recorder.Eventf(user, v1.EventTypeWarning, "syncKubeConfig", "Output KubeConfig apply %s is error: %v", user.Name, err) + return ctx } + user.Status.KubeConfig = string(kubeData) + userCondition.Message = fmt.Sprintf("renew sync kube config successfully hash %s", hash.HashToString(user.Status.KubeConfig)) return ctx } diff --git a/controllers/user/go.mod b/controllers/user/go.mod index 593328de329..03313cc5ea8 100644 --- a/controllers/user/go.mod +++ b/controllers/user/go.mod @@ -1,86 +1,85 @@ module github.com/labring/sealos/controllers/user -go 1.20 +go 1.21 + +toolchain go1.22.4 require ( - github.com/go-logr/logr v1.2.3 + github.com/go-logr/logr v1.4.1 github.com/labring/operator-sdk v1.0.1 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.22.1 - golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 - k8s.io/api v0.25.6 - k8s.io/apimachinery v0.25.6 - k8s.io/client-go v0.25.6 - sigs.k8s.io/controller-runtime v0.13.0 + github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b + github.com/onsi/ginkgo v1.16.4 + github.com/onsi/gomega v1.30.0 + golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 + k8s.io/api v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + sigs.k8s.io/controller-runtime v0.17.2 ) require ( - cloud.google.com/go/compute v1.14.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.22.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect - github.com/onsi/ginkgo/v2 v2.3.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.1 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/term v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect - golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/apiextensions-apiserver v0.29.0 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +replace ( + k8s.io/api => k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.28.3 + k8s.io/client-go => k8s.io/client-go v0.28.3 + k8s.io/component-base => k8s.io/component-base v0.28.3 + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.17.2 ) diff --git a/controllers/user/go.sum b/controllers/user/go.sum index b74252c7871..686d0f5d6c4 100644 --- a/controllers/user/go.sum +++ b/controllers/user/go.sum @@ -3,6 +3,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -13,67 +14,777 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -81,9 +792,15 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -94,55 +811,87 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -150,6 +899,9 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -159,37 +911,40 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.0 h1:1VXunYCNgapcSzFtcY+eBmrwESlYCnFJZahQRgTRoo8= -github.com/go-openapi/swag v0.22.0/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -203,6 +958,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -218,12 +975,20 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.16.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -232,16 +997,24 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -249,26 +1022,57 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -284,26 +1088,27 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -313,37 +1118,54 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labring/operator-sdk v1.0.1 h1:JS+j9nF0lihkPJnMYJBZrH7Kfp/dKB2cnbBRMfkmE+g= github.com/labring/operator-sdk v1.0.1/go.mod h1:velfQ6SyrLXBeAShetQyR7q1zJNd8vGO6jjzbKcofj8= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b h1:nftWTQWwbYMbteQkfp5HyKN3nT69FCKPekA8hl2z+VI= +github.com/labring/sealos/controllers/pkg v0.0.0-20240715064441-d1193f70675b/go.mod h1:7WBhRcClEuLy/bVMTFICX2jzhmQDsH6UODRONWqrQHY= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -353,7 +1175,7 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -367,76 +1189,130 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8= -github.com/onsi/ginkgo/v2 v2.3.1/go.mod h1:Sv4yQXwG5VmF7tm3Q5Z+RWUpPo24LF1mpnz2crUb8Ys= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.22.1 h1:pY8O4lBfsHKZHM/6nrxkhVPUznOlIu3quZcKP/M20KI= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -444,18 +1320,22 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -463,7 +1343,6 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -474,73 +1353,160 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.etcd.io/etcd/pkg/v3 v3.5.9/go.mod h1:BZl0SAShQFk0IpLWR78T/+pyt8AruMHhTNNX73hkNVY= +go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs= +go.etcd.io/etcd/raft/v3 v3.5.9/go.mod h1:WnFkqzFdZua4LVlVXQEGhmooLeyS7mqzS4Pf4BCVqXg= +go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= +go.etcd.io/etcd/server/v3 v3.5.9/go.mod h1:GgI1fQClQCFIzuVjlvdbMxNbnISt90gdfYyqiAIt65g= +go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 h1:tnebWN09GYg9OLPss1KXj8txwZc6X6uMr6VFdcGNbHw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -551,6 +1517,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -559,7 +1527,21 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -578,8 +1560,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -596,26 +1576,85 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 h1:Frnccbp+ok2GkUS2tC84yAq/U9Vg+0sIO7aRL3T4Xnc= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -626,6 +1665,15 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -640,10 +1688,8 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -653,6 +1699,7 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -667,29 +1714,95 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -699,18 +1812,32 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ= -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -720,12 +1847,11 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -756,15 +1882,55 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -781,6 +1947,52 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -810,6 +2022,7 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -819,9 +2032,135 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -834,9 +2173,42 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -850,23 +2222,28 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -880,13 +2257,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -894,51 +2267,105 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.25.6 h1:LwDY2H6kD/3R8TekJYYaJWOdekNdXDO44eVpX6sNtJA= -k8s.io/api v0.25.6/go.mod h1:bVp01KUcl8VUHFBTJMOknWNo7XvR0cMbeTTuFg1zCUs= -k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.25.6 h1:r6KIF2AHwLqFfZ0LcOA3I11SF62YZK83dxj1fn14NOQ= -k8s.io/apimachinery v0.25.6/go.mod h1:1S2i1QHkmxc8+EZCIxe/fX5hpldVXk4gvnJInMEb8D4= -k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.25.6 h1:CHxACHi0DijmlYyUR7ooZoXnD5P8jYLgBHcxp775x/U= -k8s.io/client-go v0.25.6/go.mod h1:s9mMAGFYiH3Z66j7BESzu0GEradT9GQ2LjFf/YRrnyc= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/apiserver v0.28.3/go.mod h1:YIpM+9wngNAv8Ctt0rHG4vQuX/I5rvkEMtZtsxW2rNM= +k8s.io/apiserver v0.29.0/go.mod h1:31n78PsRKPmfpee7/l9NYEv67u6hOL6AfcE761HapDM= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/code-generator v0.28.3/go.mod h1:A2EAHTRYvCvBrb/MM2zZBNipeCk3f8NtpdNIKawC43M= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea h1:3QOH5+2fGsY8e1qf+GIFpg+zw/JGNrgyZRQR7/m6uWg= -k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kms v0.28.3/go.mod h1:kSMjU2tg7vjqqoWVVCcmPmNZ/CofPsoTbSxAipCvZuE= +k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0/go.mod h1:VHVDI/KrK4fjnV61bE2g3sA7tiETLn8sooImelsCx3Y= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/controllers/user/main.go b/controllers/user/main.go index f05f10258e5..f52448906a0 100644 --- a/controllers/user/main.go +++ b/controllers/user/main.go @@ -27,6 +27,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/controller-runtime/pkg/cache" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. @@ -87,13 +89,19 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, + //WebhookServer: webhook.NewServer(webhook.Options{ + // Port: 9443, + //}), HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "785548a1.sealos.io", - SyncPeriod: &syncPeriod, + Cache: cache.Options{ + SyncPeriod: &syncPeriod, + }, // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily // when the Manager ends. This requires the binary to immediately end when the // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly @@ -153,6 +161,13 @@ func main() { setupLog.Error(err, "unable to create controller", "controller", "DeleteRequest") os.Exit(1) } + if err = (&controllers.AdaptRoleBindingReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "AdaptRoleBinding") + os.Exit(1) + } //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { diff --git a/deploy/cloud/Kubefile b/deploy/cloud/Kubefile index e218b4485bf..1d00f7f970c 100644 --- a/deploy/cloud/Kubefile +++ b/deploy/cloud/Kubefile @@ -8,5 +8,7 @@ ENV cloudDomain="127.0.0.1.nip.io" ENV cloudPort="" ENV mongodbUri="" ENV mongodbVersion="mongodb-5.0" +ENV acmednsHost="auth.acme-dns.io" +ENV acmednsSecret="" CMD ["bash scripts/init.sh"] diff --git a/deploy/cloud/manifests/acme-cert.yaml.tmpl b/deploy/cloud/manifests/acme-cert.yaml.tmpl new file mode 100644 index 00000000000..19474b381f9 --- /dev/null +++ b/deploy/cloud/manifests/acme-cert.yaml.tmpl @@ -0,0 +1,44 @@ +apiVersion: v1 +stringData: + acmedns.json: | + { + "{{ .cloudDomain }}": {{ empty .acmednsSecret | ternary "" (.acmednsSecret | b64dec) }} + } +kind: Secret +metadata: + name: acme-dns + namespace: sealos-system +type: Opaque +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: acme-dns-issuer + namespace: sealos-system +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: admin@sealos.io + privateKeySecretRef: + name: letsencrypt-prod + solvers: + - dns01: + acmeDNS: + host: https://{{ .acmednsHost }} + accountSecretRef: + name: acme-dns + key: acmedns.json +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: wildcard-cert + namespace: sealos-system +spec: + secretName: wildcard-cert + dnsNames: + - "{{ .cloudDomain }}" + - "*.{{ .cloudDomain }}" + issuerRef: + name: acme-dns-issuer + kind: Issuer \ No newline at end of file diff --git a/deploy/cloud/scripts/init.sh b/deploy/cloud/scripts/init.sh index 6ff37726f37..a46e384c9d8 100644 --- a/deploy/cloud/scripts/init.sh +++ b/deploy/cloud/scripts/init.sh @@ -11,6 +11,7 @@ localRegionUID="" tlsCrtPlaceholder="" tlsKeyPlaceholder="" +acmednsSecretPlaceholder="" saltKey="" function prepare { @@ -150,13 +151,17 @@ function gen_regionUID(){ } function create_tls_secret { - if grep -q $tlsCrtPlaceholder manifests/tls-secret.yaml; then + if ! grep -q $tlsCrtPlaceholder manifests/tls-secret.yaml; then + echo "tls secret is already set" + kubectl apply -f manifests/tls-secret.yaml + elif ! grep -q $acmednsSecretPlaceholder manifests/acme-cert.yaml; then + echo "acme tls secret" + kubectl apply -f manifests/acme-cert.yaml + echo "acme tls cert has been created successfully." + else echo "mock tls secret" kubectl apply -f manifests/mock-cert.yaml echo "mock tls cert has been created successfully." - else - echo "tls secret is already set" - kubectl apply -f manifests/tls-secret.yaml fi } @@ -208,7 +213,7 @@ function sealos_run_controller { --env LOCAL_COCKROACH_URI="$cockroachdbLocalUri" \ --env LOCAL_REGION="$localRegionUID" - sealos run tars/account-service.tar + sealos run tars/account-service.tar --env cloudDomain="$cloudDomain" --env cloudPort="$cloudPort" # run license controller sealos run tars/license.tar diff --git a/deploy/objectstorage/Kubefile b/deploy/objectstorage/Kubefile index 2a16caeeb6e..c8de4664538 100644 --- a/deploy/objectstorage/Kubefile +++ b/deploy/objectstorage/Kubefile @@ -11,5 +11,6 @@ ENV minioStorageSize=${minioStorageSize:-1Gi} ENV promStorageSize=${promStorageSize:-1Gi} ENV minioAdminUser=${minioAdminUser:-"username"} ENV minioAdminPassword=${minioAdminPassword:-"passw0rd"} +ENV minioKubeblocksPassword=${minioAdminPassword:-"kubeblocks"} CMD ["bash scripts/init.sh"] diff --git a/deploy/objectstorage/README.md b/deploy/objectstorage/README.md index a4a7eb4e12e..a7c9bd9c561 100644 --- a/deploy/objectstorage/README.md +++ b/deploy/objectstorage/README.md @@ -1,6 +1,12 @@ # sealos cloud object storage cluster image -## prepare -1. install minio operator -2. install prometheus operator -3. run object storage cluster image \ No newline at end of file +## version + +date: 2024.9.10 + +## components + +1. minio +2. minio monitor service +3. objectstorage controller +4. objectstorage frontend \ No newline at end of file diff --git a/deploy/objectstorage/etc/minio/policy/kubeblocks.json b/deploy/objectstorage/etc/minio/policy/kubeblocks.json index ad32526b1ca..f8693ef60ac 100644 --- a/deploy/objectstorage/etc/minio/policy/kubeblocks.json +++ b/deploy/objectstorage/etc/minio/policy/kubeblocks.json @@ -39,6 +39,26 @@ "Resource": [ "arn:aws:s3:::file-backup/*" ] + }, + { + "Effect": "Allow", + "Action": [ + "s3:DeleteObject", + "s3:GetBucketTagging", + "s3:GetObject", + "s3:ListBucket", + "s3:PutBucketTagging", + "s3:AbortMultipartUpload", + "s3:CreateBucket", + "s3:GetBucketLocation", + "s3:GetBucketPolicy", + "s3:ListBucketMultipartUploads", + "s3:ListMultipartUploadParts", + "s3:PutObject" + ], + "Resource": [ + "arn:aws:s3:::cockroaches-*" + ] } ] } \ No newline at end of file diff --git a/deploy/objectstorage/manifests/minio/deploy.yaml.tmpl b/deploy/objectstorage/manifests/minio/deploy.yaml.tmpl index b98eb33c778..f42ea242ca2 100644 --- a/deploy/objectstorage/manifests/minio/deploy.yaml.tmpl +++ b/deploy/objectstorage/manifests/minio/deploy.yaml.tmpl @@ -115,6 +115,7 @@ metadata: name: object-storage-api namespace: objectstorage-system annotations: + higress.io/response-header-control-update: Content-Disposition attachment kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-body-size: 3g nginx.ingress.kubernetes.io/server-snippet: | diff --git a/deploy/objectstorage/scripts/minio.sh b/deploy/objectstorage/scripts/minio.sh index 68eab45f217..2e01d44d293 100644 --- a/deploy/objectstorage/scripts/minio.sh +++ b/deploy/objectstorage/scripts/minio.sh @@ -55,7 +55,7 @@ function init_minio() { mc admin policy create objectstorage userNormal etc/minio/policy/user_normal.json mc admin policy create objectstorage userDenyWrite etc/minio/policy/user_deny_write.json mc admin policy create objectstorage kubeblocks etc/minio/policy/kubeblocks.json - mc admin user add objectstorage kubeblocks sealos.12345 + mc admin user add objectstorage kubeblocks ${minioKubeblocksPassword} mc admin user add objectstorage testuser sealos2023 mc admin group add objectstorage userNormal testuser mc admin group add objectstorage userDenyWrite testuser diff --git a/deploy/registry/README.md b/deploy/registry/README.md deleted file mode 100644 index f6216fb4acf..00000000000 --- a/deploy/registry/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# How to deploy the registry service - -sealos registry design: -```mermaid -sequenceDiagram - participant u as User - participant sh as sealos Hub - participant sa as sealos hub Auth - par Login - u->>sh: sealos login using '-k kubeconfig' - sh->>sa: Check account - sa->>sh: Have account - sh->>sh: Create token - sh->>u: Return token - end - par Push - u->>sh: sealos push image - sh->>sa: Check account and rbac - sa->>sa: check image/repo/org access - sa->>sh: Have access rights - sh->>sh: Save image info and blobs - sh->>u: Return push status - end - par Pull - u->>sh: sealos pull image - sh->>sa: Check account and rbac - sa->>sa: check image/repo/org exists - sa->>sh: Exists! - sh->>sh: return image info and blobs meta - sh->>u: Return pull status - end - -``` - -## Pre-Requirements - -1. [Sealos Cloud](../cloud/README.md) for auth. -2. [Sealos Cluster](./install_base_server.md) for registry. - -### A running sealos kubernetes cluster - -with at least svc(s) below: - -1. kubernetes -2. calico -3. service-hub(@see [service-hub](../../service/hub/README.md)) - -### Base applications requirements - -1. At least one storage Provider, here we use aliyun OSS and CDN. Or, you can use openebs. - * `AliOSS`: read [this](https://distribution.github.io/distribution/storage-drivers/) - * `openebs` : `sealos run labring/openebs:v1.9.0` - -2. One Domain name with admin access - * `ACMEDNS`, `Akamai`, `AzureDNS`, `CloudFlare`, `Google`, `Route53`, `DigitalOcean`, `RFC2136` - * Any cert-manager supported `dns01` webhooks: [github-link](https://github.com/topics/cert-manager-webhook) - - Articles below assume the usage of sealos cloud's [godaddy](https://github.com/snowdrop/godaddy-webhook) webhook as - example. - - *Please Prepare domain access key&secret for further usage* - -### Choice what network gateway to use: - -1. [Ingress-NGINX](../cloud-deprecated/manifests/ingress-nginx/README.md) - -### Modification of config.yml - -1. Example(@see [deploy.yaml](./manifests/deploy.yaml)) - -2. Read docker registry docs about [config](https://distribution.github.io/distribution/about/configuration/) - -3. Edit `auth`, use your own auth server. - -4. The image: [`registry:2`](https://hub.docker.com/_/registry) does not support `AliCDN`, if you need use image: - `ghcr.dockerproxy.com/labring/registry:main` which is build - from [distribution](https://github.com/distribution/distribution) - -### Troublesome and Tips - -1. registry config - * **http.secret** If you are building a cluster of registries behind a load balancer, you MUST ensure the secret is - the same for all - registries. diff --git a/deploy/registry/install_base_server.md b/deploy/registry/install_base_server.md deleted file mode 100644 index f6af7e97c06..00000000000 --- a/deploy/registry/install_base_server.md +++ /dev/null @@ -1,64 +0,0 @@ -# Install sealos and pre-requirements for hub - -## For masters access nodes - -* Make sure masters can access nodes each other, using: - 1. password - 2. ssh key(recommended) - ```bash - ssh-keygen -t ed25519 -C "master0@hub.sealos.cn" - ``` - Copy `~/.ssh/id_ed25519.pub` to all masters&nodes root `~/.ssh/authorized_keys` - 3. custom port(optional) - ```bash - vim /etc/ssh/sshd_config - ``` - *change Port to custom* - ```config - Port 4238 - ``` - ```bash - sudo service sshd restart - ``` - **Also: needs to check custom port are allowed in network acls** - -## For cluster init - -### Init sealos cluster -```bash -wget https://github.com/labring/sealos/releases/download/v4.1.3/sealos_4.1.3_linux_amd64.tar.gz && tar -zxvf sealos_4.1.3_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin -sealos run labring/kubernetes:v1.24.0 labring/calico:v3.22.1 labring/metrics-server:v0.6.4 --masters xxx.xxx.xxx.xxx --nodes xxx.xxx.xxx.xxx --port 4238 -i ~/.ssh/id_ed25519 -``` - -### Install base packages -```bash -sealos run labring/helm:v3.8.2 labring/cert-manager:v1.8.0 -``` - -### Install DNS proxy (Optional) -When cloud infra pod cannot access outbound network, install this package. -```bash -sealos run labring/coredns:v0.0.1 -``` - -### Install network -```bash -sealos run labring/ingress-nginx:4.1.0 -``` -```bash -kubectl taint node NODE_NAME node-role.kubernetes.io/master- -kubectl taint node NODE_NAME node-role.kubernetes.io/control-plane:NoSchedule- -``` - -* If we are using ingress-nginx bare-metal mode, we needs to change things described below: -```bash -# goto sealos rootfs dir -cd /var/lib/sealos/data/default/rootfs -helm upgrade ingress-nginx ingress-nginx --namespace ingress-nginx --set controller.hostNetwork=true,controller.kind=DaemonSet -``` - -https://cert-manager.io/docs/tutorials/zerossl/zerossl/ - -## Note for aliyun usage: -By default, sealos's calico image use cidr `100.64.0.0/10` witch will conflict with aliyun's internal oss services. -We need to update this cidr before install kubernetes as documented here: https://github.com/labring/sealos/issues/1119#issuecomment-1166756114 diff --git a/deploy/registry/manifests/deploy.yaml b/deploy/registry/manifests/deploy.yaml deleted file mode 100644 index 16c2bdf974f..00000000000 --- a/deploy/registry/manifests/deploy.yaml +++ /dev/null @@ -1,141 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: docker-registry-system ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app: docker-registry - name: docker-registry-config - namespace: docker-registry-system -data: - config.yml: | - version: 0.1 - log: - accesslog: - disabled: true - level: debug - formatter: json - fields: - service: registry - environment: staging - storage: - oss: # TODO edit it - accesskeyid: ... - accesskeysecret: ... - region: ... - bucket: ... - delete: - enabled: true - cache: - blobdescriptor: inmemory - middleware: - storage: # TODO edit it - - name: alicdn - options: - baseurl: ... - authtype: ... - privatekey: ... - auth: - token: # TODO DON'T edit it if - realm: https://hubauth.login.sealos.io/auth - service: token-service - issuer: registry-token-issuer - rootcertbundle: /etc/docker/registry/authserver.crt - http: - addr: :5000 - secret: ... # TODO edit it, If you are building a cluster of registries behind a load balancer, - # you MUST ensure the secret is the same for all registries. - headers: - X-Content-Type-Options: [nosniff] - http2: - disabled: false - health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 - authserver.crt: | - -----BEGIN CERTIFICATE----- - ... - -----END CERTIFICATE----- ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: docker-registry - name: docker-registry - namespace: docker-registry-system -spec: - replicas: 2 - revisionHistoryLimit: 5 - selector: - matchLabels: - app: docker-registry - template: - metadata: - labels: - app: docker-registry - spec: - securityContext: - runAsUser: 0 - containers: - - name: docker-registry # nosemgrep - image: ghcr.dockerproxy.com/labring/registry:main - imagePullPolicy: Always - ports: - - containerPort: 5000 - name: web - protocol: TCP - resources: - requests: - memory: "2048Mi" - cpu: "1500m" - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - volumeMounts: - - mountPath: /etc/docker/registry - name: docker-registry-config - tolerations: - - key: node-role.kubernetes.io/control-plane - operator: Exists - effect: NoSchedule - - key: node-role.kubernetes.io/master - operator: Exists - effect: NoSchedule - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - docker-registry - namespaces: - - default - topologyKey: kubernetes.io/hostname - weight: 100 - volumes: - - name: docker-registry-config - configMap: - name: docker-registry-config ---- -apiVersion: v1 -kind: Service -metadata: - name: docker-registry-service - namespace: docker-registry-system -spec: - ports: - - name: port-name - port: 5000 - protocol: TCP - targetPort: 5000 - selector: - app: docker-registry - sessionAffinity: ClientIP \ No newline at end of file diff --git a/deploy/registry/manifests/ingress.yaml b/deploy/registry/manifests/ingress.yaml deleted file mode 100644 index 0f9dac7cc50..00000000000 --- a/deploy/registry/manifests/ingress.yaml +++ /dev/null @@ -1,58 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: cluster-issuer-docker-registry - namespace: docker-registry-system -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: admin@sealos.io - privateKeySecretRef: - name: letsencrypt-prod - solvers: - - http01: - ingress: - class: nginx ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: hub-sealos-cn - namespace: docker-registry-system -spec: - secretName: hub-sealos-cn-cert - dnsNames: - - hub.sealos.cn - issuerRef: - name: cluster-issuer-docker-registry - kind: ClusterIssuer ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: docker-registry-ingress - namespace: docker-registry-system - labels: - app: hub-service - annotations: - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/backend-protocol: "HTTP" - nginx.ingress.kubernetes.io/proxy-body-size: 4096m - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/use-forwarded-headers: "true" -spec: - rules: - - host: hub.sealos.cn - http: - paths: - - pathType: Prefix - path: / - backend: - service: - name: docker-registry-service - port: - number: 5000 - tls: - - hosts: - - hub.sealos.cn - secretName: hub-sealos-cn-cert \ No newline at end of file diff --git a/docs/4.0/docs/advanced-guide/Architecture/Architecture.md b/docs/4.0/docs/advanced-guide/Architecture/Architecture.md index 55fc2ff7af6..afd8f35841b 100644 --- a/docs/4.0/docs/advanced-guide/Architecture/Architecture.md +++ b/docs/4.0/docs/advanced-guide/Architecture/Architecture.md @@ -18,6 +18,6 @@ Using the following diagram as an example: For various applications on Sealos, they can interact directly with `Kubernetes` services, or interact with various CRD controllers such as Terminal Controller and Ingress-Nginx Controller, etc. Applications can also call each other, for example, a database created by a user in the **Database** application can directly invoke the **Terminal** application and automatically connect to the database for debugging. -For more information, please refer to the [link](../../platform-components) documentation. +For more information, please refer to the [link](../../guides) documentation. ![Application](./images/application_light.png#gh-light-mode-only)![Application](./images/application_dark.png#gh-dark-mode-only) \ No newline at end of file diff --git a/docs/4.0/docs/self-hosting/sealos/QA.md b/docs/4.0/docs/self-hosting/sealos/QA.md index 591aba6c78f..a7bbc88787d 100644 --- a/docs/4.0/docs/self-hosting/sealos/QA.md +++ b/docs/4.0/docs/self-hosting/sealos/QA.md @@ -104,3 +104,10 @@ enabled user register: kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: false/signUpEnabled: true/g' | kubectl apply -f - kubectl rollout restart deployment desktop-frontend -n sealos ``` + + +## Database Issues + +### Dify installation + +The Sealos offline package does not include the vector database by default (and the related image is not packaged), so it is currently not possible to install the Dify application in a privately deployed Sealos cluster. \ No newline at end of file diff --git a/docs/4.0/i18n/zh-Hans/advanced-guide/Architecture/Architecture.md b/docs/4.0/i18n/zh-Hans/advanced-guide/Architecture/Architecture.md index 6ef406b77b8..cfa4b5c9d89 100644 --- a/docs/4.0/i18n/zh-Hans/advanced-guide/Architecture/Architecture.md +++ b/docs/4.0/i18n/zh-Hans/advanced-guide/Architecture/Architecture.md @@ -17,6 +17,6 @@ Sealos 上的应用采用前后端分离的架构,同时前端能够提供 `SS 对于 Sealos 上的各种应用而言,它们可以直接与 `Kubernetes` 的服务进行交互,也可以与各种 CRD Controller 比如 Terminal Controller 和 Ingress-Nginx Controller 等等进行交互。 应用之间也可以互相调用,比如用户在**数据库**应用中新建的数据库,可以直接唤起**终端**应用并自动连接上数据库进行调试。 -详细信息可以点击 [链接](../../platform-components) 文档了解更多。 +详细信息可以点击 [链接](../../guides) 文档了解更多。 ![Application](./images/application_light.png#gh-light-mode-only)![Application](./images/application_dark.png#gh-dark-mode-only) \ No newline at end of file diff --git a/docs/4.0/i18n/zh-Hans/quick-start/use-database.md b/docs/4.0/i18n/zh-Hans/quick-start/use-database.md index 5e98f08f376..133a02e1be3 100644 --- a/docs/4.0/i18n/zh-Hans/quick-start/use-database.md +++ b/docs/4.0/i18n/zh-Hans/quick-start/use-database.md @@ -22,7 +22,7 @@ sidebar_position: 4 ![](./images/database-more.png) -4. 点击一键连接,就可以直接打开「[终端](../../platform-components/terminal/terminal.md)」应用进入数据库的命令行终端。 +4. 点击一键连接,就可以直接打开「[终端](../../guides/terminal/terminal.md)」应用进入数据库的命令行终端。 ![](./images/database-connect.png) diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/QA.md b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/QA.md index eb8b12389da..47445d62f44 100644 --- a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/QA.md +++ b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/QA.md @@ -108,3 +108,10 @@ kubectl rollout restart deployment desktop-frontend -n sealos kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: false/signUpEnabled: true/g' | kubectl apply -f - kubectl rollout restart deployment desktop-frontend -n sealos ``` + + +## 数据库相关问题 + +### Dify安装 + +由于 Sealos 离线包默认未包含向量数据库的启动配置(也未打包相关镜像),目前在私有化部署的 Sealos 集群中暂时无法安装 Dify 应用。 \ No newline at end of file diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-1.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-1.png new file mode 100644 index 00000000000..790d9cc7a3d Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-1.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-2.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-2.png new file mode 100644 index 00000000000..9f04a466892 Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-2.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-3.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-3.png new file mode 100644 index 00000000000..ea555c230e1 Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-3.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-4.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-4.png new file mode 100644 index 00000000000..d409c55ba36 Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-4.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-5.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-5.png new file mode 100644 index 00000000000..3cde5ae7685 Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-5.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-6.png b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-6.png new file mode 100644 index 00000000000..4a6ef666fb1 Binary files /dev/null and b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/images/sealos-license-6.png differ diff --git a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/installation.md b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/installation.md index 34755fe2860..e1e0c79032c 100644 --- a/docs/4.0/i18n/zh-Hans/self-hosting/sealos/installation.md +++ b/docs/4.0/i18n/zh-Hans/self-hosting/sealos/installation.md @@ -101,8 +101,8 @@ Sealos 需要使用证书来保证通信安全,默认在您不提供证书的 使用 nip.io 作为 Sealos 的域名非常简单,只需在第一个 Master 节点上执行以下命令,并根据提示输入参数: ```bash -$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ - --cloud-version=v5.0.0-beta5 \ +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ --proxy-prefix=https://mirror.ghproxy.com ``` @@ -145,8 +145,8 @@ cloud.example.io A 192.168.1.10 然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: ```bash -$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ - --cloud-version=v5.0.0-beta5 \ +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ --proxy-prefix=https://mirror.ghproxy.com \ --cloud-domain= \ @@ -172,8 +172,8 @@ cloud.example.io A 192.168.1.10 然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: ```bash -$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ - --cloud-version=v5.0.0-beta5 \ +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ --proxy-prefix=https://mirror.ghproxy.com \ --cloud-domain= @@ -231,8 +231,8 @@ $ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring 然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: ```bash -$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ - --cloud-version=v5.0.0-beta5 \ +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ --proxy-prefix=https://mirror.ghproxy.com \ --cloud-domain= @@ -395,34 +395,40 @@ Linux 不同发行版更新根证书存储的命令不一样,用来保存私 ## 激活集群 -集群安装完成后,默认只有 5 元的额度,你需要激活集群以获取赠送的 299 元余额。步骤如下: +集群安装完成后,需要激活集群,步骤如下: 1. 首先点击桌面的「许可证」打开许可证应用: - ![](images/sealos-license.png) + ![](images/sealos-license-1.png) -2. 然后点击「激活/购买」: - - ![](images/sealos-license-activate.jpg) +2. 然后点击出现的页面左侧的「激活/购买」: + + ![](images/sealos-license-2.png) + + 然后浏览器会跳转到 License 页面: + + ![](images/sealos-license-3.png) + +3. 如果你还没有在该页面创建过集群,就点击左上角-价格-获取,立即开始创建一个集群;如果你已经创建过集群了,只需要点击「我的集群」便会跳转到已有集群。 - 然后浏览器会跳转到 License 页面,并跳出一个弹窗: +4. 新购买一个集群后,点进进入会看到新购买的集群显示-未激活: - ![](images/sealos-license-activate1.png) + ![](images/sealos-license-4.png) -3. 如果你还没有在该页面创建过集群,就点击「理立即开始」创建一个集群;如果你已经创建过集群了,只需要点击「已有集群」便会跳转到已有集群。 + 点击集群管理,在集群激活处输入一个集群id(自取,不能和他人重复),输入完成后点击激活即可成功激活集群。 - 跳转到集群列表之后。你就会看到集群已经被激活了: + ![](images/sealos-license-5.png) - ![](images/sealos-license-activate2.png) + 5.成功激活集群后,集群管理的右侧会出现License管理选项,点击进入,在License列表下面导出License: -4. 点击 「License 管理」,然后下载免费赠送的价值 299 元的 License: + ![](images/sealos-license-6.png) - ![](images/sealos-license-activate3.png) + -5. 然后回到 Sealos 集群的「许可证」应用界面,点击「上传 License 文件」: + 6.导出License后,回到 Sealos 集群的「许可证」应用界面,点击「上传 License 文件」: ![](images/sealos-license-activate4.png) - 选择刚刚下载的 License 文件进行上传,然后点击右下角的「激活 License」,便可激活 License。激活成功后,集群中的余额就变成了 304 元。 + 选择刚刚下载的 License 文件进行上传,然后点击右下角的「激活 License」,便可激活 License。 ![](images/sealos-cost-center.jpg) \ No newline at end of file diff --git a/docs/4.0/i18n/zh-Hans/current.json b/docs/4.0/i18n/zh-Hans/sidebar.json similarity index 99% rename from docs/4.0/i18n/zh-Hans/current.json rename to docs/4.0/i18n/zh-Hans/sidebar.json index f13c4af2f53..0b3bab535d2 100644 --- a/docs/4.0/i18n/zh-Hans/current.json +++ b/docs/4.0/i18n/zh-Hans/sidebar.json @@ -1,6 +1,6 @@ { "version.label": { - "message": "Next", + "message": "4.0.0", "description": "The label for version current" }, "sidebar.docSidebar.category.Examples": { @@ -103,4 +103,4 @@ "message": "常用语言案例", "description": "The label for category programming-languages in sidebar docSidebar" } -} +} \ No newline at end of file diff --git a/docs/4.0/sidebar.json b/docs/4.0/sidebar.json index 050c870b4e4..fb0b1df1198 100644 --- a/docs/4.0/sidebar.json +++ b/docs/4.0/sidebar.json @@ -1,263 +1,265 @@ -[ - "Intro", - { - "type": "category", - "label": "Quick Start", - "link": { - "type": "generated-index" - }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "quick-start" - } - ] - }, - { - "type": "category", - "label": "Examples", - "link": { - "type": "generated-index" +{ + "docSidebar": [ + "Intro", + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "quick-start" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "category", - "label": "programming-languages", - "link": { - "type": "generated-index" - }, - "collapsible": true, - "collapsed": true, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/programming-languages" - } - ] + { + "type": "category", + "label": "Examples", + "link": { + "type": "generated-index" }, - { - "type": "category", - "label": "dial-testing-system", - "link": { - "type": "generated-index" + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "programming-languages", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/programming-languages" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/dial-testing-system" - } - ] - }, - { - "type": "category", - "label": "BaaS", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "dial-testing-system", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/dial-testing-system" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/baas" - } - ] - }, - { - "type": "category", - "label": "low-code-platform", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "BaaS", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/baas" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/low-code-platform" - } - ] - }, - { - "type": "category", - "label": "blog-platform", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "low-code-platform", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/low-code-platform" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/blog-platform" - } - ] - }, - { - "type": "category", - "label": "ai-applications", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "blog-platform", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/blog-platform" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/ai-applications" - } - ] - }, - { - "type": "category", - "label": "social-communication", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "ai-applications", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/ai-applications" + } + ] }, - "collapsible": true, - "collapsed": false, - "items": [ - { - "type": "autogenerated", - "dirName": "examples/social-communication" - } - ] - } - ] - }, - { - "type": "category", - "label": "How-to Guides", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "social-communication", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "examples/social-communication" + } + ] + } + ] }, - "items": [ - { - "type": "autogenerated", - "dirName": "guides" - } - ] - }, - { - "type": "category", - "label": "Advanced Guide", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "How-to Guides", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "guides" + } + ] }, - "items": [ - { - "type": "autogenerated", - "dirName": "advanced-guide" - } - ] - }, - { - "type": "category", - "label": "Self Hosting", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "Advanced Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "advanced-guide" + } + ] }, - "items": [ - { - "type": "category", - "label": "Sealos", - "link": { - "type": "generated-index" - }, - "items": [ - { - "type": "autogenerated", - "dirName": "self-hosting/sealos" - } - ] + { + "type": "category", + "label": "Self Hosting", + "link": { + "type": "generated-index" }, - { - "type": "category", - "label": "Kubernetes Lifecycle Management", - "link": { - "type": "doc", - "id": "self-hosting/lifecycle-management/lifecycle-management" + "items": [ + { + "type": "category", + "label": "Sealos", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/sealos" + } + ] }, - "items": [ - { - "type": "category", - "label": "Quick Start", - "link": { - "type": "generated-index" - }, - "items": [ - { - "type": "autogenerated", - "dirName": "self-hosting/lifecycle-management/quick-start" - } - ] + { + "type": "category", + "label": "Kubernetes Lifecycle Management", + "link": { + "type": "doc", + "id": "self-hosting/lifecycle-management/lifecycle-management" }, - { - "type": "category", - "label": "Operations", - "link": { - "type": "generated-index" + "items": [ + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/quick-start" + } + ] }, - "items": [ - { - "type": "autogenerated", - "dirName": "self-hosting/lifecycle-management/operations" - } - ] - }, - { - "type": "category", - "label": "Advanced Guide", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "Operations", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/operations" + } + ] }, - "items": [ - { - "type": "autogenerated", - "dirName": "self-hosting/lifecycle-management/advanced-guide" - } - ] - }, - { - "type": "category", - "label": "Reference", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "Advanced Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/advanced-guide" + } + ] }, - "items": [ - { - "type": "autogenerated", - "dirName": "self-hosting/lifecycle-management/reference" - } - ] - }, - "self-hosting/lifecycle-management/QA" - ] - } - ] - }, - { - "type": "doc", - "id": "Community", - "label": "Community" - }, - { - "type": "category", - "label": "Master Services Agreement", - "link": { - "type": "generated-index" + { + "type": "category", + "label": "Reference", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/reference" + } + ] + }, + "self-hosting/lifecycle-management/QA" + ] + } + ] + }, + { + "type": "doc", + "id": "Community", + "label": "Community" }, - "items": [ - { - "type": "autogenerated", - "dirName": "msa" - } - ] - } -] \ No newline at end of file + { + "type": "category", + "label": "Master Services Agreement", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "msa" + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/5.0/auto-sidebar.json b/docs/5.0/auto-sidebar.json new file mode 100644 index 00000000000..c701e92f1a1 --- /dev/null +++ b/docs/5.0/auto-sidebar.json @@ -0,0 +1,8 @@ +{ + "defaultSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} \ No newline at end of file diff --git a/docs/5.0/code.json b/docs/5.0/code.json new file mode 100644 index 00000000000..7f236043c68 --- /dev/null +++ b/docs/5.0/code.json @@ -0,0 +1,646 @@ +{ + "theme.ErrorPageContent.title": { + "message": "页面已崩溃。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "重试", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.NotFound.title": { + "message": "找不到页面", + "description": "The title of the 404 page" + }, + "theme.NotFound.p1": { + "message": "我们找不到您要找的页面。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "关闭", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到顶部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "博文列表分页导航", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "较新的博文", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "较旧的博文", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.archive.title": { + "message": "历史博文", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "历史博文", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.post.readingTime.plurals": { + "message": "{readingTime} 分钟阅读", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.post.readMoreLabel": { + "message": "阅读 {title} 的全文", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readMore": { + "message": "阅读更多", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "博文分页导航", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "较新一篇", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "较旧一篇", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "{count} 篇博文", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} 含有标签「{tagName}」", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "查看所有标签", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "切换浅色/暗黑模式(当前为{mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "暗黑模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "浅色模式", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.home": { + "message": "主页面", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "页面路径", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} 个项目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "文档分页导航", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "上一页", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "下一页", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} 篇文档带有标签", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged}「{tagName}」", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新的文档请参阅 {latestVersionLink} ({versionLabel})。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新版本", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "编辑此页", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "标题的直接链接", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": "于 {date} ", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "由 {user} ", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "最后{byUser}{atDate}更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "选择版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.common.skipToMainContent": { + "message": "跳到主要内容", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsListLabel": { + "message": "标签:", + "description": "The label alongside a tag list" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近博文导航", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "复制成功", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "复制代码到剪贴板", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "复制", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切换自动换行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { + "message": "打开/收起侧边栏菜单「{label}」", + "description": "The ARIA label to toggle the collapsible sidebar category" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "选择语言", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "本页总览", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "收起侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "收起侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← 回到主菜单", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "展开侧边栏", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "展开侧边栏", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "Simple": { + "message": "简单", + "description": "homepage simple" + }, + "Any highly available distributed application on Kubernetes can be easily installed with just one click.": { + "message": "像使用个人电脑一样在 Kubernetes 上一键安装任意高可用分布式应用程序,几乎不需要任何专业的交付和运维成本", + "description": "homepage simple" + }, + "Flexible": { + "message": "灵活", + "description": "homepage flexible" + }, + "Easily customize the cloud you need by freely combining various distributed applications.": { + "message": "利用独特的集群镜像能力将任意分布式应用打包成 OCI 镜像,自由组合各种分布式应用程序,轻松订制所需的云", + "description": "homepage flexible intro" + }, + "Powerful": { + "message": "强大", + "description": "homepage powerful" + }, + "The cloud services can be easily found and acquired in the application marketplace, offering simplicity and power.": { + "message": "通过应用商店来灵活满足各类用户的需求,形成强大的应用生态", + "description": "homepage flexible intro" + }, + "Kernel Arch": { + "message": "以 kubernetes 为云内核架构" + }, + "Cloud Driver": { + "message": "云驱动" + }, + "Cloud Kernel": { + "message": "云内核" + }, + "Distributed Applications": { + "message": "分布式应用程序" + }, + "Used By": { + "message": "客户列表" + }, + "theme.SearchBar.seeAll": { + "message": "查看全部 {count} 个结果" + }, + "theme.SearchBar.label": { + "message": "搜索", + "description": "The ARIA label and placeholder for search button" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "找到 {count} 份文件", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.existingResultsTitle": { + "message": "「{query}」的搜索结果", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "在文档中搜索", + "description": "The search page title for empty query" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "在此输入搜索字词", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "搜索", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.algoliaLabel": { + "message": "通过 Algolia 搜索", + "description": "The ARIA label for Algolia mention" + }, + "theme.SearchPage.noResultsText": { + "message": "未找到任何结果", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "正在获取新的搜索结果...", + "description": "The paragraph for fetching new search results" + }, + "Contact": { + "message": "联系我们" + }, + "Contact US": { + "message": "联系我们" + }, + "theme.admonition.note": { + "message": "备注", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "提示", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.danger": { + "message": "危险", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "信息", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.caution": { + "message": "警告", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Close navigation bar", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Toggle navigation bar", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.SearchModal.searchBox.resetButtonTitle": { + "message": "清除查询", + "description": "The label and ARIA label for search box reset button" + }, + "theme.SearchModal.searchBox.cancelButtonText": { + "message": "取消", + "description": "The label and ARIA label for search box cancel button" + }, + "theme.SearchModal.startScreen.recentSearchesTitle": { + "message": "最近搜索", + "description": "The title for recent searches" + }, + "theme.SearchModal.startScreen.noRecentSearchesText": { + "message": "没有最近搜索", + "description": "The text when no recent searches" + }, + "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { + "message": "保存这个搜索", + "description": "The label for save recent search button" + }, + "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { + "message": "从历史记录中删除这个搜索", + "description": "The label for remove recent search button" + }, + "theme.SearchModal.startScreen.favoriteSearchesTitle": { + "message": "收藏", + "description": "The title for favorite searches" + }, + "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { + "message": "从收藏列表中删除这个搜索", + "description": "The label for remove favorite search button" + }, + "theme.SearchModal.errorScreen.titleText": { + "message": "无法获取结果", + "description": "The title for error screen of search modal" + }, + "theme.SearchModal.errorScreen.helpText": { + "message": "你可能需要检查网络连接。", + "description": "The help text for error screen of search modal" + }, + "theme.SearchModal.footer.selectText": { + "message": "选中", + "description": "The explanatory text of the action for the enter key" + }, + "theme.SearchModal.footer.selectKeyAriaLabel": { + "message": "Enter 键", + "description": "The ARIA label for the Enter key button that makes the selection" + }, + "theme.SearchModal.footer.navigateText": { + "message": "导航", + "description": "The explanatory text of the action for the Arrow up and Arrow down key" + }, + "theme.SearchModal.footer.navigateUpKeyAriaLabel": { + "message": "向上键", + "description": "The ARIA label for the Arrow up key button that makes the navigation" + }, + "theme.SearchModal.footer.navigateDownKeyAriaLabel": { + "message": "向下键", + "description": "The ARIA label for the Arrow down key button that makes the navigation" + }, + "theme.SearchModal.footer.closeText": { + "message": "关闭", + "description": "The explanatory text of the action for Escape key" + }, + "theme.SearchModal.footer.closeKeyAriaLabel": { + "message": "Esc 键", + "description": "The ARIA label for the Escape key button that close the modal" + }, + "theme.SearchModal.footer.searchByText": { + "message": "搜索提供", + "description": "The text explain that the search is making by Algolia" + }, + "theme.SearchModal.noResultsScreen.noResultsText": { + "message": "没有结果:", + "description": "The text explains that there are no results for the following search" + }, + "theme.SearchModal.noResultsScreen.suggestedQueryText": { + "message": "试试搜索", + "description": "The text for the suggested query when no results are found for the following search" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsText": { + "message": "认为这个查询应该有结果?", + "description": "The text for the question where the user thinks there are missing results" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { + "message": "请告知我们。", + "description": "The text for the link to report missing results" + }, + "theme.SearchModal.placeholder": { + "message": "搜索文档", + "description": "The placeholder of the input of the DocSearch pop-up modal" + }, + "theme.tags.tagsPageTitle": { + "message": "标签", + "description": "The title of the tag list page" + }, + "Run Your Business on Sealos Cloud": { + "message": "Sealos - 以 kubernetes 为内核的云操作系统发行版" + }, + "Features": { + "message": "特性" + }, + "Sealos is a Kubernetes distribution, a general-purpose cloud operating system for managing cloud-native applications.": { + "message": "Sealos 以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,实现一个开源的、可随处运行的 AWS 替代方案" + }, + "Copy": { + "message": "复制" + }, + "START NOW": { + "message": "在线使用" + }, + "CONTACT US NOW": { + "message": "联系我们" + }, + "Sealos cloud-native App Store": { + "message": "Sealos 应用商店" + }, + "Fully compatible with Docker registry, enjoy seamless one-click installation of various cloud-native distributed applications": { + "message": "Sealos 应用商店中的每一个应用都是一个集群镜像,集群镜像中包含了分布式应用的所有依赖(例如 Helm Chart、容器镜像和二进制文件),可一键安装。" + }, + "Sealos PostgreSQL Database": { + "message": "Sealos PostgreSQL 数据库" + }, + "One-click creation of a highly available PostgreSQL database, with multi-database cluster management and backup and recovery capabilities": { + "message": "Sealos 注重为数据库用户提供沉浸式的使用体验,可一键创建高可用 PostgreSQL 数据库,并提供多数据库集群的管理、备份和恢复功能。" + }, + "Sealos Cloud Provider": { + "message": "Sealos Cloud Provider" + }, + "Effortlessly establish an independent Kubernetes cluster within minutes on AWS or other public clouds, and effortlessly manage multiple clusters": { + "message": "可在 AWS 等公有云上数分钟内创建一个独立的 Kubernetes 集群并管理多个集群,启动性能高出绝大多数公有云的三倍以上,而价格仅为 AWS 的 80%。" + }, + "Examples": { + "message": "使用样例" + }, + "Anything else as can be freely combined as Cloud OS Applications, allowing for unlimited combinations to fulfill a wide range of requirements and scenarios.": { + "message": "任意分布式应用都可以作为云操作系统的应用进行自由组合,以满足各种需求和场景。" + }, + "By utilizing Kubernetes as the core of the Cloud OS, we can abstract underlying resources, define resource interfaces, and standardize application management.": { + "message": "使用 Kubernetes 作为云操作系统内核,抽象底层资源 / 定义资源接口 / 标准化应用程序管理。" + }, + "The Cloud OS leverages CRI, CNI, and CSI as drivers and utilizes technologies such as Containerd, Calico, and OpenEBS to pool resources and ensure seamless access across the compute, storage, and network domains.": { + "message": "使用 CRI、CNI、CSI 作为云操作系统驱动程序,并利用 Containerd、Calico、OpenEBS 等插件将所有的计算、存储和网络等资源池化。" + }, + "Comprehensive Kubernetes Cluster management throughout its entire lifecycle, including Installation, Scaling, Backup, Recovery, and Upgrades": { + "message": "管理 Kubernetes 集群的整个生命周期,包括集群的包括安装、扩容、备份、恢复和升级。" + }, + "Storage": { + "message": "存储" + }, + "Supports block storage, object storage, and file storage with one-click operation": { + "message": "一键安装各种分布式存储。" + }, + "Network": { + "message": "网络" + }, + "Supports network plugins such as Calico, Flannel, and Cilium with the freedom of customization and choice": { + "message": "支持 Calico、Flannel 和 Cilium 等网络插件,可自由选择和定制。" + }, + "Supports both relational and non-relational databases with high availability, automatic backups, and multi-database instance management capabilities": { + "message": "支持关系型数据库和非关系型数据库,并提供高可用、自动备份和多数据库实例管理等功能。" + }, + "Monitoring": { + "message": "可观测性" + }, + "Easily deploy a monitoring and alarm system with just one click, without the need for additional configuration, and enjoy a simple and intuitive visual experience": { + "message": "一键轻松部署监控和告警系统,无需额外配置,享受简单直观的可视化体验。" + }, + "One-click construction of GPU drivers, device discovery, GPU resource monitoring, and the easy creation of a deep learning platform with AI capabilities": { + "message": "一键安装 GPU 驱动,监控 GPU 资源,轻松打造具备 AI 能力的深度学习平台。" + }, + "MQ": { + "message": "消息队列" + }, + "Supports various mainstream message queues with high availability and automatic monitoring": { + "message": "支持各种主流消息队列,并提供高可用和自动监控功能。" + }, + "Dashboard": { + "message": "可视化" + }, + "Supports various dashboards, enabling users to manage Kubernetes clusters with ease": { + "message": "一键安装各种 Kubernetes 可视化管理工具,轻松管理 Kubernetes 集群。" + }, + "Platform": { + "message": "容器管理平台" + }, + "Support various Container Platforms, enabling users to manage Kubernetes clusters with ease": { + "message": "一键安装各种 企业级容器管理平台,轻松管理 Kubernetes 集群。" + }, + "Support one-click operation for mainstream CI/CD systems such as Argo CD and Drone": { + "message": "一键安装 Argo CD 和 Drone 等主流 DevOps 系统。" + }, + "More than 4,000 Companies and 100,000+ Individuals!": { + "message": "已被 4000 多家公司和 10w+ 个人用户采用!" + }, + "Start": { + "message": "Home" + }, + "GitOps": { + "message": "GitOps" + }, + "Kubernetes": { + "message": "Kubernetes" + }, + "GPU": { + "message": "GPU" + }, + "theme.NavBar.navAriaLabel": { + "message": "主导航", + "description": "The ARIA label for the main navigation" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "文档侧边栏", + "description": "The ARIA label for the sidebar navigation" + }, + "Docs": { + "message": "文档", + "description": "The Header Documentation" + }, + "Community": { + "message": "社区", + "description": "The Header Community" + }, + "Join Us": { + "message": "加入我们" + }, + "The Capabilities of Sealos": { + "message": "Sealos 的能力" + }, + "Application Management": { + "message": "应用管理" + }, + "Easy management and quick release of publicly accessible distributed applications in the app store.": { + "message": "在应用商店中轻松管理并快速发布可公网访问的分布式应用。" + }, + "Database": { + "message": "数据库管理" + }, + "Create high-availability databases in seconds, offering support for MySQL, PostgreSQL, MongoDB, and Redis.": { + "message": "秒级创建高可用数据库,支持 MySQL、PostgreSQL、MongoDB 和 Redis。" + }, + "Cloud Universality": { + "message": "公私一致" + }, + "Equally effective in both public and private cloud, enabling a seamless transition of traditional applications to the cloud.": { + "message": "即是公有云也是私有云,支持传统应用无缝迁移到云环境。" + }, + "Why Choose Sealos?": { + "message": "为什么选择 Sealos" + }, + "Efficient & Cost-Effective": { + "message": "高效 & 经济" + }, + "Universal & User-Friendly": { + "message": "通用性强,无心智负担" + }, + "Flexible & Secure": { + "message": "灵活 & 安全" + }, + "Pay only for the containers you use. Auto-scaling prevents wasted resources, saving you a lot of money.": { + "message": "仅需为容器付费,自动伸缩杜绝资源浪费,大幅度节省成本。" + }, + "Focus on your business without worrying about complexity. There is almost no learning curve.": { + "message": "专注于业务本身,无需担心复杂性,几乎没有学习成本。" + }, + "The multi-tenant sharing mechanism ensures security while providing resource isolation and efficient collaboration.": { + "message": "多租户共享机制在确保安全的同时,实现资源隔离与高效协作。" + }, + "Get early access to the latest Sealos versions and stay connected with developers and users on Discord.": { + "message": "加入 Sealos 社区,在这里您可以在第一时间体验 Sealos 的最新版本,以及在 Discord 或微信群与开发者和用户保持沟通" + }, + "Who are Using Sealos": { + "message": "谁在使用 Sealos" + }, + "Join Sealos Community": { + "message": "加入 Sealos 社区" + }, + "Experience the latest version of Sealos for the first time and communicate with developers and users in Discord!": { + "message": "在这里您可以在第一时间体验 Sealos 的最新版本,以及在 Discord 或微信群与开发者和用户保持沟通" + }, + "Start Now": { + "message": "立即使用" + }, + "for all applications": { + "message": "托管所有分布式应用" + }, + "Hosting": { + "message": "私有云" + }, + "A cloud operating system based on the Kubernetes kernel": { + "message": "以 Kubernetes 为内核的云操作系统" + }, + "Explore": { + "message": "了解更多" + }, + "Blog": { + "message": "博客" + }, + "App Store": { + "message": "应用商店" + } +} \ No newline at end of file diff --git a/docs/5.0/docs/Intro.md b/docs/5.0/docs/Intro.md new file mode 100644 index 00000000000..a29697e34e9 --- /dev/null +++ b/docs/5.0/docs/Intro.md @@ -0,0 +1,92 @@ +--- +keywords: [cloud operating system, Kubernetes, Sealos, cloud-native, distributed applications, private cloud, public cloud, high-availability, cluster imaging, app store] +description: Sealos is a cloud operating system based on Kubernetes, enabling effortless cloud usage with high-availability and flexible app store capabilities for both public and private clouds. +--- + +import Highlight from '@site/src/components/Highlight' + +# What is Sealos? + + + +The vastness and complexity of the cloud-native ecosystem undoubtedly leaves many businesses in disarray, yearning for +an efficient, ready-to-use distribution, which this ecosystem sorely lacks. The cloud-native market is in dire need of a +cloud operating system to further reduce barriers and costs. + +The advent of Sealos opens a new window for enterprises. It provides a novel choice for businesses and developers alike, +necessitating only the installation of a cloud operating system, regardless of public or private cloud use. It allows +various applications to operate stably and securely, tackling all sorts of dependency issues they might require. + +Sealos adheres to the philosophy that **cloud usage can be as simple as Linux**. You can commence usage right after +installation, as you would with Linux, without entanglement in excessive complexities. The sole difference is that while +Linux is installed on a single server, Sealos is installed across an entire data center. + +In Sealos's architecture, **there's no essential difference between public and private clouds**. They should be separate +instances of the same codebase, the only distinction lying in their configuration and installed applications. Installing +it on an intranet renders it a private cloud, while offering services on the public internet converts it into a public +cloud. + +We firmly believe that with the continuous development and advancement of Sealos, the future of cloud computing will be +more open, more straightforward. The benefits of cloud computing should belong to all providers of computational power, +and the value of the cloud should be shared by all participants of cloud computing. **They will be able to enjoy the +various conveniences of cloud computing in a more economical fashion in a diversified market environment.** + +## Overview + +Sealos is a **cloud operating system distribution** based on the Kubernetes kernel. It adopts a cloud-native approach, +discarding traditional cloud computing architecture, and shifting towards a new architecture with Kubernetes as the +cloud kernel. This allows enterprises to use the cloud **as effortlessly as they would use a personal computer**. + +Users will be able to install any high-availability distributed application on Kubernetes with the click of a button, +similar to using a personal computer. It practically requires no professional delivery or operational costs. +Simultaneously, utilizing unique cluster imaging capabilities, users can package any distributed application into an OCI +image, freely combine a variety of distributed applications, and easily customize their desired cloud. The powerful and +flexible app store function can meet the diverse needs of various users. + +![](./images/overview-1.png) + +## Scenarios & Advantages + +Sealos is a powerful business operating platform, providing flawless support for various applications such as Java, Go, +Python, PHP, and more, unrestricted by the programming language. The platform offers a stable operating environment for +applications and resolves backend dependency issues like databases, object storage, and messaging queues. Further, it +can flexibly handle application configuration management, service discovery, public network exposure, and automatic +scaling issues. + +### Public Cloud + +If your business requires operation within a public cloud environment, you can directly use +the [public cloud services provided by Sealos](https://cloud.sealos.io). + +#### Capabilities of Sealos + +- 🚀 **Application Management**: Easy management and quick release of publicly accessible distributed applications in the + app store. +- 🗄️ **Database Management**: Create high-availability databases in seconds, offering support for MySQL, PostgreSQL, + MongoDB, and Redis. +- 🌥️ **Cloud Universality**: Equally effective in both public and private cloud, enabling a seamless transition of + traditional applications to the cloud. + +#### Advantages of Sealos + +- 💰 **Efficient & Economical**: Pay solely for the containers you utilize; automatic scaling prevents resource + squandering and substantially reduces costs. +- 🌐 **High Universality & Ease of Use**: Concentrate on your core business activities without worrying about system + complexities; negligible learning costs involved. +- 🛡️ **Agility & Security**: The distinctive multi-tenancy sharing model ensures both effective resource segmentation + and collaboration, all under a secure framework. + +### Private Cloud + +The Sealos cloud operating system is **100% open source**. You can find all source code +on [GitHub](https://github.com/labring/sealos), which means all features of the **Sealos Public Cloud** can also be +deployed in a private cloud environment to meet more diversified business needs. + +### Strong Application Delivery Capability + +- Sealos has excellent Kubernetes life cycle management capabilities, and you can freely customize the Kubernetes + environment. +- Sealos can package an entire cluster and deliver it to the customer environment with a single click. All services and + businesses can be delivered as a whole. +- Unlike Docker, which mainly focuses on single-machine imaging, Sealos goes further, packaging the **entire cluster** + or a distributed application. \ No newline at end of file diff --git a/docs/5.0/docs/community.md b/docs/5.0/docs/community.md new file mode 100644 index 00000000000..696dbfcc7fa --- /dev/null +++ b/docs/5.0/docs/community.md @@ -0,0 +1,15 @@ +--- +keywords: [Sealos, open source project, Kubernetes, Discord server, GitHub Issues] +description: Sealos is an open source project driven by user participation. Join our Discord server, tweet at @sealosio, or create GitHub Issues for support. +--- + +# Community + +Sealos is an open source project that is driven by the participation of users and contributors. If you have questions or +suggestions about using the product while reading this documentation, please try the following ways to seek support. Our +team and community will do their best to help you. + ++ 💬 Join our [Discord server](https://discord.gg/qzBmGGZGk7) is to chat with Sealos developers and other Sealos users. + This is a good place to learn about Sealos and Kubernetes, ask questions, and share your experiences. ++ 🐦 Tweet at @sealosio on [Twitter](https://twitter.com/sealosio) and follow us. ++ 🐞 Create [GitHub Issues](https://github.com/labring/sealos/issues/new/choose) for bug reports and feature requests. \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/QA.md b/docs/5.0/docs/developer-guide/lifecycle-management/QA.md new file mode 100644 index 00000000000..bf69f3699b1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/QA.md @@ -0,0 +1,211 @@ +--- +sidebar_position: 1 +keywords: [Sealos, Kubernetes, image building, runtime selection, version compatibility, file storage, FAQ] +description: Comprehensive FAQ for Sealos users covering image building, runtime selection, version compatibility, and file storage issues. Includes solutions and best practices. +--- + +# Frequently Asked Questions + +When using Sealos, you may encounter some common questions and issues. Here are answers and solutions to some of the +common problems. + +## Image Building Issues + +### Q1: How to set up a proxy service during the build phase? + +During the execution of the build command, you can configure a proxy service by setting the HTTP_PROXY environment +variable. + +```shell +HTTP_PROXY=socket5://127.0.0.1:7890 sealos build xxxxx +``` + +### Q2: How to enable debug logs for buildah? + +To view debug logs for buildah, you can set the `BUILDAH_LOG_LEVEL` environment variable. + +```shell +BUILDAH_LOG_LEVEL=debug sealos images +``` + +### Q3: How to execute Sealos build within a Pod? + +If you want to execute Sealos build within a Pod, follow these steps: + +1. Build the image within the Pod. You can create a Deployment with the following YAML configuration: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: sealoscli + name: sealoscli +spec: + replicas: 1 + selector: + matchLabels: + app: sealoscli + strategy: {} + template: + metadata: + labels: + app: sealoscli + spec: + containers: + - image: # Replace with your sealos image + name: sealoscli + stdin: true + stdinOnce: true + securityContext: + privileged: true +``` + +2. Create a Dockerfile. Here's an example that you can modify as per your needs: + +```dockerfile +FROM bitnami/minideb:buster + +ARG TARGETOS +ARG TARGETARCH + +LABEL from=bitnami/minideb:buster platform=rootcloud team=oam tag=buster name=base + +RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list && sed -i "s@http://security.debian.org@http://mirrors.aliyun.com/debian-security@g" /etc/apt/sources.list +RUN install_packages curl iputils-ping net-tools telnet procps vim wget jq + +ENV LANG=C.UTF-8 +ENV LANGUAGE=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ENV TZ=Asia/Shanghai +``` + +3. Execute the build command within the Pod. + +```shell +sealos build --arch arm64 --build-arg TARGETOS=linux --build-arg TARGETARCH=arm64 -t test -f Dockerfile . +``` + +### Q4: How to Build Cluster Images Using Other Build Tools? + +If you want to use other container tools like Docker or Podman to build cluster images, you can +utilize [sreg](https://github.com/labring/sreg) to cache the images. + +Follow these steps: + +1. Install sreg: + ```shell + wget https://github.com/labring/sreg/releases/download/v0.1.1/sreg_0.1.1_linux_amd64.tar.gz + tar -xzf sreg_0.1.1_linux_amd64.tar.gz sreg + mv sreg /usr/bin/ + ``` +2. Cache the images: + ```shell + sreg save --registry-dir=registry . + ``` +3. Build the cluster image: + ```shell + docker build -t xxxx -f Sealfile . + ``` + +### Q5: Encounter the error "lgetxattr /var/lib/containers/storage/overlay/0c2afe770ec7870ad4639f18a1b50b3a84718f95c8907f3d54e14dbf0a01d50d/merged/dev/ptmx: no such device" during Sealos build. How to fix it? + +This issue might be related to the version of `fuse-overlayfs`. We recommend downloading the latest version +from [here](https://github.com/containers/fuse-overlayfs/releases) and replacing `/bin/fuse-overlayfs`. + +## Runtime Selection Issues + +### Q1: How to select the Kubernetes runtime? + +Sealos determines the runtime based on the image you choose. If you select the `kubernetes-docker` image, Sealos will +use Docker as the runtime. If you choose the `kubernetes-crio` image, Sealos will use CRI-O as the runtime. + +## Version Compatibility Issues + +### Q1: Error "Applied to cluster error: failed to + +init exec auth.sh failed exit status 127"? + +This error is often caused by a mismatch between the version of Sealos and the version of the image being used. Make +sure that the image version and the Sealos version are compatible. For example, if you are using a Kubernetes version +like `v1.xx.x`, you may need to upgrade Sealos, especially if you are using an older version of Sealos while the Sealos +cluster image is using the latest version. Another solution is to choose the corresponding version of the Sealos image. +For example, if your Sealos version is 4.1.3, then the cluster image should be something like +`kubernetes:v1.24.0-4.1.3`. Ensuring that the image version and Sealos version are compatible can help avoid such +issues. + +### Q2: Error when adding additional domains or modifying the service CIDR in the cluster during the addition of a master node + +To address this issue, the Sealos team made the necessary fixes in version 4.2.0. You can refer to the specific fix and +discussion in this pull +request: [https://github.com/labring/sealos/pull/2943](https://github.com/labring/sealos/pull/2943). + +Therefore, if you encounter this problem, we recommend upgrading to Sealos version 4.2.0. The updated version should +handle these changes correctly and not produce errors when adding a master node. + +## File and Directory Location Issues + +### Q1: How to modify the default storage location for `/root/.sealos`? + +If you need to change the default storage location, you can set the `SEALOS_RUNTIME_ROOT` environment variable and then +run the Sealos command. It is recommended to set this environment variable globally so that it can be conveniently used +in other commands or scenarios. + +```shell +export SEALOS_RUNTIME_ROOT=/data/.sealos +sealos run labring/kubernetes:v1.24.0 +``` + +### Q2: How to modify the default storage location for `/var/lib/sealos`? + +If you need to change the default storage location, you can set the `SEALOS_DATA_ROOT` environment variable and then run +the Sealos command. Similarly, it is recommended to set this environment variable globally. + +```shell +export SEALOS_DATA_ROOT=/data/sealos +sealos run labring/kubernetes:v1.24.0 +``` + +### Q3: How to modify the storage paths for Sealos image data and status? + +> When using the Sealos cluster, you may need to change the default storage paths for image data and status data. By +> default, these data are stored at the locations defined in the `/etc/containers/storage.conf` file. + +1. **View the current storage configuration** + First, you can use the following command to view the current image storage configuration: + ``` + sealos images --debug + ``` + This command will print the file that contains the current storage configuration, for example: + ``` + 2023-06-07T16:27:02 debug using file /etc/containers/storage.conf as container storage config + REPOSITORY TAG IMAGE ID CREATED SIZE + ``` +2. **Modify the storage path for image data** + If you want to change the storage path for image data, you can edit the `/etc/containers/storage.conf` file. In this + file, find and modify the `graphroot` field to set it to the new path. For example: + ``` + vim /etc/containers/storage.conf + ``` + In the editor, modify the value of the `graphroot` field to the desired new path. +3. **Modify the storage + +path for status data** +Similar to the design of Buildah, Sealos also provides the ability to set the storage path for status data. In the same +configuration file `/etc/containers/storage.conf`, find and modify the `runroot` field to the new path. + +By following these steps, you can save the image data and status data of the Sealos cluster to the new paths you set. +Each time you run a Sealos command, it will use the new paths you set in `graphroot` and `runroot` to store the image +data and status data, respectively. + +### Q4: How to disable file md5 check during SSH file transfer? + +When the network environment is good, disabling the md5 check can greatly improve transfer speed. If you don't want to +check the md5 of files during SSH file transfer, you can add the `-o "HashKnownHosts no"` option to the SSH command. + +```shell +scp -o "HashKnownHosts no" local_file remote_user@remote_ip:/path/to/destination +``` + +This option tells SSH not to hash the hostnames in the known_hosts file, which avoids the md5 check during file +transfer. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md new file mode 100644 index 00000000000..3fd51a4e1d1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md @@ -0,0 +1,98 @@ +--- +sidebar_position: 2 +keywords: [Sealos image building, registry sync, image caching, skopeo copy, lightweight registry] +description: Learn how to enhance Sealos image building with registry sync and skopeo copy for efficient and lightweight image caching. +--- + +# Guide to Image Building Improvement + +## Deep Understanding of Sealos Image Building + +To understand the work behind Sealos image building, we will first reveal what operations it actually performs at the +underlying level. Here is an intuitive architectural diagram: + +![](images/build.png) + +Sealos covers the following core steps in the image building process: + +- **Cache images**: Parse the working directory during the build execution (here we call it the "context" directory), + save the cache image to the registry structure, and store it in the ./registry directory. +- **Build images**: Build images in the context directory and generate new images. (Please note, you need to copy the + ./registry directory when building images.) + +## Enhancing Image Building Efficiency + +In the current project, we have borrowed the source code of `github.com/distribution/distribution`. During the process +of caching images, we directly call the registry's sdk and start the registry-proxy function. With the caching ability +of the image repository, we cache the image and store it in the context/registry directory. + +The key to this process is to call the method of the distribution repository to save the image: + +- Start the registry-proxy function. +- Save image digest and related index data (by calling the saveManifestAndGetDigest method). +- Save image file data (by calling the saveBlobs method). + +This method does have some significant advantages: + +- Lightweight: Images can be saved without relying on other components. +- Free control: You can freely control the save logic without relying on third-party components. + +However, we have also noticed some potential problems: + +- For beginners, the code is difficult to understand and the logic here is not easy to grasp. +- Unable to cache using the token authentication method. +- Need to rely on some temporary storage space, which requires space. + +Considering these issues, we decided to try a new mode: start a lightweight registry locally and use the sdk of +`skopeo copy` for code reuse. This change directly solves all the previous problems. + +![](images/registry-build.png) + +**Therefore, the new construction method ✨Image Repository Sync✨ gracefully debuts 🎉🎉** + +The [#3154](https://github.com/labring/sealos/pull/3154) PR in the official repository has completed the implementation +of this feature. Currently, Sealos supports these two ways of image construction. Next, I will introduce how to start +the new feature (if the new feature performs stably, we may abandon the old construction method). + +## How to Start the New Feature + +> Sealos v4.3.0 and later versions support this function by default. + +Starting the new feature is very simple, just add an environment variable before you build the image. This feature +supports both build and merge commands. + +```shell +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t test . +``` + +Here is the expected output after executing the above command: + +```tex +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t test . +Getting image source signatures +Copying blob fee740108510 done +Copying config f92f3ea6e4 done +Writing manifest to image destination +Storing signatures +Getting image source signatures +Copying blob 08409d417260 done +Copying config 44dd6f2230 done +Writing manifest to image destination +Storing signatures +2023-06-01T13:16:07 info saving images busybox, alpine +STEP 1/2: FROM scratch +STEP 2/2: COPY registry ./registry +COMMIT test +Getting image source signatures +Copying blob 13ab73c881c8 done +Copying config 4e22d16b36 done +Writing manifest to image destination +Storing signatures +--> 4e22d16 + +b366 +Successfully tagged localhost/test:latest +4e22d16b366e9fec25641522a74cbd73a7db67dc0516b8f8e00200c4d0551592 +``` + +I hope the above content can help you better understand and use Sealos's new image building method. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md new file mode 100644 index 00000000000..096fc72c0f5 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md @@ -0,0 +1,794 @@ +--- +sidebar_position: 5 +keywords: [dual-stack cluster, Calico, Kubernetes, IPv6, Sealos, cluster configuration, Kubernetes networking, VXLAN, kubeadm, Kubernetes setup] +description: Learn how to install a dual-stack cluster with Calico on Kubernetes using Sealos. Follow our guide for configuring IPv6 and IPv4 networking. +--- + +# install Dual-stack cluster with Calico + +1. Prerequisites: + - Sealos version >=4.3.0 + - The hosts can communicate using both IPv6 and IPv4 addresses. + - Calico adopts the VXLAN mode,the kernel version must be >= 3.12 。 refer + to [official docs](https://github.com/cyclinder/kubespray/blob/042c960c6617f8a360a8281464ff63f99ee2471c/docs/calico.md) +2. run`sealos gen` to generate a Clusterfile, for example: + +```shell +$ sealos gen labring/kubernetes:v1.26.1 labring/helm:v3.10.3 labring/calico:v3.25.0 --masters 192.168.0.10 --nodes 192.168.0.11 --passwd "xxx" >Clusterfile +``` + +Notice: labring/helm should be set before labring/calico. + +The generated Clusterfile is as follows: + +

+Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.10:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.11:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.26.1 + - labring/helm:v3.10.3 + - labring/calico:v3.25.0 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 +status: {} + +--- +BootstrapTokens: null +CertificateKey: "" +LocalAPIEndpoint: + AdvertiseAddress: 192.168.0.10 + BindPort: 6443 +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: InitConfiguration + +--- +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + ExtraArgs: + audit-log-format: json + audit-log-maxage: "7" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/kubernetes/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yml + enable-aggregator-routing: "true" + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + TimeoutForControlPlane: null +CIImageRepository: "" +CIKubernetesVersion: "" +CertificatesDir: "" +ClusterName: "" +ComponentConfigs: null +ControlPlaneEndpoint: apiserver.cluster.local:6443 +ControllerManager: + ExtraArgs: + bind-address: 0.0.0.0 + cluster-signing-duration: 876000h + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +DNS: + ImageRepository: "" + ImageTag: "" + Type: "" +Etcd: + External: null + Local: + DataDir: "" + ExtraArgs: + listen-metrics-urls: http://0.0.0.0:2381 + ImageRepository: "" + ImageTag: "" + PeerCertSANs: null + ServerCertSANs: null +FeatureGates: null +ImageRepository: "" +KubernetesVersion: v1.26.1 +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10 + ServiceSubnet: 10.96.0.0/22 +Scheduler: + ExtraArgs: + bind-address: 0.0.0.0 + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration + +--- +CACertPath: /etc/kubernetes/pki/ca.crt +ControlPlane: + CertificateKey: "" + LocalAPIEndpoint: + AdvertiseAddress: "" + BindPort: 6443 +Discovery: + BootstrapToken: null + File: null + TLSBootstrapToken: "" + Timeout: 5m0s +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: JoinConfiguration + +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +bindAddress: 0.0.0.0 +bindAddressHardFail: false +clientConnection: + acceptContentTypes: "" + burst: 10 + contentType: application/vnd.kubernetes.protobuf + kubeconfig: "" + qps: 5 +clusterCIDR: "" +configSyncPeriod: 15m0s +conntrack: + maxPerCore: 32768 + min: 131072 + tcpCloseWaitTimeout: 1h0m0s + tcpEstablishedTimeout: 24h0m0s +detectLocal: + bridgeInterface: "" + interfaceNamePrefix: "" +detectLocalMode: "" +enableProfiling: false +healthzBindAddress: 0.0.0.0:10256 +hostnameOverride: "" +iptables: + masqueradeAll: false + masqueradeBit: 14 + minSyncPeriod: 1s + syncPeriod: 30s +ipvs: + excludeCIDRs: + - 10.103.97.2/32 + minSyncPeriod: 0s + scheduler: "" + strictARP: false + syncPeriod: 30s + tcpFinTimeout: 0s + tcpTimeout: 0s + udpTimeout: 0s +kind: KubeProxyConfiguration +metricsBindAddress: 0.0.0.0:10249 +mode: ipvs +nodePortAddresses: null +oomScoreAdj: -999 +portRange: "" +showHiddenMetricsForVersion: "" +udpIdleTimeout: 250ms +winkernel: + enableDSR: false + forwardHealthCheckVip: false + networkName: "" + rootHnsEndpointName: "" + sourceVip: "" + +--- +address: 0.0.0.0 +apiVersion: kubelet.config.k8s.io/v1beta1 +authentication: + anonymous: + enabled: false + webhook: + cacheTTL: 2m0s + enabled: true + x509: + clientCAFile: /etc/kubernetes/pki/ca.crt +authorization: + mode: Webhook + webhook: + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s +cgroupDriver: cgroupfs +cgroupsPerQOS: true +clusterDomain: cluster.local +configMapAndSecretChangeDetectionStrategy: Watch +containerLogMaxFiles: 5 +containerLogMaxSize: 10Mi +contentType: application/vnd.kubernetes.protobuf +cpuCFSQuota: true +cpuCFSQuotaPeriod: 100ms +cpuManagerPolicy: none +cpuManagerReconcilePeriod: 10s +enableControllerAttachDetach: true +enableDebugFlagsHandler: true +enableDebuggingHandlers: true +enableProfilingHandler: true +enableServer: true +enableSystemLogHandler: true +enforceNodeAllocatable: +- pods +- pods +eventBurst: 10 +eventRecordQPS: 5 +evictionHard: + imagefs.available: 15% + memory.available: 100Mi + nodefs.available: 10% + nodefs.inodesFree: 5% +evictionPressureTransitionPeriod: 5m0s +failSwapOn: true +fileCheckFrequency: 20s +hairpinMode: promiscuous-bridge +healthzBindAddress: 0.0.0.0 +healthzPort: 10248 +httpCheckFrequency: 20s +imageGCHighThresholdPercent: 85 +imageGCLowThresholdPercent: 80 +imageMinimumGCAge: 2m0s +iptablesDropBit: 15 +iptablesMasqueradeBit: 14 +kind: KubeletConfiguration +kubeAPIBurst: 10 +kubeAPIQPS: 5 +localStorageCapacityIsolation: true +logging: + flushFrequency: 5000000000 + format: text + options: + json: + infoBufferSize: "0" + verbosity: 0 +makeIPTablesUtilChains: true +maxOpenFiles: 1000000 +maxPods: 110 +memoryManagerPolicy: None +memorySwap: {} +memoryThrottlingFactor: 0.8 +nodeLeaseDurationSeconds: 40 +nodeStatusMaxImages: 50 +nodeStatusReportFrequency: 10s +nodeStatusUpdateFrequency: 10s +oomScoreAdj: -999 +podPidsLimit: -1 +port: 10250 +registerNode: true +registryBurst: 10 +registryPullQPS: 5 +rotateCertificates: true +runtimeRequestTimeout: 2m0s +seccompDefault: false +serializeImagePulls: true +shutdownGracePeriod: 0s +shutdownGracePeriodCriticalPods: 0s +staticPodPath: /etc/kubernetes/manifests +streamingConnectionIdleTimeout: 4h0m0s +syncFrequency: 1m0s +topologyManagerPolicy: none +topologyManagerScope: container +volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ +volumeStatsAggPeriod: 1m0s +``` + +
+ +3. After generating the Clusterfile, modify the cluster configuration.to add IPv6 pod and svc CIDR 。Here's use the fd85: + ee78:d8a6:8607::1:0000/112、fd85:ee78:d8a6:8607::1000/116 as a example。The main modifications are as follows: + +
+Clusterfile + +```yaml +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112 #add pod IPv6 subnet + ServiceSubnet: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 #add svc IPv6 subnet +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + - 2001:db8::f816:3eff:fe8c:910a #The IPv6 address of the control node,If you need to access the APIserver using this IP,add it. + ExtraArgs: + service-cluster-ip-range: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 #add svc IPv6 subnet +ControllerManager: + ExtraArgs: + node-cidr-mask-size-ipv6: 120 #Default to 64 + node-cidr-mask-size-ipv4: 24 #Default to 24 +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +kind: KubeProxyConfiguration +clusterCIDR: "100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112" #add pod IPv6 subnet +--- +# add configure dual stack for calico +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + bgp: Disabled + ipPools: + - blockSize: 22 + cidr: 100.64.0.0/10 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + - blockSize: 122 + cidr: fd85:ee78:d8a6:8607::1:0000/112 #add pod IPv6 subnet + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*|em.*" + nodeAddressAutodetectionV6: + interface: "eth.*|en.*|em.*" +``` + +
+ +The final Clusterfile would look like this: + +
+Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.10:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.11:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.26.1 + - labring/helm:v3.10.3 + - labring/calico:v3.25.0 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 +status: {} + +--- +BootstrapTokens: null +CertificateKey: "" +LocalAPIEndpoint: + AdvertiseAddress: 192.168.0.10 + BindPort: 6443 +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: InitConfiguration + +--- +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + - 2001:db8::f816:3eff:fe8c:910a + ExtraArgs: + service-cluster-ip-range: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 + audit-log-format: json + audit-log-maxage: "7" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/kubernetes/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yml + enable-aggregator-routing: "true" + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + TimeoutForControlPlane: null +CIImageRepository: "" +CIKubernetesVersion: "" +CertificatesDir: "" +ClusterName: "" +ComponentConfigs: null +ControlPlaneEndpoint: apiserver.cluster.local:6443 +ControllerManager: + ExtraArgs: + node-cidr-mask-size-ipv6: 120 + node-cidr-mask-size-ipv4: 24 + bind-address: 0.0.0.0 + cluster-signing-duration: 876000h + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +DNS: + ImageRepository: "" + ImageTag: "" + Type: "" +Etcd: + External: null + Local: + DataDir: "" + ExtraArgs: + listen-metrics-urls: http://0.0.0.0:2381 + ImageRepository: "" + ImageTag: "" + PeerCertSANs: null + ServerCertSANs: null +FeatureGates: null +ImageRepository: "" +KubernetesVersion: v1.26.1 +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112 + ServiceSubnet: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 +Scheduler: + ExtraArgs: + bind-address: 0.0.0.0 + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration + +--- +CACertPath: /etc/kubernetes/pki/ca.crt +ControlPlane: + CertificateKey: "" + LocalAPIEndpoint: + AdvertiseAddress: "" + BindPort: 6443 +Discovery: + BootstrapToken: null + File: null + TLSBootstrapToken: "" + Timeout: 5m0s +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: JoinConfiguration + +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +bindAddress: 0.0.0.0 +bindAddressHardFail: false +clientConnection: + acceptContentTypes: "" + burst: 10 + contentType: application/vnd.kubernetes.protobuf + kubeconfig: "" + qps: 5 +clusterCIDR: "" +configSyncPeriod: 15m0s +conntrack: + maxPerCore: 32768 + min: 131072 + tcpCloseWaitTimeout: 1h0m0s + tcpEstablishedTimeout: 24h0m0s +detectLocal: + bridgeInterface: "" + interfaceNamePrefix: "" +detectLocalMode: "" +enableProfiling: false +healthzBindAddress: 0.0.0.0:10256 +hostnameOverride: "" +iptables: + masqueradeAll: false + masqueradeBit: 14 + minSyncPeriod: 1s + syncPeriod: 30s +ipvs: + excludeCIDRs: + - 10.103.97.2/32 + minSyncPeriod: 0s + scheduler: "" + strictARP: false + syncPeriod: 30s + tcpFinTimeout: 0s + tcpTimeout: 0s + udpTimeout: 0s +kind: KubeProxyConfiguration +clusterCIDR: "100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112" +metricsBindAddress: 0.0.0.0:10249 +mode: ipvs +nodePortAddresses: null +oomScoreAdj: -999 +portRange: "" +showHiddenMetricsForVersion: "" +udpIdleTimeout: 250ms +winkernel: + enableDSR: false + forwardHealthCheckVip: false + networkName: "" + rootHnsEndpointName: "" + sourceVip: "" + +--- +address: 0.0.0.0 +apiVersion: kubelet.config.k8s.io/v1beta1 +authentication: + anonymous: + enabled: false + webhook: + cacheTTL: 2m0s + enabled: true + x509: + clientCAFile: /etc/kubernetes/pki/ca.crt +authorization: + mode: Webhook + webhook: + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s +cgroupDriver: cgroupfs +cgroupsPerQOS: true +clusterDomain: cluster.local +configMapAndSecretChangeDetectionStrategy: Watch +containerLogMaxFiles: 5 +containerLogMaxSize: 10Mi +contentType: application/vnd.kubernetes.protobuf +cpuCFSQuota: true +cpuCFSQuotaPeriod: 100ms +cpuManagerPolicy: none +cpuManagerReconcilePeriod: 10s +enableControllerAttachDetach: true +enableDebugFlagsHandler: true +enableDebuggingHandlers: true +enableProfilingHandler: true +enableServer: true +enableSystemLogHandler: true +enforceNodeAllocatable: +- pods +- pods +eventBurst: 10 +eventRecordQPS: 5 +evictionHard: + imagefs.available: 15% + memory.available: 100Mi + nodefs.available: 10% + nodefs.inodesFree: 5% +evictionPressureTransitionPeriod: 5m0s +failSwapOn: true +fileCheckFrequency: 20s +hairpinMode: promiscuous-bridge +healthzBindAddress: 0.0.0.0 +healthzPort: 10248 +httpCheckFrequency: 20s +imageGCHighThresholdPercent: 85 +imageGCLowThresholdPercent: 80 +imageMinimumGCAge: 2m0s +iptablesDropBit: 15 +iptablesMasqueradeBit: 14 +kind: KubeletConfiguration +kubeAPIBurst: 10 +kubeAPIQPS: 5 +localStorageCapacityIsolation: true +logging: + flushFrequency: 5000000000 + format: text + options: + json: + infoBufferSize: "0" + verbosity: 0 +makeIPTablesUtilChains: true +maxOpenFiles: 1000000 +maxPods: 110 +memoryManagerPolicy: None +memorySwap: {} +memoryThrottlingFactor: 0.8 +nodeLeaseDurationSeconds: 40 +nodeStatusMaxImages: 50 +nodeStatusReportFrequency: 10s +nodeStatusUpdateFrequency: 10s +oomScoreAdj: -999 +podPidsLimit: -1 +port: 10250 +registerNode: true +registryBurst: 10 +registryPullQPS: 5 +rotateCertificates: true +runtimeRequestTimeout: 2m0s +seccompDefault: false +serializeImagePulls: true +shutdownGracePeriod: 0s +shutdownGracePeriodCriticalPods: 0s +staticPodPath: /etc/kubernetes/manifests +streamingConnectionIdleTimeout: 4h0m0s +syncFrequency: 1m0s +topologyManagerPolicy: none +topologyManagerScope: container +volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ +volumeStatsAggPeriod: 1m0s +--- +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + bgp: Disabled + ipPools: + - blockSize: 22 + cidr: 100.64.0.0/10 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + - blockSize: 122 + cidr: fd85:ee78:d8a6:8607::1:0000/112 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*|em.*" + nodeAddressAutodetectionV6: + interface: "eth.*|en.*|em.*" +``` + +
+ +4. run`sealos apply -f Clusterfile` to install the cluster。 + +5. More refer to [Calico official docs](https://docs.tigera.io/calico/latest/networking/ipam/ipv6) + and [k8s offical docs](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/dual-stack-support/) + diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md new file mode 100644 index 00000000000..44bd22021fc --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md @@ -0,0 +1,133 @@ +--- +sidebar_position: 1 +keywords: [Sealos image building, directory structure, Kubernetes yaml files, Helm chart, Kubefile] +description: Learn how to build Sealos images with a standardized directory structure, including Kubernetes yaml files and Helm charts, for efficient and error-free management. +--- + +# Image Building and Standard Directory Configuration + +Before embarking on Sealos image building tasks, we suggest first constructing a directory structure that conforms to +standards. This makes the building process more standardized, easier to manage, and reduces the likelihood of errors. +This article will guide you in detail on how to create such a directory structure and explain the purpose of each +directory. + +## Directory Structure Example + +A complete, standardized directory structure example is as follows: + +```shell +. +├── charts +│   └── nginx +│   ├── Chart.lock +│   ├── charts +│   ├── Chart.yaml +│   ├── README.md +│   ├── templates +│   ├── values.schema.json +│   └── values.yaml +├── images +│   └── shim +│   └── nginxImages +├── init.sh +├── Kubefile +├── manifests +│   └── nginx +│   ├── deployment.yaml +│   ├── ingress.yaml +│   └── service.yaml +├── opt +│   └── helm +└── registry +``` + +## Directory Descriptions + +Each directory plays a specific role during the build process, and their detailed descriptions are as follows: + +- `Kubefile` (required): This file is similar to Dockerfile and is the core file for image building. It defines various + steps in the build process, such as the selection of the base image, setting of environment variables, file copying, + etc. +- `manifests`: This directory is used to store Kubernetes yaml files, which describe the configuration information of + your applications, such as Pod, Service, Deployment configurations. +- `charts`: This directory is used to store Helm chart files. Helm chart is a package management tool for Kubernetes + that simplifies the deployment and management of Kubernetes applications. +- `images/shim`: This directory is used to store images that cannot be automatically extracted from yaml files or Helm + charts. During the build process, sealos will automatically pull these images. +- `opt`: Binary files are stored here. +- `registry`: This directory is used to store images pulled locally during the build process. During the build process, + this directory will be automatically generated, and there is no need to manually create it. +- `init.sh`: This script is automatically run by GitHub Action during the build process. You can write some automated + tasks in this script, such as initializing the environment, preprocessing data, etc. (Following the rules + of [cluster-image](https://github.com/labring-actions/cluster-image)) + +## Kubefile Parameters + +The `Kubefile` file is at the core of image building and supports various parameters. Below is a detailed analysis of +these parameters: + +```shell +FROM labring/kubernetes:v1.24.0 +ENV version v1.1.0 +COPY manifests ./manifests +COPY registry ./registry +ENTRYPOINT ["kubectl apply -f manifests/tigera-operator.yaml"] +CMD ["kubectl apply -f manifests/custom-resources.yaml"] +``` + +Descriptions of each parameter: + +- `FROM`: This directive is used to set the base image for building. All build steps are based on this image. +- `LABEL`: `LABEL` defines some internal configurations of the sealos cluster image. + - `check`: Some check scripts operation before the cluster image runs. + - `clean`: Cleanup scripts for cluster reset or node deletion. + - `clean-registry`: The script to clean the image repository when the cluster is reset. + - `image`: The lvscare image address of the cluster (Sealos's IPVS image). + - `init`: Cluster initialization script. + + +- `init-registry`: The script to start the container image repository when initializing the cluster. + - `sealos.io.type`: Cluster image type, currently mainly rootfs, application, and patch. + - Rootfs is the basic image for running the cluster, such as Kubernetes, Kubernetes-docker, which includes + images, binaries, etc. required by the cluster (**required for each node**). + - Application is the application image, such as calico, helm, istio, etc. application service images. (**only + stored on the master0 node**) + - Patch is needed to adjust after the rootfs image. It is another way to modify the rootfs image (**another + method is the Config method**), it will overwrite the first image of the default cluster running. + - `sealos.io.version`: The version number of the image, currently the opened version is v1beta1. + - `version`: The version number of the cluster, currently it's the version number of Kubernetes. + - `vip`: It's the VIP address for modifying the IPVS virtual IP. +- `ENV`: The `ENV` directive sets the environment variable `` to the value ``. (There will be some default + environment variables in rootfs, which can modify some default parameters in rootfs, such as the username and password + of the image repository, the storage directory of docker, containerd, etc.) + + For specific cluster images, you need to inspect it specifically, check the corresponding environment variables with + `sealos inspect` image, different versions of the image have slight differences. + - SEALOS_SYS_CRI_ENDPOINT: The criSocket of the current cluster image (different types of cluster images may be + different). + - criData: Data directory of cri. + - defaultVIP: Default VIP address. + - disableApparmor: Whether to disable apparmor (containerd has this issue). + - registryConfig: Configuration directory of the container image repository. + - registryData: Data directory of the container image repository (because it's the directory that has been mounted, + this configuration actually has no practical significance, it's actually stored under /var/lib/sealos). + - registryDomain: The default domain of the image repository. + - registryPassword: The password of the default image repository. + - registryPort: The password of the default image repository. + - registryUsername: The account of the default image repository. + - sandboxImage: Default sandbox_image for cri to start. (No need to write repo, just need to write image name, eg: + pasue:3.7). +- `COPY`: The `COPY` directive copies new files or directories from `` and adds them to the file system path + `` on the container. (**Note that the registry directory needs to be copied, otherwise the cluster has no + container images**) +- `ENTRYPOINT`: This directive is used to set the startup command for the image. When the image starts, this command + will be executed. +- `CMD`: This directive is also used to set the startup command for the image. However, the difference between it and + the ENTRYPOINT directive is that if users provide a startup command when running the image (`sealos run --cmd`), the + command in the CMD directive will be overridden. + +During the build process, Sealos will also automatically set some built-in environment variables, including (environment +variables with the prefix 'SEALOS_SYS' cannot be modified): + +- SEALOS_SYS_KUBE_VERSION: The version number of Kubernetes, for example v1.26.0 +- SEALOS_SYS_SEALOS_VERSION: The version number of Sealos, for example 4.1.3. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/build.png b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/build.png new file mode 100644 index 00000000000..d1ae7d6aead Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/build.png differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png new file mode 100644 index 00000000000..485b531d28f Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png new file mode 100644 index 00000000000..70ef65ffa13 Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/sealos-run.md b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/sealos-run.md new file mode 100644 index 00000000000..d32958c50df --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/sealos-run.md @@ -0,0 +1,151 @@ +--- +sidebar_position: 2 +keywords: [Sealos run, Kubernetes deployment, cluster management, Kubernetes images, node synchronization] +description: Learn how the Sealos run command simplifies Kubernetes deployment with detailed steps on node checks, image pulling, configuration rendering, and more. +--- + +# How Sealos Run Works + +Below is a detailed explanation of how the `sealos run` command works. To aid understanding, we break it down into nine +main steps. + +## 1. Execution of Command + +Firstly, users launch Sealos by executing the following command: + +```bash +sealos run kubernetes:v1.23.8 +``` + +## 2. Execution of Pipeline + +After the command is executed, Sealos starts to execute a series of related operational steps, which we call the " +Pipeline". This process includes the following substeps: + +### 2.1 Node Check + +Sealos will check all nodes to ensure they are available. For example, checking for duplicate hostnames, and whether the +time of all nodes has been synchronized. + +### 2.2 Pulling Images + +Next, Sealos pulls the Kubernetes images from the remote repository and loads them into local storage. + +### 2.3 Configuration Rendering + +Then, Sealos renders the configuration of the pulled image's rootfs (file system) to prepare for the subsequent node +distribution. + +### 2.4 Distribution of Image Files + +Once the configuration rendering is complete, Sealos distributes the rendered rootfs files to each node. + +### 2.5 Distribution of Registry Directory + +In addition, Sealos also distributes the registry directory in the image to the corresponding registry role nodes. +Sealos supports two modes: + +- **scp mode**: Directly copy the directory to each node via scp, which consumes a lot of network bandwidth. +- **Image synchronization mode**: Using the skopeo sdk's image synchronization mechanism, incremental image + synchronization can be achieved to save network bandwidth. This feature can be enabled with the environment variable + `SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true`. + +### 2.6 Execution of Bootstrap + +Bootstrap is a crucial step, including the following operations: + +#### 2.6.1 Addition of Host Resolution + +Sealos adds host resolution for the registry on each node. + +#### 2.6.2 Execution of Registry-Init Script + +After adding host resolution, Sealos executes the registry-init script. + +#### 2.6.3 Execution of Init Script + +Finally, Sealos executes the init script to start the Kubernetes service. + +## 3. Execution of InitMaster0 + +After the Pipeline execution, Sealos enters the InitMaster0 phase. In this phase, Sealos performs the following +operations: + +### 3.1 Generation of Kubeadm Configuration + +Firstly, Sealos generates the initialization configuration file for Kubeadm. + +### 3.2 Generation and Distribution of Certificate Files + +Then, Sealos generates all certificate files for the cluster and distributes them to each node. + +### 3.3 Initialization of Master0 + +Finally, Sealos executes `kubeadm init` to initialize the Master0 node. + +## 4. Execution of JoinMaster + +After the initialization of the Master0 node, Sealos enters the JoinMaster phase. In this phase, Sealos performs the +following operations: + +### 4.1 Synchronization of Kubeconfig + +Firstly, Sealos synchronizes the Kubeconfig file to each node. + +### 4.2 Synchronization of Certificate Files + +Next, Sealos synchronizes certificate files to each node. + +### 4.3 Generation of Join Configuration + +Then, Sealos generates the JoinMaster configuration file. + +### 4.4 Generation of Join Token + +Next, Sealos generates the Join token. + +### 4.5 Execution of Join Master Process + +Finally, Sealos executes the `kubeadm join` process to add other Master nodes to the cluster. + +## 5. Execution of JoinNode + +After all Master nodes have joined the cluster, Sealos enters + +the JoinNode phase and performs the following operations: + +### 5.1 Generation of Join Token + +Firstly, Sealos generates the Join token again. + +### 5.2 Generation of IPVS Rules + +Then, Sealos generates IPVS rules. + +### 5.3 Generation of Join Configuration + +Next, Sealos generates the JoinNode configuration again. + +### 5.4 Execution of Join Node Process + +Finally, Sealos executes the Join Node process to add Worker nodes to the cluster. + +## 6. Synchronization of IPVS + +After all nodes have joined the cluster, Sealos synchronizes the IPVS rules of the Master to all nodes. This is mainly +done through the lvscare static pod, which synchronizes the static pod configuration based on the number of Master +nodes. + +## 7. Execution of Guest Phase + +After the IPVS rules are synchronized, Sealos executes the Guest phase. This is the stage to execute the cluster image +command. + +## 8. Writing to the Clusterfile + +Finally, Sealos writes the final execution result to the Clusterfile. + +This is how the `sealos run` command works. Through this article, we hope that you have a deeper understanding of the +`sealos run` command. Below is the panorama we mentioned to help you better understand the entire process. + +![](images/sealos-run.png) diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/template-function.md b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/template-function.md new file mode 100644 index 00000000000..e5b84faa52e --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/advanced-guide/template-function.md @@ -0,0 +1,72 @@ +--- +sidebar_position: 9 +keywords: [Sealos, template rendering, Kubernetes, image building, template functions, configuration files, semantic versioning, Golang templates, cluster image, Kubernetes manifests] +description: Learn how Sealos enhances image building with template rendering and functions for Kubernetes configurations, scripts, and manifests. +--- + +# Template Inclusion and Function Enhancement + +In the image building process of Sealos, files with the "tmpl" extension under the "etc", "scripts", and "manifests" +directories are specially treated. + +1. "etc" directory: This directory is usually used to store configuration files. During the build process, Sealos will + render the files with the "tmpl" extension in this directory. The files, once rendered, are copied to the + corresponding directory of the cluster image. + +2. "scripts" directory: This directory is usually used to store execution scripts. Sealos will render the files with + the "tmpl" extension in this directory. The generated scripts will be executed during the cluster image build + process. + +3. "manifests" directory: This directory is usually used to store Kubernetes resource manifest files. Sealos will render + the files with the "tmpl" extension in this directory. The generated manifest files will be applied to the Kubernetes + cluster during the cluster image build process. + +In summary, files with the "tmpl" extension in these three directories are treated as template files during the image +build process of Sealos. This approach provides more flexibility, allowing us to dynamically generate configurations, +scripts, or Kubernetes resource manifests during the build process. + +When building an image, we support `template` to allow maintainers to fully control the generated configuration files ( +module rendering). For example: + +```yaml +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +``` + +Please refer to Golang's [text/template](https://pkg.go.dev/text/template) for a basic introduction and more details. + +## Template Function Enhancement + +In addition, we support `templateFunc` to enhance template functions. For example: + +```yaml +shim: /var/run/image-cri-shim.sock +cri: /run/containerd/containerd.sock +address: http://{{ .registryDomain }}:{{ .registryPort }} +force: true +debug: false +image: /var/lib/image-cri-shim +{{ if and (ne .SEALOS_SYS_KUBE_VERSION "") (semverCompare "^1.26.0" .SEALOS_SYS_KUBE_VERSION) }}version: v1{{ else }}version: v1alpha2{{ end }} +timeout: 15m +auth: {{ .registryUsername }}:{{ .registryPassword }} +``` + +Here we use `semverCompare` to check whether the user is running on k8s version v1.26.0 or above. If so, generate +`version: v1`, otherwise generate `version: v1alpha2`. With this support, we can easily manage multiple versions of +Kubernetes support with a single cluster image file. + +### Some Most Commonly Used Template Functions + +* [semverCompare](http://masterminds.github.io/sprig/semver.html) compares semantic versions, not string comparisons. +* [default](http://masterminds.github.io/sprig/defaults.html) default can provide a default value when a value is empty + or undefined. +* [toYaml](https://github.com/labring/sealos/blob/main/pkg/template/funcmap.go#L66) displays the current value (object, + map, array) as a yaml formatted string. + +For a complete list of supported functions, [click here](http://masterminds.github.io/sprig/). diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/images/sealos.webp b/docs/5.0/docs/developer-guide/lifecycle-management/images/sealos.webp new file mode 100644 index 00000000000..0cc05e478e9 Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/images/sealos.webp differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/lifecycle-management.md b/docs/5.0/docs/developer-guide/lifecycle-management/lifecycle-management.md new file mode 100644 index 00000000000..81e46c7d4ed --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/lifecycle-management.md @@ -0,0 +1,107 @@ +--- +sidebar_position: 0 +keywords: [Sealos, cloud operating system, Kubernetes clusters, cloud-native applications, cluster management, container management, image management, cluster images, Sealos user guide, Rootfs cluster images] +description: Explore Sealos, a unified cloud OS for managing Kubernetes clusters and cloud-native apps. Learn about cluster management, containers, and images with our comprehensive user guide. +--- + +# Kubernetes Lifecycle Management + +Sealos provides a powerful set of tools that allow users to easily manage the entire lifecycle of a cluster. + +## Features + +With Sealos, you can install a bare Kubernetes cluster without any components. Additionally, Sealos can assemble various +upper-layer distributed applications on top of Kubernetes using cluster image capabilities, such as databases, message +queues, and more. + +Sealos not only allows you to install a single-node Kubernetes development environment but also enables you to build +production-grade highly available clusters with thousands of nodes. + +Sealos offers features like cluster scaling, backup and recovery, and cluster release. It provides an excellent +Kubernetes runtime experience even in offline environments. + +## Key Features + +- ARM support. Offline packages v1.20 and above support integration with both containerd and Docker. +- Provides 99-year certificates and supports cluster backup and upgrade. +- Does not rely on Ansible, HAProxy, or Keepalived. It is a standalone binary tool with zero dependencies. +- Provides offline installation. Different versions of Kubernetes only require different cluster images. +- High availability is achieved through localLB based on IPVS, which consumes fewer resources and provides stability and + reliability, similar to kube-proxy implementation. +- Automatically recognizes image names using image-cri-shim, making offline delivery more convenient. +- Almost compatible with all x86_64 architectures that support systemd. +- Easy addition/deletion of cluster nodes. +- Trusted by tens of thousands of users in production environments, stable and reliable. +- Supports cluster images, allowing you to customize and combine the cluster components you need, such as OpenEBS + storage + database + MinIO object storage. +- Uses the SDK of Buildah to standardize the image format, fully compatible with OCI standards. + +## Running a Kubernetes Cluster with Sealos + +Running a Kubernetes cluster with Sealos is straightforward. Just follow these steps: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v4.3.0/scripts/install.sh \ + | sh -s v4.3.0 labring/sealos +# Create a cluster +$ sealos run labring/kubernetes:v1.25.0-4.2.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \ + --masters 192.168.64.2,192.168.64.22,192.168.64.20 \ + --nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd] +``` + +[![asciicast](https://asciinema.org/a/519263.svg)](https://asciinema.org/a/519263?speed=3) + +## Running Distributed Applications on the Cluster + +With the `sealos run` command, you can run various distributed applications on the cluster, such as databases, message +queues, AI capabilities, and even enterprise-level SaaS software. For example: + +```shell +# MySQL cluster +$ sealos run labring/mysql-operator:8.0.23-14.1 + +# Clickhouse cluster +$ sealos run labring/clickhouse:0.18.4 + +# Redis cluster +$ sealos run labring/redis-operator:3.1.4 +``` + +## Customizing the Cluster + +For cluster images not available in the Sealos ecosystem, users can easily build and customize their own cluster images. +For example: + +[Building an Ingress Cluster Image](/self-hosting/lifecycle-management/quick-start/build-ingress-cluster-image.md) + +You can also customize your own Kubernetes cluster: + +Sealfile: + +```shell +FROM kubernetes:v1.25.0 +COPY flannel-chart . +COPY mysql-chart . +CMD ["helm install flannel flannel-chart", "helm install mysql mysql-chart"] +``` + +```shell +sealos build -t my-kubernetes:v1.25.0 . +sealos run my-kubernetes:v1.25.0 ... +``` + +## Frequently Asked Questions + +**Is Sealos a Kubernetes installation tool?** + +Installation and deployment are basic functions of Sealos, similar to the boot module in a single-node operating system. +Sealos' boot module effectively manages the lifecycle of Kubernetes in any scenario. + +**What are the differences between Sealos, Rancher, and KubeSphere?** + +Sealos is designed with the philosophy of "simplifying complexity, freely assembling, and simplicity as the ultimate +goal." Sealos leverages the capabilities of Kubernetes to provide users with exactly what they need in a simple way. +Users may not necessarily need Kubernetes; what they need is specific functionality. + +Sealos is highly flexible and does not impose additional burdens on users. Its form depends on user requirements and the +applications being installed. The core of Sealos is distributed applications, and all applications are treated equally. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md new file mode 100644 index 00000000000..52ef7466d61 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 4 +keywords: [build cluster image, sealos tool, helm binary, create Sealfile, push image DockerHub] +description: Learn how to use the sealos tool to package a binary file like helm into a cluster image, build it, and push it to DockerHub. +--- + +# Building Cluster Images Based on Binary Files + +This document primarily details how to use the `sealos` tool to package a single binary file (like `helm` or +`kustomize`) into a cluster image and install them by deploying the cluster image on the master node. Using `helm` as an +example, we will thoroughly discuss how to package a binary file into a cluster image. + +## Create a Build Workspace + +Firstly, create a base directory to serve as a build workspace: + +```shell +$ mkdir ~/cluster-images +``` + +In the workspace, create an `opt` directory for storing the binary files: + +```shell +$ cd cluster-images +$ mkdir opt/ +``` + +## Prepare the Binary File + +Next, we prepare the `helm` binary file. Here, we download from [github release](https://github.com/helm/helm/releases): + +```shell +wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz +tar -zxvf helm-v3.10.1-linux-amd64.tar.gz +chmod a+x linux-amd64/helm +mv linux-amd64/helm opt/ +``` + +## Create the `Sealfile` Required for Building the Image + +Create a file named `Sealfile`, with the following content: + +```shell +FROM scratch +COPY opt ./opt +CMD ["cp opt/helm /usr/bin/"] +``` + +The current directory structure is as follows: + +``` +. +├── Sealfile +└── opt + └── helm +``` + +## Build the Cluster Image + +Now, everything is ready, and you can begin building the cluster image: + +```shell +sealos build -t labring/helm:v3.10.1 . +``` + +**Note:** Firstly, you need to install the `sealos` command on the local host. + +You can view the build log to understand the building process. + +```shell +root@ubuntu:~/cluster-images# sealos build -t labring/helm:v3.10.1 . +... +``` + +View the built image, and now all the dependent binary files have been built into the cluster image: + +```shell +root@ubuntu:~/cluster-images# sealos images +labring/helm v3.10.1 19ed4a24f0fe 3 minutes ago 45.1 MB +``` + +## Push the Image + +You can push the image to any Docker image repository, the following command pushes the image to DockerHub: + +```shell +sealos push labring/helm:v3.10.1 +``` + +**Note:** Please use the `sealos` command to operate the cluster image; Docker commands are not supported. + +If you are using a private image repository, you can use the `sealos login` command to log into your image repository, +then push or pull the image. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md new file mode 100644 index 00000000000..e2cc8320472 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md @@ -0,0 +1,115 @@ +--- +sidebar_position: 5 +keywords: [build cluster images, go-template, sealos, environment variables, Kubefile, yaml template, helm command, Kubernetes service] +description: Learn how to build cluster images using go-template with sealos, customize environment variables in Kubefile, and render yaml templates for Kubernetes services. +--- + +# Building Cluster Images Based on go-template + +During the process of building cluster images, we can use the `--env` option to pass some variables through the sealos +command line. These environment variables can be used by the `CMD` command of the Kubefile or the yaml file template. + +## Using Environment Variables in Kubefile + +This example defines a `SERVICE_TYPE` variable that allows the user to customize the service exposure type when +installing the application and pass parameters to the helm command in CMD. + +Kubefile example: + +```shell +FROM scratch +ENV SERVICE_TYPE "NodePort" +COPY charts charts +COPY registry registry +CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=$(SERVICE_TYPE)"] +``` + +Run the cluster application and set a custom `SERVICE_TYPE=LoadBalancer`, if not set, it will default to NodePort. + +```shell +sealos run labring/nginx:v1.23.1 --env SERVICE_TYPE=LoadBalancer +``` + +## Using Environment Variables in Yaml Files + +Prepare a simple nginx service yaml file, this file must be a `*.tmpl` extension to be rendered when running +`sealos run --env` command. + +```shell +$ cat manifests/service.yaml.tmpl +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + name: nginx +spec: + type: {{ .serviceType }} + ports: + - port: 80 + nodePort: {{ .http_NodePort }} + name: http + - port: 443 + nodePort: {{ .https_NodePort }} + name: https + selector: + name: nginx +``` + +Here is a Kubefile example where you can set the default environment variables. + +```shell +FROM scratch +ENV serviceType NodePort +ENV http_NodePort 30080 +ENV https_NodePort 30443 + +COPY manifests manifests +COPY registry registry +CMD ["kubectl apply -f manifests/service.yaml"] +``` + +When you build the image, nothing will happen, it only renders when running the application. If `--env` is not set, it +will use the default ENV in Kubefile. + +```shell +sealos run labring/nginx:1.23.1 --env serviceType=LoadBalancer --env http_NodePort=30080 --env https_NodePort=30443 +``` + +You will find that sealos renders a new yaml file `service.yaml` based on `service.yaml.tmpl` on the local path of the +master node. + +**Note** The new version of the application's rootfs is placed in the `/var/lib/sealos/data/default/applications` +directory, each application has its independent directory. + +```shell +root@node1:~# ls /var/lib/sealos/data/default/rootfs/manifests |grep service +service.yaml +service.yaml.tmpl +``` + +Check the yaml content: + +```shell +root@node1:~# cat /var/lib/sealos/data/default/rootfs/manifests/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + name: nginx +spec: + type: NodePort + ports: + - port: 80 + nodePort: 30080 + name: http + - port: 443 + nodePort: 30443 + name: https + selector: + name: nginx +``` + +**Note:** All types of files support this feature (the file name suffix is .tmpl and the build directory is in etc, +scripts, and manifests), you can try it yourself. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md new file mode 100644 index 00000000000..957a26cdab8 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md @@ -0,0 +1,209 @@ +--- +sidebar_position: 3 +keywords: [Helm Charts, build cluster image, Kubernetes, sealos, nginx Helm Charts] +description: Learn how to build a cluster image using Helm Charts with sealos, featuring a step-by-step guide for Kubernetes and nginx Helm Charts. +--- + +# Building Cluster Images Based on Helm Charts + +Let's use the simplest nginx application as an example to introduce how to build a cluster image based on nginx using +Helm Charts. + +## 1. Preparation + +Create a base directory for the build work. + +```shell +$ mkdir ~/cloud-images +``` + +Create a `charts` directory to store the Kubernetes nginx Helm Charts files. + +```shell +$ cd cloud-images +$ mkdir charts +``` + +## 2. Prepare Helm Charts + +Prepare the nginx Helm Charts. Here we use [the official nginx Helm Charts by bitnami](https://bitnami.com/stack/nginx). +Let's pull the Helm Chart files locally and unzip them to the `charts` directory. + +```shell +helm repo add bitnami https://charts.bitnami.com/bitnami +helm search repo bitnami/nginx +helm pull bitnami/nginx --version=13.2.13 -d charts/ --untar +``` + +**Note:** First, you should install the Helm command tool to your local host. + +Now, the structure of the charts directory is as follows: + +``` +charts/ +└── nginx + ├── Chart.lock + ├── charts + ├── Chart.yaml + ├── README.md + ├── templates + ├── values.schema.json + └── values.yaml +``` + +## 3. Create Kubefile + +Create a file named `Kubefile` for image construction: + +```shell +$ cat Kubefile +FROM scratch +COPY charts charts +COPY registry registry +CMD ["helm install nginx charts/nginx --namespace=nginx --create-namespace"] +``` + +It is recommended to use `helm upgrade --install` instead of `helm install` so that you can rerun the same command when +updating the application in the future. + +You can add other options as needed, such as exposing the service through NodePort. + +```shell +FROM scratch +COPY charts charts +COPY registry registry +CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=NodePort"] +``` + +## 4. Build the Cluster Image + +Now everything is ready, and you can start building the cluster image. + +```shell +sealos build -t labring/nginx:v1.23.2 . +``` + +**Note:** You should first install the sealos command to your local host. + +You can view the build log. + +```shell +root@ubuntu:~/cloud-images# sealos build -t labring/nginx:v1.23.2 . +... +``` + +sealos will automatically extract the images from the charts directory, pull them locally, and store them in the +registry directory. + +The current directory structure is as follows: + +```shell +. +├── charts +│ └── nginx +│ ├── Chart.lock +│ ├── charts +│ ├── Chart.yaml +│ ├── README.md +│ ├── templates +│ ├── values.schema.json +│ └── values.yaml +├── Kubefile +└── registry + └── docker + └── registry +``` + +Check the built image locally. Now all dependent deployment manifests and image caches are built into the cluster image. + +```shell +root@ubuntu:~/cloud-images# sealos images +labring/nginx v1.23.2 521c85942ee4 4 minutes ago 56.8 MB +``` + +You can push the image to any Docker image repository. The following command pushes it to Docker Hub. + +```shell +sealos push labring/nginx:v1.23.2 +``` + +**Note:** Please use the sealos command to operate the cluster + +image, Docker commands are not supported. + +If you use a private image repository, just use the `sealos login` command to log in to the registry before pulling or +pushing the image. + +```shell +sealos login docker.io -u xxx -p xxx + +sealos login registry.cn-hangzhou.aliyuncs.com -u xxx -p xxx +``` + +## 5. Install the Cluster Image + +Then, you can run the cluster image in your cluster. + +```shell +sealos run labring/nginx:v1.23.2 +``` + +The helm binary command will be installed on the master node of your Kubernetes cluster. + +```shell +root@ubuntu:~# helm -n nginx ls +``` + +## 6. Explanation + +By default, when building images, sealos only parses the default values.yml file. However, you can also provide a custom +values.yaml file for sealos. + +**The custom values file must be placed in the same directory as your Chart, and must be named in the form +of `.values.yaml`, for example `loki-stack.values.yaml`.** + +```shell +. +├── charts +│ ├── loki-stack +│ │ ├── charts +│ │ ├── Chart.yaml +│ │ ├── README.md +│ │ ├── requirements.lock +│ │ ├── requirements.yaml +│ │ ├── templates +│ │ └── values.yaml +│ └── loki-stack.values.yaml +├── init.sh +├── Kubefile +``` + +The content of `loki-stack.values.yaml` file is as follows: + +```shell +$ cat charts/loki-stack.values.yaml +promtail: + enabled: false +fluent-bit: + enabled: true +grafana: + enabled: true +``` + +Different values files may output different image lists, allowing sealos to automatically parse the images during the +`sealos build` process. + +```shell +$ helm template charts/loki-stack/ -f charts/loki-stack/values.yaml|grep image: + image: "grafana/promtail:2.0.0" + image: "grafana/loki:2.0.0" + image: "bats/bats:v1.1.0" + +$ helm template charts/loki-stack/ -f charts/loki-stack.values.yaml|grep image: + image: "grafana/fluent-bit-plugin-loki:1.6.0-amd64" + image: "kiwigrid/k8s-sidecar:0.1.209" + image: "grafana/grafana:6.7.0" + image: "grafana/loki:2.0.0" + image: "bats/bats:v1.1.0" + image: bats/bats:v1.1.0 +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md new file mode 100644 index 00000000000..cf799c740f5 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md @@ -0,0 +1,84 @@ +--- +sidebar_position: 1 +keywords: [Cluster Images, Image Manifests, Docker Tarballs, Kubernetes, Calico CNI, Image Manifest Support, OCI Container Images, Docker Archive Images] +description: Learn how to build cluster images using image manifests or Docker tarballs with Kubernetes and Calico CNI. Follow our step-by-step guide for seamless image management. +--- + +# Building Cluster Images Based on Image Manifests + +This guide will walk you through the process of building cluster images using image manifests or using existing tarballs +stored in Docker. + +## Building from Image Manifests + +``` +. +├── Kubefile +├── cni +│   ├── custom-resources.yaml +│   └── tigera-operator.yaml +├── images +│   └── shim +│   └── CalicoImageList +└── registry + └── docker + └── registry +``` + +```dockerfile +FROM labring/kubernetes:v1.24.0 +COPY cni ./cni +COPY images ./images +COPY registry ./registry +CMD ["kubectl apply -f cni/tigera-operator.yaml","kubectl apply -f cni/custom-resources.yaml"] +``` + +Explanation: + +The images listed in CalicoImageList will be pulled locally and then applied to the cluster using the `kubectl apply -f` +command. + +The image manifest currently supports the following: + +- Remote images like docker.io/calico/cni:v3.20.0 +- Local OCI container images like containers-storage:docker.io/labring/coredns:v0.0.1 +- Local Docker container images like docker-daemon:docker.io/library/nginx:latest + +## Building from Image Tarballs + +``` +. +├── Kubefile +├── cni +│   ├── custom-resources.yaml +│   └── tigera-operator.yaml +├── images +│   └── skopeo +│   ├── calico.tar +│   └── tar.txt +└── registry + └── docker + └── registry +``` + +```dockerfile +FROM scratch +COPY cni ./cni +COPY images ./images +COPY registry ./registry +CMD ["kubectl apply -f cni/tigera-operator.yaml","kubectl apply -f cni/custom-resources.yaml"] +``` + +Explanation: + +The configurations in tar.txt will be pulled locally and redirected to the image list. Then, they will be applied to the +cluster using the `kubectl apply -f` command. The configuration file format is as follows: + +``` +docker-archive:calico.tar@calico/cni:v3.20.0 +``` + +The image manifest currently supports the following: + +- Docker archive images, supporting a single image, like docker-archive +- OCI archive images, supporting a single image, like oci-archive diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md new file mode 100644 index 00000000000..6d4352761ba --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md @@ -0,0 +1,105 @@ +--- +sidebar_position: 2 +keywords: [build cluster images, deployment manifest, nginx deployment, Kubernetes yaml, sealos build] +description: Learn how to build cluster images based on deployment manifests using a simple nginx application example with Kubernetes yaml and sealos build. +--- + +# Building Cluster Images Based on Deployment Manifest + +This document will detail how to build cluster images based on Deployment Manifests. We will use a simple nginx +application as an example. + +## I. Preparations + +1. First, create a base directory as the build workspace. + +```shell +$ mkdir ~/cloud-images +``` + +2. Create a directory named `manifests` to store the kubernetes nginx deployment yaml file. + +```shell +$ cd cloud-images +$ mkdir manifests +``` + +## II. Prepare the Manifest File + +At this stage, we will prepare a simple nginx kubernetes yaml file. + +```shell +$ cat manifests/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 2 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.23.1 + ports: + - containerPort: 80 +``` + +## III. Create Kubefile + +At this stage, we need to create a Kubefile that will be used to build the image. + +```shell +FROM scratch +COPY manifests manifests +COPY registry registry +CMD ["kubectl apply -f manifests/deployment.yaml"] +``` + +## IV. Build the Cluster Image + +After preparing all the necessary files and directories, we can start building the cluster image. + +```shell +sealos build -t labring/nginx:v1.23.1 . +``` + +**Note:** Before starting the build, you need to install the sealos command on your local host. + +During the build, you can view the build log. + +## V. Verify the Image + +After the build is complete, you can view the built image with the following command: + +```shell +root@ubuntu:~/cloud-images# sealos images +labring/nginx v1.23.1 521c85942ee4 4 minutes ago 56.8 MB +``` + +## VI. Push the Image + +Finally, we can push the built image to any Docker image repository. The following command pushes it to DockerHub. + +```shell +sealos push labring/nginx:v1.23.1 +``` + +**Note:** Please use the sealos command to operate the cluster image, the Docker command is not supported. + +If you are using a private image repository, just use `sealos login` to log into the repository before pulling or +pushing the image. + +```shell +sealos login docker.io -u xxx -p xxx + +sealos login registry.cn-hangzhou.aliyuncs.com -u xxx -p xxx +``` + +At this point, the cluster image based on the deployment manifest is successfully built. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md new file mode 100644 index 00000000000..f3084241176 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md @@ -0,0 +1,137 @@ +--- +sidebar_position: 6 +keywords: [sealos, build cluster image, exec command, scp command, Kubernetes, openebs mayastor, flannel installation, cluster management, hugepages, kernel modules] +description: Learn how to build cluster images using sealos exec and scp commands. Follow step-by-step examples for openebs mayastor and flannel installation. +--- + +# Building Cluster Images Using exec and scp Commands + +By default, `sealos run xx` only runs the command and copies the file on the first master node. When you want to run the +command or copy files on specific nodes or all nodes, you can use the `sealos exec` or `sealos scp` commands when +building the cluster image. + +- sealos exec: Connects to one or more nodes and runs any shell command; +- sealos scp: Connects to one or more nodes and copies local files to remote nodes. + +Although you can directly use these commands on the host, this article mainly describes how to use these two commands +when building the cluster image using sealos build. + +## sealos exec Example + +Below is an example of building an openebs cluster image. Before installing openebs maystor, some initialization +operations need to be performed on the node, you can use sealos exec to achieve this. + +First, create a base directory for building. + +```shell +$ mkdir ~/cloud-images +``` + +Create a `charts` directory to store the kubernetes nginx helm charts file. + +```shell +$ cd cloud-images +``` + +Create a file named `Kubefile` for image building: + +```shell +$ cat Kubefile +FROM scratch +COPY manifests manifests +COPY registry registry +COPY opt opt +COPY mayastor.sh mayastor.sh +CMD ["bash mayastor.sh"] +``` + +Create a script file named `mayastor.sh`, the shell command after sealos exec will be executed on all nodes (create +hugepage, load kernel modules on all nodes), but other commands will only run on the master node. + +```shell +$ cat mayastor.sh +#!/usr/bin/env bash +set -e + +sealos exec " +echo vm.nr_hugepages = 1024 | sudo tee -a /etc/sysctl.d/mayastor.conf +sysctl -p +sudo modprobe -- nbd +sudo modprobe -- nvmet +sudo modprobe -- nvmet_rdma +sudo modprobe -- nvme_fabrics +sudo modprobe -- nvme_tcp +sudo modprobe -- nvme_rdma +sudo modprobe -- nvme_loop +cat < /tmp/buildimage/kubeadm.yml < /tmp/buildimage/Kubefile < Clusterfile +``` + +Notice: labring/helm should be set before labring/calico. + +The generated Clusterfile is as follows: + +
+Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.24.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +status: {} +``` + +
+ +2. After generating the Clusterfile, update the cluster configuration. For example, to modify the CIDR range of pods, + you can modify the `networking.podSubnet` and `spec.data.spec.calicoNetwork.ipPools.cidr` fields. The final + Clusterfile would look like this: + +
+Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.25.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +status: {} +--- +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +networking: + podSubnet: 10.160.0.0/12 +--- +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + ipPools: + - blockSize: 26 + cidr: 10.160.0.0/12 + encapsulation: IPIP + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*" +``` + +
+ +3. Run `sealos apply -f Clusterfile` to start the cluster. After the cluster is successfully running, the Clusterfile + will be saved in the `.sealos/default/Clusterfile` file. You can modify the fields in it to reapply changes to the + cluster. + +**Note:** + +- You can refer to + the [official documentation](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-config/) or run the + `kubeadm config print init-defaults` command to print the kubeadm configuration. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md new file mode 100644 index 00000000000..7fd99755968 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 0 +keywords: [Sealos cluster, Docker images, cluster initialization, node management, service management] +description: Learn how to effectively run and manage a Sealos cluster with Docker images. Get detailed tutorials on cluster initialization, node management, and service management. +--- + +# Running a Sealos Cluster with Docker Images + +In this directory, we provide a series of detailed tutorials and resources to help you effectively run and manage a +Sealos cluster. Here is a brief overview of each file or subdirectory: + +1. **Cluster Initialization**: This section provides all the necessary steps to start and initialize a new Sealos + cluster. It includes information on how to configure Sealos and how to run initialization commands. +2. **Node Management**: This section covers how to add and remove cluster nodes, as well as how to maintain and manage + detailed information about the cluster nodes. +3. **Service Management**: This section includes guides on how to deploy and manage various services on the Sealos + cluster. It covers how to use Sealos' command-line tools to manage services and how to configure services to meet + your specific requirements. +4. **Practical Examples**: This section contains various practical examples, including how to run and manage various + applications and how to handle specific operational issues. + +We hope this directory provides comprehensive assistance for running and managing a Sealos cluster. If you have any +questions or suggestions, please feel free to contact us at any time. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md new file mode 100644 index 00000000000..5d81ff82b73 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md @@ -0,0 +1,68 @@ +--- +sidebar_position: 2 +keywords: [Go template, Clusterfile, Kubernetes cluster, sealos, cluster deployment] +description: Learn how to configure and deploy a Kubernetes cluster using Go template syntax with sealos. Follow our guide for a seamless setup. +--- + +# Template Configuration Installation + +We can also use Go template syntax to write the Clusterfile (similar to [Helm](https://helm.sh/)), but partial template +functions such as `include`/`tpl`/`require`/`lookup` are not supported yet. For example, create a `Clusterfile.yaml` as +follows: + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + name: {{ .Values.clusterName }} +spec: + hosts: + - ips: {{ .Values.masters | toYaml | nindent 8 }} + roles: ["master", "amd64"] + {{- with .Values.nodes }} + - ips: {{ . | toYaml | nindent 8 }} + roles: ["node", "amd64"] + {{- end }} + image: {{ .Values.images | toYaml | nindent 4 }} + ssh: + passwd: {{ env "SSH_PASSWORD" .Values.ssh.passwd }} + pk: {{ default "~/.ssh/id_rsa" .Values.ssh.pk }} + port: {{ default 22 .Values.ssh.port | int }} + user: {{ default "root" .Values.ssh.user }} +--- +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration +networking: + dnsDomain: {{ default "cluster.local" .Values.networking.dnsDomain }} + serviceSubnet: {{ default "10.96.0.0/18" .Values.networking.serviceSubnet }} + podSubnet: {{ default "100.64.0.0/17" .Values.networking.podSubnet }} +``` + +Then, create a custom values file `example.values.yaml`: + +```yaml +clusterName: default +images: + - dockerhub.tencentcloudcr.com/labring/kubernetes:v1.23.8 + - dockerhub.tencentcloudcr.com/labring/calico:v3.24.1 +masters: + - 10.74.16.27:22 + - 10.74.16.140:22 + - 10.74.16.101:22 +nodes: [] +ssh: + # passwd: notSetYet + pk: /path/to/private/key/file + port: 22 + user: root +networking: + dnsDomain: cluster.local + serviceSubnet: 10.96.0.0/18 + podSubnet: 100.64.0.0/17 +``` + +You can then deploy the cluster like this: + +```shell +$ sealos apply -f Clusterfile.yaml --values example.values.yaml --set clusterName=testlocal --env SSH_PASSWORD=s3cret +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md new file mode 100644 index 00000000000..b09b4113d32 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 3 +keywords: [Kubernetes upgrade, sealos run, upgrade cluster, Kubernetes v1.25.0, Kubernetes lifecycle management] +description: Learn how to upgrade your Kubernetes cluster using sealos run. Follow our step-by-step guide to ensure a smooth upgrade to Kubernetes v1.25.0. +--- + +# How to Upgrade the Cluster + +If you want to upgrade your Kubernetes cluster, you just need to run the following command: + +```sh +sealos run labring/kubernetes: +``` + +Make sure you have already set up the cluster. + +## Example Scenario + +1. Let's say you have previously run the following command: + +```sh +sealos run labring/kubernetes:v1.24.0 labring/calico:v3.22.1 --masters 192.168.64.8 --nodes 192.168.64.7 +``` + +2. Now, if you want to upgrade the cluster to v1.25.0, you can do the following: + +```sh +sealos run labring/kubernetes:v1.25.0 +``` + +During the execution of 'kubeadm upgrade v1.25.0', you will see: + +```txt +[upgrade/version] You have chosen to change the cluster version to "v1.25.0" +[upgrade/versions] Cluster version: v1.24.0 +[upgrade/versions] kubeadm version: v1.25.0 +[upgrade] Are you sure you want to proceed? [y/N]: +``` + +Type 'y' to proceed with the upgrade. + +If there are any **errors**, you can rerun the command 'sealos run labring/kubernetes:v1.25.0'. Even if it fails, it +will ensure the same result. + +## Important Notes + +1. **Upgrades cannot skip minor version numbers**. For example, upgrading from 'v1.23.0' to 'v1.25.0' is not allowed. If + you do need to upgrade from 'v1.23.0' to 'v1.25.0', you can do it in two steps, such as upgrading from 'v1.23.0' to ' + v1.24.0' first, and then from 'v1.24.0' to 'v1.25.0'. + +2. Once the upgrade is successful, the old version images mounted by the cluster will be replaced. Adding master or + worker nodes will apply the new version. + +This is the entire process of upgrading a Kubernetes cluster. If you encounter any issues during the upgrade process, +don't hesitate to refer to relevant documentation or seek assistance. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md new file mode 100644 index 00000000000..269165eb9df --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md @@ -0,0 +1,69 @@ +--- +sidebar_position: 3 +keywords: [nginx ingress, Helm chart, Kubernetes, Docker image, Sealos] +description: Learn how to build an nginx-ingress cluster image using Helm and Sealos, including steps for downloading charts, writing Dockerfiles, and pushing to image registries. +--- + +# Building an Ingress Cluster Image + +Here we demonstrate how to build an nginx-ingress cluster image using Helm. + +## Download the Helm Chart + +```shell +$ mkdir ingress-nginx && cd ingress-nginx +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm pull ingress-nginx/ingress-nginx +``` + +You will find the downloaded chart: + +```shell +$ ls +ingress-nginx-4.1.0.tgz +``` + +## Add Image List + +Sealos will download the images in the image list and cache them in the registry directory. + +The directory must be in the format `images/shim/[your image list filename]`: + +```shell +$ cat images/shim/nginxImages +k8s.gcr.io/ingress-nginx/controller:v1.2.0 +k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 +``` + +## Write the Dockerfile + +```Dockerfile +FROM scratch +COPY ../examples . +CMD ["helm install ingress-nginx ingress-nginx-4.1.0.tgz --namespace ingress-nginx --create-namespace"] +``` + +## Build the Cluster Image + +```shell +$ sealos build -f Dockerfile -t docker.io/fanux/ingress-nginx:v1.2.0 . +``` + +Sealos will automatically add the image dependencies from the image list to the cluster image, magically saving the +Docker images it depends on inside. When running in another environment, it will magically check if the Docker images +exist in the cluster. If they do, it will automatically download them; otherwise, it will download them from k8s.gcr.io. +Users do not need to modify the Docker image addresses in the Helm chart. This utilizes the black technology of image +caching proxy. + +## Push to the Image Registry + +```shell +$ sealos login docker.io +$ sealos push docker.io/fanux/ingress-nginx:v1.2.0 +``` + +## Run the Cluster Image + +```shell +$ sealos run docker.io/fanux/ingress-nginx:v1.2.0 +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md new file mode 100644 index 00000000000..e0acd3af8fb --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md @@ -0,0 +1,209 @@ +--- +sidebar_position: 2 +keywords: [Kubernetes installation, Sealos CLI, multi-node Kubernetes, Kubernetes cluster setup, offline Kubernetes installation] +description: Learn how to install Kubernetes clusters using Sealos CLI on both amd64 and arm64 architectures, including single-node and multi-node setups, with offline installation support. +--- + +# Install Kubernetes + +Sealos supports installing Kubernetes clusters on `amd64` and `arm64` architecture machines. + +## Prerequisites + +You'll first need to [download the Sealos CLI tool](/self-hosting/lifecycle-management/quick-start/install-cli.md). +Sealos is a simple Golang binary that can be installed on most Linux operating systems. + +Here are some basic installation requirements: + +- Each cluster node should have a unique hostname without underscores. +- System times must be synchronized across all nodes. +- The `sealos run` command must be run on the **first master node** of the Kubernetes cluster. **Installation on nodes + outside the cluster is not currently supported**. +- It is recommended to use a clean OS to create the cluster. **Do not install Docker manually!** +- Supports most Linux distributions like Ubuntu, CentOS, Rocky Linux. +- Compatible with all Kubernetes versions available on [Docker Hub](https://hub.docker.com/r/labring/kubernetes/tags). +- Supports Containerd as the container runtime. +- When installing on public clouds, use **private IP** addresses. + +## View Available Cluster Images + +All Sealos cluster images are hosted in the [cluster-image-docs](https://github.com/labring-actions/cluster-image-docs) +repository. + +You can browse all Sealos images on Docker Hub +here: [https://hub.docker.com/u/labring](https://hub.docker.com/u/labring). + +Use [Registry Explorer](https://explore.ggcr.dev/) to view all versions of the Kubernetes cluster images by entering +`labring/kubernetes` and clicking "Submit Query": + +![](images/registry-explorer.png) + +This will display all available tags for that image. + +:::info Note + +Kubernetes cluster stability improves with higher minor version numbers. For example in v1.28.x, x is the minor version. +It is recommended to use versions with relatively high minor numbers. Currently, the highest v1.27 version is v1.27.7, +while the highest v1.28 version is v1.28.3, so **v1.27.7 is recommended**. Choose the optimal Kubernetes version based +on your needs. + +::: + +## Install Single-Node Kubernetes + +```shell +# sealos version must >= v4.1.0 +$ sealos run labring/kubernetes:v1.27.7 labring/helm:v3.9.4 labring/cilium:v1.13.4 --single +``` + +## Install Kubernetes Cluster + +```shell +$ sealos run labring/kubernetes:v1.27.7 labring/helm:v3.9.4 labring/cilium:v1.13.4 \ +--masters 192.168.64.2,192.168.64.22,192.168.64.20 \ +--nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd] +``` + +Note: labring/helm must come before labring/cilium. + +Parameter descriptions: + +| Parameter | Example | Description | +|--------------|----------------------------|----------------------------------| +| --masters | 192.168.0.2 | List of master node IP addresses | +| --nodes | 192.168.0.3 | List of worker node IP addresses | +| --ssh-passwd | [your-ssh-passwd] | SSH password | +| kubernetes | labring/kubernetes:v1.25.0 | Kubernetes cluster image | + +Running the above commands directly on clean servers will install a highly available Kubernetes cluster without any +extra steps. + +## Install Various Distributed Apps + +```shell +sealos run labring/helm:v3.9.4 # Install Helm + +sealos run labring/openebs:v3.9.0 # Install OpenEBS + +sealos run labring/minio-operator:v4.5.5 labring/ingress-nginx:4.1.0 +``` + +This provides highly available apps like Minio without worrying about dependencies. + +## Add Kubernetes Nodes + +Add worker nodes: + +```shell +$ sealos add --nodes 192.168.64.21,192.168.64.19 +``` + +Add master nodes: + +```shell +$ sealos add --masters 192.168.64.21,192.168.64.19 +``` + +## Delete Kubernetes Nodes + +Delete worker nodes: + +```shell +$ sealos delete --nodes 192.168.64.21,192.168.64.19 +``` + +Delete master nodes: + +```shell +$ sealos delete --masters 192.168.64.21,192.168.64.19 +``` + +## Clean Up Kubernetes Cluster + +```shell +$ sealos reset +``` + +## Offline Installation + +For offline environments, first import the images - subsequent steps are identical to online installation. + +First, export images from an online environment: + +```shell +$ sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 + +$ sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 +``` + +### Import and Install + +Copy kubernetes.tar to the offline environment and import it with: + +```shell +$ sealos load -i kubernetes.tar +``` + +The rest of the installation process is identical to online installation: + +```shell +$ sealos images # Verify import succeeded + +$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 # Single node +``` + +### Quick Cluster Install + +You can also install Kubernetes by directly running: + +```shell +$ sealos run kubernetes.tar +``` + +## Cluster Image Version Compatibility + +### Kubernetes Compatibility with Containerd + +It's advised to use Containerd as the container runtime interface (CRI) in Kubernetes clusters. Containerd stands out +for its lightweight structure and high efficiency, and it's fully compatible with Docker. Kubernetes images that utilize +Containerd benefit from enhanced performance and optimized resource usage. Here are the specific supported versions: + +| Kubernetes Version | Required Sealos Version | CRI Version | Cluster Image Version | +|--------------------|-------------------------|-------------|----------------------------| +| `<1.25` | `>=v4.0.0` | v1alpha2 | labring/kubernetes:v1.24.0 | +| `>=1.25` | `>=v4.1.0` | v1alpha2 | labring/kubernetes:v1.25.0 | +| `>=1.26` | `>=v4.1.4-rc3` | v1 | labring/kubernetes:v1.26.0 | +| `>=1.27` | `>=v4.2.0-alpha3` | v1 | labring/kubernetes:v1.27.0 | +| `>=1.28` | `>=v5.0.0` | v1 | labring/kubernetes:v1.28.0 | + +The choice of Sealos and CRI versions is dependent on the Kubernetes version in question. For instance, Kubernetes +v1.26.0 would require Sealos v4.1.4-rc3 or newer, along with the v1 CRI version. + +### Kubernetes Compatibility with Docker + +Alternatively, Docker can also be used as the container runtime. The following table provides a breakdown of compatible +Kubernetes versions with their corresponding Sealos and CRI versions for Docker-based setups: + +| Kubernetes Version | Required Sealos Version | CRI Version | Cluster Image Version | +|--------------------|-------------------------|-------------|-----------------------------------| +| `<1.25` | `>=v4.0.0` | v1alpha2 | labring/kubernetes-docker:v1.24.0 | +| `>=1.25` | `>=v4.1.0` | v1alpha2 | labring/kubernetes-docker:v1.25.0 | +| `>=1.26` | `>=v4.1.4-rc3` | v1 | labring/kubernetes-docker:v1.26.0 | +| `>=1.27` | `>=v4.2.0-alpha3` | v1 | labring/kubernetes-docker:v1.27.0 | +| `>=1.28` | `>=v5.0.0` | v1 | labring/kubernetes-docker:v1.28.0 | + +As with the Containerd setup, the appropriate Sealos and CRI versions must be matched with the specific version of +Kubernetes being used. For a Kubernetes v1.26.0 setup, this means selecting Sealos v4.1.4-rc3 or later, and a v1 CRI +version. + +### k3s Compatibility with Containerd + +| k3s Version | Required Sealos Version | Cluster Image Version | +|-------------|-------------------------|-----------------------| +| `>=1.24` | `>=v5.0.0` | labring/k3s:v1.24.0 | + +## Summary + +You can choose from a variety of image types and versions to suit your individual needs and preferences. Don't forget to +consult the [CHANGELOG](https://github.com/labring/sealos/blob/main/CHANGELOG/CHANGELOG.md) to stay informed about the +latest updates and bug fixes for each version. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png new file mode 100644 index 00000000000..a9e28004026 Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/install-cli.md b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/install-cli.md new file mode 100644 index 00000000000..8157c97f2e3 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/quick-start/install-cli.md @@ -0,0 +1,98 @@ +--- +sidebar_position: 1 +keywords: [Sealos CLI, Sealos installation, Sealos download, Sealos binary, Sealos package management] +description: Learn how to download and install Sealos CLI with our comprehensive guide, including binary and package management tool installation methods. +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Download Sealos CLI + +You can get the list of versions by running: + +```bash +curl --silent "https://api.github.com/repos/labring/sealos/releases" | jq -r '.[].tag_name' +``` + +Note: While choosing the version, it's recommended to use a stable version. The versions like `v4.3.0-rcx`, +`v4.3.0-alpha1` are pre-releases, use them with caution. + +Set the 'VERSION' environment variable to the latest VERSION number, or replace 'version' with the Sealos version you +want to install: + +```shell +VERSION=`curl -s https://api.github.com/repos/labring/sealos/releases/latest | grep -oE '"tag_name": "[^"]+"' | head -n1 | cut -d'"' -f4` +``` + +## Binary Auto Download + +```bash +curl -sfL https://raw.githubusercontent.com/labring/sealos/${VERSION}/scripts/install.sh | + sh -s ${VERSION} labring/sealos + +``` + +## Binary Manual Download + + + + +```bash +$ wget https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz \ + && tar zxvf sealos_${VERSION#v}_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin +``` + + + + +```bash +$ wget https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_arm64.tar.gz \ + && tar zxvf sealos_${VERSION#v}_linux_arm64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin +``` + + + + +## Package Management Tool Installation + +### DEB Repository + +```bash +echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list +sudo apt update +sudo apt install sealos +``` + +### RPM Repository + +```bash +sudo cat > /etc/yum.repos.d/labring.repo << EOF +[fury] +name=labring Yum Repo +baseurl=https://yum.fury.io/labring/ +enabled=1 +gpgcheck=0 +EOF +sudo yum clean all +sudo yum install sealos +``` + +## Source Code Installation + +### Prerequisites +1. `linux` +2. `git` +3. `golang` 1.20+ +4. `libgpgme-dev libbtrfs-dev libdevmapper-dev` + +If you are in an `arm64` environment, add the `:arm64` suffix. + +### Build + +```bash +# git clone the repo +git clone https://github.com/labring/sealos.git +# just make it +make build BINS=sealos +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json new file mode 100644 index 00000000000..950b839be0a --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 3 +} diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md new file mode 100644 index 00000000000..2f227581975 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md @@ -0,0 +1,152 @@ +--- +sidebar_position: 3 +keywords: [image-cri-shim, Kubernetes, container runtime, CRI, kubelet, container deployment, image registry, middleware] +description: Learn how image-cri-shim simplifies Kubernetes container deployment by automatically recognizing image names, streamlining the process. +--- + +# image-cri-shim User Guide + +## Overview + +image-cri-shim is a gRPC (Google Remote Procedure Call) shim based on CRI (Container Runtime Interface) and kubelet. CRI +is the interface used in Kubernetes to interact with container runtimes, while kubelet is the Kubernetes component +responsible for maintaining container runtime status and node-level resource management. + +The main functionality of image-cri-shim is automatic image name recognition, which eliminates the need for users to +manually specify the image name when deploying containers with Kubernetes. This simplifies the container image +deployment process and improves the convenience for users. + +In practical usage, image-cri-shim serves as middleware that receives requests from kubelet and forwards them to the +container runtime. By automatically recognizing the image name, image-cri-shim streamlines the deployment process of +container images and reduces user burden. + +``` ++------------+ +----------------+ +-------------------+ +| User | | Kubelet | | image-cri-shim | +| (Kubernetes| | (Node agent) | | (Middleware) | +| Manifest) | | | | | ++-----+------+ +-------+--------+ +-------+-----------+ + | | | + | YAML Manifest | | + |---------------> | | + | | | + | | | + | | CRI Request | + | |------------------------> | + | | | + | | Image Name | + | | Auto-Recognition | + | | | + | | | + | | CRI Response | + | | <------------------------+ + | | | + | | | + | Container | | + | Deployment | | + | <----------------------| | + | | | + | | | ++------------+ +-------+--------+ +-------+-----------+ + +``` + +From the above flowchart, it can be seen that a user creates a Kubernetes YAML manifest containing container information +and submits the manifest to kubelet. kubelet, which acts as an agent on Kubernetes nodes, is responsible for managing +containers. +Next, kubelet sends a CRI request to the image-cri-shim middleware. The main task of image-cri-shim is to automatically +recognize the image name. It processes the CRI request and retrieves relevant image information. Once image-cri-shim +identifies the image name, it returns the CRI response to kubelet. + +Finally, kubelet deploys the container using the image name obtained from image-cri-shim. This process is transparent to +the user, as they do not need to manually specify the image name, simplifying the container deployment process and +improving convenience. + +## Architecture + +The architecture of image-cri-shim is illustrated in the following diagram: + +![](images/image-cri-shim.png) + +## Usage + +```yaml +shim: /var/run/image-cri-shim.sock +cri: /run/containerd/containerd.sock +address: http://sealos.hub:5000 +force: true +debug: true +timeout: 15m +auth: admin:passw0rd + +registries: +- address: http://172.18.1.38:5000 + auth: admin:passw0rd +``` + +The above configuration is a YAML file used to set the parameters of image-cri-shim. It includes several key parameters, +and the explanation for each parameter is as follows: + +1. shim: Specifies the UNIX socket file path + +for image-cri-shim. This path is used for communication with kubelet. + +2. cri: Specifies the UNIX socket file path for the container runtime (e.g., containerd). image-cri-shim uses this path + to communicate with the container runtime. +3. address: Defines the address of the image registry. In this example, the registry address is http://sealos.hub:5000. +4. force: When set to true, image-cri-shim forcefully starts the shim without waiting for the cri to start. +5. debug: When set to true, enables debug mode and outputs more logging information. +6. timeout: Defines the timeout for image operations. In this example, the timeout is set to 15 minutes (15m). +7. auth: Defines the authentication credentials for accessing the image registry. In this example, the username is admin + and the password is passw0rd. + +Additionally, the configuration file includes a list of registries, which defines other image registries and their +authentication credentials. In this example, there is only one additional registry: + +- address: The address of the registry is http://172.18.1.38:5000. +- auth: The authentication credentials for accessing the registry. In this example, the username is admin and the + password is passw0rd. + +This configuration file provides image-cri-shim with the necessary information to communicate with kubelet, the +container runtime (such as containerd), and access and manage the image registry. + +Note: image-cri-shim is compatible with both CRI API v1alpha2 and v1. + +### Service Management + +image-cri-shim is typically run as a system service. To manage image-cri-shim, you can use system service management +tools (such as systemctl) to start, stop, restart, or view the status of the service. First, make sure you have +correctly installed image-cri-shim and configured it as a system service. + +1. Start the service: `systemctl start image-cri-shim` +2. Stop the service: `systemctl stop image-cri-shim` +3. Restart the service: `systemctl restart image-cri-shim` +4. View the service status: `systemctl status image-cri-shim` + +### Log Management + +To view the logs of the image-cri-shim service, you can use the journalctl command. journalctl is a tool used to query +and display system logs, and it is used in conjunction with the systemd service manager. + +Here are the commands to view the logs of the image-cri-shim service using journalctl: + +```shell +journalctl -u image-cri-shim +``` + +This will display all logs of the image-cri-shim service. If you want to view the logs in real-time, you can add the -f +option: + +```shell +journalctl -u image-cri-shim -f +``` + +Additionally, you can filter the logs by time. For example, if you only want to view the logs from the past hour, you +can use the following command: + +```shell +journalctl -u image-cri-shim --since "1 hour ago" +``` + +These commands should help you view and analyze the logs of the image-cri-shim service, allowing you to better +understand the service's operation status and potential issues. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png new file mode 100644 index 00000000000..5c8d5f81b23 Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/_category_.json b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/_category_.json new file mode 100644 index 00000000000..e47d9e07a6d --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 99 +} \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/images/01.webp b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/images/01.webp new file mode 100644 index 00000000000..0cc05e478e9 Binary files /dev/null and b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/images/01.webp differ diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/lvscare.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/lvscare.md new file mode 100644 index 00000000000..d14d51d5f7c --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/lvscare/lvscare.md @@ -0,0 +1,101 @@ +--- +keywords: [LVScare, Sealos, Kubernetes high availability, IPVS load balancing, Kubernetes health check] +description: Learn how LVScare and Sealos ensure high availability and reliability of Kubernetes clusters with IPVS-based load balancing and health checks. +--- + +# LVScare User Guide + +## Introduction + +LVScare is a lightweight load balancing and health checking tool based on IPVS technology. It provides real-time +monitoring and management of backend services. Sealos, a cloud operating system, is a Kubernetes HA installation tool +based on kubeadm that can be used to install and upgrade high availability Kubernetes clusters on any Linux system. When +combined, Sealos and LVScare enable high availability of Kubernetes master nodes. Leveraging the lifecycle management +capabilities of Sealos and the lightweight, zero-dependency, and high availability features of LVScare, it ensures the +stability and reliability of Kubernetes clusters effectively. + +### How LVScare Works and Its Features + +LVScare monitors the health status of backend services (real servers) in real-time using IPVS. If a service becomes +unavailable, LVScare immediately sets its weight to 0 (for graceful TCP termination) and removes it from the service +list during the next check. When the service recovers, LVScare automatically adds it back to the service list. This +design of LVScare makes it lightweight, zero-dependency, and highly available. It occupies fewer resources, is stable +and reliable, and similar to the implementation of kube-proxy, it can ensure the continuous availability of services +through IPVS-based local load balancing. + +## Integration of Sealos and LVScare + +In Sealos, we utilize the recommended approach of static pods to automatically configure and manage LVScare for +achieving high availability of Kubernetes clusters. During the installation process of a Kubernetes cluster, Sealos +automatically uses LVScare for health checking and load balancing of the master nodes. This means that even if one of +the master nodes fails, it does not affect the overall functionality of the Kubernetes cluster. + +![](images/01.webp) + +### Running LVScare as a Static Pod + +First, use the `sealctl static-pod` command to generate the configuration for LVScare and place it in the +`/etc/kubernetes/manifests` directory. This allows all nodes in the Kubernetes cluster to access this configuration. + +```bash +lvscare care --vs 10.103.97.12:6443 --rs 192.168.0.2:6443 --rs 192.168.0.3:6443 --rs 192.168.0.4:6443 --interval 5 --mode route +``` + +### Generating and Adjusting Static Pod Configuration + +To start LVScare on each node, we can use the following command to generate the configuration for the static pod: + +```bash +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168.0.3:6443 --print +``` + +When there are changes in the master nodes, Sealos only needs to rerun the `sealctl static-pod` command to adjust the +master nodes, simplifying the logic of maintaining static pods. Before joining the cluster nodes, we need to manually +start the IPVS rules by calling `sealctl ipvs` (which directly calls the LVScare SDK) to maintain the IPVS cluster. +After the node joins successfully, Kubernetes static pods can take over the IPVS rules. + +## Advantages of Using LVScare + +### High Availability + +By combining LVScare with Sealos, high availability of Kubernetes cluster master nodes can be achieved. + +### Health Checking Mechanism + +The health checking mechanism of LVScare can promptly detect and handle issues, preventing them from causing larger +problems due to the failure of a single node. + +### Seamless Integration + +As a static pod in Seal + +os, LVScare can seamlessly integrate with other parts of the Kubernetes cluster. + +### Simplified Operations + +Sealos automatically configures and manages LVScare, greatly simplifying the operational tasks of the Kubernetes +cluster. + +## LVScare Usage Example + +Please note that all real servers need to listen on the same host and be set in "route" mode. Then, you can run LVScare +in the foreground. For example: + +```bash +docker run -p 8081:80 --name echoserver1 -d cilium/echoserver +docker run -p 8082:80 --name echoserver2 -d cilium/echoserver +docker run -p 8083:80 --name echoserver3 -d cilium/echoserver +lvscare care --vs 169.254.0.1:80 --rs 127.0.0.1:8081 --rs 127.0.0.1:8082 --rs 127.0.0.1:8083 --logger DEBG --health-schem http --health-path / +``` + +## Cleanup + +Finally, you can use the following command to clean up: + +```bash +lvscare care --vs 169.254.0.1:80 --logger DEBG -C +``` + +Conclusion: LVScare is a lightweight load balancing and health checking tool based on IPVS. When seamlessly integrated +with Sealos, it greatly improves the availability and performance of Kubernetes clusters. Give it a try and see how +LVScare can help you better manage your Kubernetes cluster! diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/_category_.json b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/_category_.json new file mode 100644 index 00000000000..a788e786e6c --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 2 +} diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cert.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cert.md new file mode 100644 index 00000000000..81b7fd871b3 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cert.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 1 +keywords: [Kubernetes certificates, cert command, secure communication, TLS encryption, Kubernetes cluster] +description: Generate secure Kubernetes certificates with the `cert` command to ensure encrypted communication within your cluster using TLS. +--- + +# Certificate Management with `cert` + +The `cert` command is used to generate the necessary certificate files for a Kubernetes cluster. In a Kubernetes +cluster, certificates are used to ensure secure communication between components such as the API server, kubelet, and +etcd. Certificates provide encryption using the Transport Layer Security (TLS) protocol to ensure the confidentiality +and integrity of data during transit. + +The `sealctl cert` command generates certificates automatically based on the provided parameters. These parameters +include node IP, node name, service CIDR, DNS domain, and optional additional alternate names. By generating and +configuring these certificates, you can ensure secure communication within your Kubernetes cluster. + + +``` +The `cert` command is used to generate Kubernetes certificates. + +Options: + --alt-names Alternate names, such as sealos.io or 10.103.97.2. Can specify multiple alternate names. + --node-name Node name, such as master0. + --service-cidr Service CIDR, such as 10.103.97.2/24. + --node-ip IP address of the node, such as 10.103.97.2. + --dns-domain DNS domain for the cluster. Default value is cluster.local. + --cert-path Path to Kubernetes certificate files. Default value is /etc/kubernetes/pki. + --cert-etcd-path Path to Kubernetes etcd certificate files. Default value is /etc/kubernetes/pki/etcd. + +Examples: + sealctl cert --alt-names sealos.io --alt-names 10.103.97.2 \ + --node-name master0 --service-cidr 10.103.97.2/24 \ + --node-ip 10.103.97.2 --dns-domain cluster.local + +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cri.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cri.md new file mode 100644 index 00000000000..d9fae8c2fa1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/cri.md @@ -0,0 +1,52 @@ +--- +sidebar_position: 2 +keywords: [CRI management, Kubernetes containers, container runtime, sealctl cri, Docker management, containerd, CRI-O, Kubernetes cluster, container operations, cgroup driver] +description: Manage and inspect the Container Runtime Interface (CRI) in Kubernetes with sealctl cri. Check runtime status, list containers, and more. +--- + +# CRI Container Management + +The `cri` command is used to manage and inspect the Container Runtime Interface (CRI) environment in a Kubernetes +cluster. The container runtime is the underlying technology responsible for running containers, such as Docker, +containerd, or CRI-O. In Kubernetes, the container runtime is used to start, stop, and manage containers to support +workloads in the cluster. + +The `sealctl cri` command provides a set of subcommands that allow you to perform various operations related to the +container runtime, such as checking if the runtime is Docker, if it is running, listing Kubernetes containers, deleting +containers, pulling images, checking image existence, and retrieving CGroup driver information. + +By using the `sealctl cri` command, you can easily manage and inspect the container runtime environment in your +Kubernetes cluster to ensure proper configuration and smooth operation. + + +```shell +sealctl cri [flags] +``` + +Subcommands: + +1. `socket`: Check the CRI socket. + +```shell +sealctl cri socket +``` + +2. `cgroup-driver`: Get the cgroup driver of the container runtime. + +```shell +sealctl cri cgroup-driver [--short] +``` + +- `--short`: Print only the result. + +Global flags: + +- `--socket-path`: Path to the CRI socket. +- `--config`: Path to the CRI configuration file. + +Examples: + +```shell +sealctl cri socket +sealctl cri cgroup-driver --short +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hostname.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hostname.md new file mode 100644 index 00000000000..e273b42c7cc --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hostname.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 3 +keywords: [hostname command, sealctl, get hostname, operating system hostname, sealctl hostname] +description: Learn how to use the sealctl command to get the hostname of your operating system effortlessly. No additional parameters required. +--- + +# Get Hostname + +Get the hostname of the operating system: + +```shell +sealctl hostname +``` + +Example: + +```shell +sealctl hostname +``` + +Executing this command will return the hostname of the operating system. No additional parameters need to be passed. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hosts.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hosts.md new file mode 100644 index 00000000000..a4404df1350 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/hosts.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 4 +keywords: [manage hosts, domain name resolution, sealctl command, IP mapping, DNS override] +description: Learn how to manage the hosts file using sealctl commands to list, add, and delete domain-to-IP mappings for better control over DNS resolution. +--- + +# Manage Hosts + +The `hosts` command is used to manage the hosts file of the operating system. The hosts file is a file used for domain +name resolution to IP addresses and is typically used locally to override DNS resolution. By modifying the hosts file, +you can assign a custom IP address to a specific domain name without relying on a DNS server. + +`sealctl hosts` provides the following three subcommands to manage the hosts file: + +1. `list`: List all entries in the current hosts file. +2. `add`: Add a new domain-to-IP mapping to the hosts file. +3. `delete`: Delete a specified domain-to-IP mapping from the hosts file. + +With these subcommands, you can conveniently view, add, and delete mappings in the hosts file, allowing you better +control over domain name resolution to IP addresses. + +1. `sealctl hosts list`: List all entries in the current hosts file. + + Example: + + ```shell + sealctl hosts list + ``` + +2. `sealctl hosts add`: Add a new entry to the hosts file. + + Parameters: + + - `--ip`: IP address (required) + - `--domain`: Domain name (required) + + Example: + + ```shell + sealctl hosts add --ip 192.168.1.100 --domain example.com + ``` + +3. `sealctl hosts delete`: Delete an entry from the hosts file. + + Parameters: + + - `--domain`: Domain name to delete (required) + + Example: + + ```shell + sealctl hosts delete --domain example.com + ``` + +Note: You can specify the path of the hosts file by adding the `--path` parameter after any `hosts` subcommand. The +default path is `/etc/hosts` (Linux systems). + +Example: + +```shell +sealctl hosts list --path /custom/path/hosts +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/ipvs.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/ipvs.md new file mode 100644 index 00000000000..51956714df6 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/ipvs.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 6 +keywords: [IPVS, load balancing, sealctl ipvs, virtual servers, real servers, Linux kernel, proxy modes, health check, scheduling algorithms] +description: Learn how to use sealctl ipvs command for high-performance load balancing in Linux. Manage virtual and real servers, configure health checks, and optimize your network. +--- + +# Manage IPVS + +The `ipvs` command is used to create and manage local IPVS (IP Virtual Server) load balancing. IPVS is a module in the +Linux kernel that allows high-performance load balancing to be implemented in the kernel space. The `ipvs` command +achieves load balancing of services by managing the mapping between virtual servers and real servers. + +`sealctl ipvs` supports the following features: + +1. Creation and management of mappings between virtual servers and real servers. +2. Health-check functionality to periodically check the health status of real servers and perform necessary + online/offline operations. +3. Support for two proxy modes: `route` and `link`. +4. Support for configuring proxy scheduling algorithms (e.g., round-robin, weighted round-robin, etc.). +5. Support for one-time creation of proxy rules (`--run-once` flag) or continuous operation and management of proxy + rules. +6. Support for cleanup: Existing IPVS rules can be cleared and the command will exit using the `-C` or `--clean` flag. + +With the `sealctl ipvs` command, users can easily create and manage high-performance load balancing services locally. + +**Usage** + +```shell +sealctl ipvs [flags] +``` + +**Options** + +- `-C`, `--clean`: Clear existing rules and then exit. +- `--health-insecure-skip-verify`: Skip verification of insecure requests (default is true). +- `--health-path string`: URL path for probing (default is "/healthz"). +- `--health-req-body string`: Request body sent by the health checker. +- `--health-req-headers stringToString`: HTTP request headers (default is []). +- `--health-req-method string`: HTTP request method (default is "GET"). +- `--health-schem string`: HTTP scheme for the probe (default is "https"). +- `--health-status ints`: Valid status codes. +- `-h`, `--help`: Help for ipvs. +- `-i`, `--iface string`: Name of the virtual interface to create, behaving the same as kube-proxy (default is " + lvscare"). Enabled only in mode=link. +- `--interval durationOrSecond`: Health check interval (default is 0s). +- `--ip ip`: Target IP as the routing gateway, used together with mode=route. +- `--logger string`: Log level: DEBG/INFO (default is "INFO"). +- `--masqueradebit int`: IPTables masquerade bit. Enabled only in mode=link. +- `--mode string`: Proxy mode: route/link (default is "route"). +- `--rs strings`: Real server addresses, e.g., 192.168.0.2:6443. +- `--run-once`: Create proxy rules and then exit. +- `--scheduler string`: Proxy scheduler (default is "rr"). +- `--vs string`: Virtual server address, e.g., 169.254.0.1:6443. + +**Global Options** + +- `--debug`: Enable debug logging. +- `--show-path`: Enable displaying code path. + +**Documentation** + +To use the `sealctl ipvs` command, follow these steps: + +1. Provide the necessary options and parameters for the command. +2. Execute the command, which will create or manage local IPVS load balancing. + +**Examples** + +Create proxy rules and then exit: + +```shell +sealctl ipvs --vs 169.254.0.1:6443 --rs 192.168.0.2:6443 --run-once +``` + +Clear existing IPVS rules: + +```shell +sealctl ipvs --clean diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/registry.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/registry.md new file mode 100644 index 00000000000..4b0fed564ff --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/registry.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 5 +keywords: [sealctl registry serve, Docker image repository, Sealos, filesystem mode, in-memory mode, image synchronization, container registry, Kubernetes] +description: Learn how to use the sealctl registry serve command in Sealos to manage Docker image repositories in filesystem and in-memory modes for Kubernetes environments. +--- + +# Registry Image Repository + +## Sealos: Detailed Guide and Usage of `sealctl registry serve` Command + +Sealos provides the `sealctl registry serve` command to facilitate the construction and management of Docker image +repositories. This document provides a detailed guide and usage examples for the `sealctl registry serve` command. + +### Introduction + +The `sealctl registry serve` command is primarily used to start a Docker distribution image repository server. It +supports two modes: `filesystem` and `inmem`. + +1. **Filesystem Mode**: In this mode, `sealctl` runs a Docker distribution image repository server for a specified + directory. The image data is stored on disk in this mode. **This command is also used by Sealos for incremental image + synchronization**. + +2. **In-memory Mode**: In this mode, `sealctl` runs an in-memory Docker distribution image repository server. The image + data is only stored in memory, and the data will be lost when the process exits. + +### Command Options + +The `sealctl registry serve filesystem` command supports the following options: + +- `--disable-logging`: Disable logging output (default is false). +- `--log-level`: Configure the log level (default is 'error'). +- `-p, --port`: The port the server listens on (default is a randomly unused port). + +### Usage Examples + +Here are some usage examples of the `sealctl registry serve` command: + +#### Start a Filesystem Image Repository Server + +```bash +sealctl registry serve filesystem --port=5000 +``` + +The above command starts a filesystem image repository server on port 5000. + +#### Start an In-memory Image Repository Server + +```bash +sealctl registry serve inmem +``` + +The above command starts an in-memory image repository server. The server will lose stored data when the process exits. + +With the `sealctl registry serve` command, users can easily manage and operate Docker image repositories. It is a +powerful and user-friendly tool for both development and production environments. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/sealctl.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/sealctl.md new file mode 100644 index 00000000000..45d0058e3bb --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/sealctl.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 0 +keywords: [sealctl, Sealos, cluster management, container runtime, IPVS, static pods, certificate management, registry, Kubernetes] +description: Explore Sealctl, the powerful command-line tool for Sealos cluster management. Learn about its subcommands for container runtime, IPVS, static pods, and more. +--- + +# Sealctl User Guide + +Sealos provides `sealctl`, a command-line tool for operating with Sealos and cluster nodes. It includes the following +subcommands: + +1. `cert`: Manages certificates for generating, viewing, and updating TLS certificates. +2. `cri`: Manages Container Runtime Interface (CRI) configuration, such as Docker or containerd. +3. `hostname`: Views or sets the system hostname. +4. `hosts`: Manages the system's hosts file, which defines static hostname-to-IP address mappings. +5. `ipvs`: Manages IP Virtual Server (IPVS) rules for load balancing and proxying. +6. `registry`: Manages image repositories for storing container images in container repository format and repository + management. +7. `static_pod`: Manages static Pods and creates static Pod configurations. +8. `token`: Generates and manages access tokens for authorizing access to Kubernetes clusters. + +With these subcommands, you can conveniently manage and configure your Sealos system, enabling control over containers, +image repositories, networks, and other aspects. + +# Sealos Dependent Commands + +1. **Add Hosts** + + Adds a new hosts record on the node with the specified IP address. The parameters include the IP address, hostname, + and domain name. Use the `sealctl hosts add` command. + +2. **Delete Hosts** + + Deletes a hosts record on the node with the specified IP address. The parameters include the IP address and domain + name. Use the `sealctl hosts delete` command. + +3. **Hostname** + + Retrieves the hostname of the node with the specified IP address. Use the `sealctl hostname` command. + +4. **IPVS Load Balancing** + + Configures IPVS for load balancing on the node with the specified IP address. The parameters include the node IP + address, virtual IP address, and a list of master node IP addresses. Use the `sealctl ipvs` command. + +5. **Clear IPVS Rules** + + Clears the IPVS configuration on the node with the specified IP address. The parameters include the node IP address + and virtual IP address. Use the `sealctl ipvs` command. + +6. **Generate Static Pods** + + Deploys a static Pod (lvscare) on the node with the specified IP address. The parameters include the node IP address, + virtual IP address, Pod name, image name, and a list of master node IP addresses. Use the + `sealctl static-pod lvscare` command. + +7. **Manage Cluster Interact Authentication Token** + + Generates a token for the node with the specified IP address. The parameters include the node IP address, + configuration file, and certificate key. Use the `sealctl token` command. + +8. **Get Node's CGroup Information** + + Retrieves the CRI CGroup information of the node with the specified IP address. Use the `sealctl cri cgroup` command. + +9. **Get Node's CRI Socket Information** + + Retrieves the CRI socket information of the node with the specified IP address. Use the `sealctl cri socket` command. + +10. **Generate Self-signed HTTPS Certificates on Node** + + Generates certificates for the node with the specified IP address. The parameters include the node IP address, a + list of alternate names, host IP address, hostname, service CIDR, and DNS domain. Use the `sealctl cert` command. + +11. **Start Registry on Node** + + Starts the registry on the specified node for incremental image synchronization. Use the `sealctl registry serve` + command. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/static-pod.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/static-pod.md new file mode 100644 index 00000000000..09275070d85 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/static-pod.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 7 +keywords: [static pod, sealctl, lvscare, Kubernetes, kubelet, IPVS, VIP, cluster management, control plane, configuration] +description: Learn how to use sealctl static-pod command to generate and manage static Pods in Kubernetes, focusing on lvscare for IPVS rules and control plane setup. +--- + +# Static Pod Configuration + +The `static-pod` command is used to generate static Pods that are managed directly by kubelet instead of the API server. +Static Pods are useful in certain scenarios, such as setting up and managing control plane components in a Kubernetes +cluster. + +The `sealctl static-pod` command provides a convenient way to generate static Pod configuration files for specific +purposes. Currently, it mainly supports generating the `lvscare` static Pod, which is a tool for managing IPVS rules. + +Using `sealctl static-pod lvscare`, you can generate the `lvscare` static Pod YAML file based on specified parameters +such as VIP, master node addresses, and image name. This file can then be stored in the static Pod path of kubelet, and +kubelet will automatically create and manage the corresponding Pod. + +**Usage** + +```shell +sealctl static-pod lvscare [flags] +``` + +**Options** + +- `--vip`: Default VIP IP (default is "10.103.97.2:6443"). +- `--name`: Name of the generated lvscare static Pod. +- `--image`: Image for the generated lvscare static Pod (default is `sealos.hub:5000/sealos/lvscare:latest`). +- `--masters`: List of master addresses for the generated static Pod. +- `--print`: Whether to print the YAML. + +**Examples** + +Generate the lvscare static Pod file and print the YAML: + +```shell +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168.0.3:6443 --print +``` + +If the `--print` option is not used, the configuration file will be directly generated in `/etc/kubernetes/manifests` +and the static Pod will be enabled: + +```shell +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168.0.3:6443 +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md new file mode 100644 index 00000000000..3e223259781 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 9 +keywords: [sealctl tar, sealctl untar, file compression, file decompression, Sealos commands, archive management, data backup, file migration, command-line tools, Linux utilities] +description: Learn how to use Sealos' sealctl tar and untar commands for efficient file compression and decompression. Ideal for data backup and file migration tasks. +--- + +# Tar and Untar in Sealos + +Sealos provides the `sealctl tar` and `sealctl untar` commands for compressing and decompressing files or directories. +This guide explains how to use these two commands in detail. + +## The `sealctl tar` Command + +The `sealctl tar` command is used to compress a specified directory path into an archive file. Note that it will strip +the parent directory. + +**Command Options:** + +- `--clear`: Whether to delete the source files after compression, default is false. +- `--compression`: Compression algorithm, available options are tar/gzip/zstd/disable, default is disable. +- `-o, --output`: Path of the archive file. + +**Basic Usage:** + +```bash +sealctl tar [flags] [options] +``` + +## The `sealctl untar` Command + +The `sealctl untar` command is used to search for archive files that match a glob pattern in the specified source path ( +`src`) and extract them to the destination path (`dst`). + +**Command Options:** + +- `--clear`: Whether to delete the source files after extraction, default is false. +- `-o, --output`: Path to extract the archive file. + +**Basic Usage:** + +```bash +sealctl untar [flags] [options] +``` + +## Usage Examples + +Here are some examples of using the `sealctl tar` and `sealctl untar` commands: + +**Create a compressed file:** + +```bash +sealctl tar --output=/path/to/archive.tar /path/to/source +``` + +The above command compresses the `source` directory into the `archive.tar` file. + +**Extract a compressed file:** + +```bash +sealctl untar --output=/path/to/destination /path/to/archive.tar +``` + +The above command extracts the `archive.tar` file to the `destination` directory. + +With the `sealctl tar` and `sealctl untar` commands, users can easily compress and decompress files or directories. +These commands are useful tools for file management, particularly in backup and file migration scenarios. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/token.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/token.md new file mode 100644 index 00000000000..1f72b36023f --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealctl/token.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 8 +keywords: [sealctl token, Kubernetes cluster, worker node authentication, token generation, cluster security, node joining, sealos, cluster management, authentication token, Kubernetes security] +description: Learn how to use the sealctl token command to generate authentication tokens for securely adding worker nodes to your Kubernetes cluster with Sealos. +--- + +# Token Management + +The `sealctl token` command is primarily used to generate a token for connecting master and worker nodes in a Kubernetes +cluster. In a Kubernetes cluster, when you want to add a new worker node, you typically need to provide a token for +authentication. This token ensures that only worker nodes with the correct token can join the cluster. + +The `sealctl token` command generates a token for authentication by accepting a configuration file (optional) and a +certificate key (optional) as parameters. By default, if no configuration file and certificate key are provided, the +command uses built-in default settings to generate the token. + +In summary, the `sealctl token` command is used to generate a token for authentication, allowing worker nodes to +securely join a Kubernetes cluster. Using this command simplifies the process of adding nodes to the cluster and ensures +the security of the cluster. + +**Usage** + +```shell +sealctl token [config] [certificateKey] +``` + +**Parameters** + +- `config`: Configuration file (optional). +- `certificateKey`: Certificate key (optional). + +**Examples** + +Generate a token with default parameters: + +```shell +sealctl token +``` + +Generate a token with a custom configuration file and certificate key: + +```shell +sealctl token my-config my-certificate-key +``` diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/_category_.json b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/_category_.json new file mode 100644 index 00000000000..c9cb98244eb --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 1 +} diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md new file mode 100644 index 00000000000..6edb120c9e6 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 11 +keywords: [Sealos, Kubernetes cluster images, application images, cluster-image repository, GitHub Actions, Docker images, configuration images, image build workflow, Kubefile, Helm charts] +description: Learn how to use Sealos' cluster-image repository to build and publish application images for Kubernetes clusters, including Docker and configuration images, using GitHub Actions. +--- + +# Application Cluster Image Usage Guide + +Sealos provides a repository called [cluster-image](https://github.com/labring-actions/cluster-image) on GitHub for +building and publishing application images for Kubernetes clusters. These images can be created by submitting code to +this repository and can be published to `docker.io/labring/` as official application images. It supports building Docker +container images as well as cluster images for applications. + +## Types of Images + +The repository supports three types of image builds: + +- **Application Cluster Images**: These are primarily for building application images using GitHub Actions and support + both amd64 and arm64 architectures. +- **Configuration Cluster Images**: These are mainly for building configuration images using GitHub Actions. They are + not container images and are not architecture-specific. They typically contain configuration scripts or customizations + to default configurations. +- **Docker Images**: These are mainly for building container images using GitHub Actions and support both amd64 and + arm64 architectures. + +## Workflow for Image Builds + +You can trigger image builds directly in the GitHub repository by creating an issue. Here are a few examples: + +- `/imagebuild_dockerimages helm v3.8.2 Key1=Value1,Key2=Value2` +- `/imagebuild_configs coredns v0.0.1` +- `/imagebuild_apps helm v3.8.2` + +The format of the image build commands for each type is `/imagebuild_ [Key=Value,...]`, where +`` can be `dockerimages`, `configs`, or `apps`, `` and `` represent the application name and +version respectively, and `[Key=Value,...]` is optional buildArg parameters used only for the `dockerimages` type. + +## Location of Image Configurations + +You can place your configuration files in the `applications///` directory, including Dockerfiles, +Kubefiles, and init.sh scripts, among others. The init.sh script is typically used for downloading dependencies such as +Helm and kubectl-minio. You can choose to use either a Dockerfile or Kubefile to define your image build logic. + +## Image Build Rules + +The build rules vary slightly for each type of image. Generally, you need to create different subdirectories under the +application directory and place different types of files in them, which Sealos will use to build the images. The +specific rules are as follows: + +1. `charts` directory: Place the Helm charts required for the cluster images. Kubernetes will scan the charts and fetch + the images for building, and the registry directory will be placed at the same level as the Kubefile. +2. `manifests` directory: Place the Kubernetes yaml configurations directly. Kubernetes will scan all the images in the + manifests directory and build the registry directory, which will be placed at the same level as the Kubefile. +3. `images/shim` directory: Store additional image lists and build the registry directory, which will be placed at the + same level as the Kubefile. +4. If templates are required, place files with the `.tmpl` extension in `etc`, `charts`, or `manifests`. These files can + be rendered by the `sealos run` command with environment variables and the `.tmpl` extension will be removed. For + example, a file named `aa.yaml.tmpl` will be rendered as `aa.yaml`. Please ensure that the file names do not conflict + with existing files. +5. The `registry` directory must be placed at the same level as the Kubefile. Otherwise, it will not be copied to the + private repository of master0. Also, ensure that the registry is not stored in a chart, as it may cause slow scanning + by Helm and potentially lead to OOM (out-of-memory) issues during image builds. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/add.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/add.md new file mode 100644 index 00000000000..8c9847d73ec --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/add.md @@ -0,0 +1,65 @@ +--- +sidebar_position: 4 +keywords: [sealos add, cluster nodes, Kubernetes cluster, add control nodes, add regular nodes, cluster management, sealos command-line tool, node addition, cluster expansion, Kubernetes administration] +description: Learn how to use the 'sealos add' command to efficiently add control and regular nodes to your Kubernetes cluster. Explore options and best practices for cluster expansion. +--- + +# Adding Cluster Nodes with `sealos add` + +`sealos add` is a command in the Sealos command-line tool used to add nodes to a cluster. This guide provides detailed +instructions on how to use the command and its options. + +**Note: Make sure the number of control nodes is odd to ensure proper etcd leader election.** + +## Basic Usage + +### Adding Nodes + +To add nodes to the cluster, you can use the `--nodes` option: + +```bash +sealos add --nodes x.x.x.x +``` + +In the above command, replace `x.x.x.x` with the IP address of the node you want to add. + +### Adding Control Nodes + +To add control nodes to the cluster, you can use the `--masters` option: + +```bash +sealos add --masters x.x.x.x +``` + +### Adding Control and Regular Nodes Together + +If you want to add both control nodes and regular nodes to the cluster, you can use the `--masters` and `--nodes` +options together: + +```bash +sealos add --masters x.x.x.x --nodes x.x.x.x +sealos add --masters x.x.x.x-x.x.x.y --nodes x.x.x.x-x.x.x.y +``` + +## Options + +The `sealos add` command provides the following options: + +- `--cluster='default'`: The name of the cluster to perform the add operation. Defaults to `default`. + +- `--masters=''`: The control nodes to be added. + +- `--nodes=''`: The nodes to be added. + +Each option can be followed by an argument. + +## Usage Example + +Here's an example usage that adds a node with the IP address `192.168.0.2` to the cluster: + +```bash +sealos add --nodes 192.168.0.2 +``` + +That's it for the usage guide of the `sealos add` command. We hope this helps you. If you have any questions or +encounter any issues during the process, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/apply.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/apply.md new file mode 100644 index 00000000000..6131d3fe81b --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/apply.md @@ -0,0 +1,89 @@ +--- +sidebar_position: 1 +keywords: [sealos apply, Kubernetes cluster, Clusterfile, cluster images, command-line tool, cluster management, sealos command options, Kubernetes deployment] +description: Learn how to use the 'sealos apply' command to start and manage Kubernetes clusters. Explore options, Clusterfile usage, and best practices for efficient cluster deployment. +--- + +# Starting a Cluster with `sealos apply` + +`sealos apply` is an important command in the Sealos command-line tool used to run cluster images in a Kubernetes +cluster. This guide provides detailed instructions on how to use the command and its options. + +## Basic Usage + +The basic usage of the `sealos apply` command is as follows: + +```shell +$ sealos apply -f Clusterfile +``` + +Clusterfile content: + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + name: default +spec: + # Server IP addresses and roles + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.25.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +``` + +This command will run cluster images in the Kubernetes cluster based on the specified `Clusterfile`. + +## Options + +The `sealos apply` command provides several options to customize its behavior: + +- `-f, --Clusterfile='Clusterfile'`: Specifies the Clusterfile to apply. Defaults to `Clusterfile`. +- `--config-file=[]`: Specifies the path to a custom config file to replace or modify resources. +- `--env=[]`: Sets environment variables to be used during command execution. +- `--set=[]`: Sets values on the command line, usually for replacing template values. +- `--values=[]`: Specifies values files to be applied to the `Clusterfile`, usually used for templating. + +Each option can be followed by one or more parameters. Multiple parameters are separated by commas. + +For example, you can use the `--set` option to set values on the command line: + +```shell +sealos apply -f Clusterfile --set key1=value1,key2=value2 +``` + +This command will set the values of `key1` and `key2` to `value1` and `value2`, and then apply the `Clusterfile`. + +Similarly, you can use the `--values` option to specify a values file: + +```shell +sealos apply -f Clusterfile --values values.yaml +``` + +This command will apply the `Clusterfile` based on the values in the `values.yaml` file. + +**For more examples, please refer to the [Run Cluster](/self-hosting/lifecycle-management/operations/run-cluster/.md) +section.** + +That's it for the usage guide of the `sealos apply` command. We hope this helps you. If you have any questions or +encounter any issues during the process, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/build.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/build.md new file mode 100644 index 00000000000..67df5a4b660 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/build.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 6 +keywords: [sealos build, OCI images, Dockerfile, image building, containerization, Sealfile, Kubefile, build options, image dependencies, Docker Registry] +description: Learn how to use 'sealos build' command to create OCI images with various instruction files, manage dependencies, and optimize your containerization workflow. +--- + +# Building Images with `sealos build` + +The `build` command in Sealos is used to build OCI images using instructions from Sealfiles, Kubefiles, Dockerfiles, or +Containerfiles. This is the fundamental command in Sealos for building cluster images. + +If no parameters are specified, Sealos will use the current working directory as the build context and look for +instruction files. If no Sealfile, Kubefile, Dockerfile, or Containerfile is found, the build will fail. + +Here are some key options for the `build` command: + +1. `--all-platforms`: Attempts to build the image for all supported base image platforms. +2. `--authfile`: Path to the authentication file. +3. `--build-arg`: Provides an `argument=value` to the builder. +4. `--build-context`: Provides additional build context to the builder as `argument=value`. +5. `--creds`: Credentials to access the registry as `[username[:password]]`. +6. `-D, --disable-compression`: Disables layer compression by default. +7. `--env`: Sets environment variables for the image. +8. `-f, --file`: Pathname or URL of the Dockerfile. +9. `--force-rm`: Always removes intermediate containers after a build, even if the build fails. +10. `--format`: Format for the manifest and metadata of the built image. +11. `--from`: Replaces the value of the first FROM instruction in the Containerfile with the specified image name. +12. `--http-proxy`: Passes the HTTP Proxy environment variable. +13. `--isolation`: Process isolation `type` to use, can be 'oci' or 'chroot'. +14. `--max-pull-procs`: Maximum number of goroutines to use for pulling images. +15. `--platform`: Sets the OS/ARCH/VARIANT for the image to the provided value instead of the host's current operating + system and architecture. +16. `--pull`: Pulls the image from the registry, if new or not present in the store. Can be set to false, always, or + never. +17. `-q, --quiet`: Suppresses the build output and image read/write progress. +18. `--retry`: Number of times to retry on push/pull failure. +19. `--retry-delay`: Delay in seconds between retries on push/pull failure. +20. `--rm`: Removes intermediate containers after a successful build. +21. `--save-image`: Saves resolved images from a specific directory in the registry format. +22. `--sign-by`: Signs the image with the GPG key of the specified `FINGERPRINT`. +23. `-t, --tag`: Name and optionally a tag in the 'name:tag' format to apply to the built image. +24. `--target`: Sets the target build stage to build. +25. `--timestamp`: Sets the created timestamp to the specified epoch seconds for reproducible builds. Default is the + current time. + +These options provide flexibility for various build requirements, including platform-specific builds, environment +variable settings, build context management, image signing, and more. With the `--save-image` option, Sealos can +automatically recognize and save the required images (including those resolved from image lists, Helm charts, and +manifests) in the Docker Registry format. + +The process isolation mode `--isolation` supports two parameters: 'oci' and 'chroot'. Choose 'oci' mode if OCI is +supported locally and 'chroot' mode if OCI is not supported. + +The `--save-image` option is used in Sealos build commands to automatically find and save the required images during the +build process. In Sealos, building an image may involve other dependent images. These dependent + +images can come from image lists, Helm charts, or cluster manifests. When using the `--save-image` option, Sealos will +automatically resolve these dependencies based on the build context and save them in the Docker Registry format. + +For example, here is an example using the `--save-image` option: + +```bash +sealos build -t myapp:v1.0.0 -f Dockerfile . +``` + +In this example, Sealos will use the current directory as the build context, read the build instructions from the +Dockerfile, and attempt to build an image tagged as `myapp:v1.0.0`. Additionally, Sealos will resolve all base images +referenced in the Dockerfile's `FROM` instructions and save those images as well. These images will be saved in the +Docker Registry format and can be pushed directly to a Docker Registry. + +If your build context also includes Helm charts or cluster manifests, Sealos will also resolve the images referenced in +those files and save them accordingly. + +Overall, the `--save-image` option provides a convenient way for Sealos to handle image dependencies during the build +process, greatly improving the convenience and efficiency of building images. + +Here are some detailed examples: + +- [Build with Image Manifests](/self-hosting/lifecycle-management/operations/build-image/build-image-image_list.md) +- [Build with Deploy Manifests](/self-hosting/lifecycle-management/operations/build-image/build-image-manifests.md) +- [Build with Helm Charts](/self-hosting/lifecycle-management/operations/build-image/build-image-helm_charts.md) +- [Build with Binary](/self-hosting/lifecycle-management/operations/build-image/build-image-binary.md) +- [Build with go-template](/self-hosting/lifecycle-management/operations/build-image/build-image-go_template.md) +- [Build with exec and scp](/self-hosting/lifecycle-management/operations/build-image/build-image-scp_exec.md) + +With the `build` command in Sealos, you can build OCI images based on various instruction files to provide the required +images for Sealos. This process includes handling various instructions in Dockerfiles or other instruction files, such +as `FROM`, `RUN`, `ADD`, etc., as well as managing image layers, labels, and more. The build process also involves +pulling base images, running commands, saving the results, and more. Each step can be finely controlled and customized +using the options mentioned above to accommodate different build requirements. + +That's the usage guide for the `sealos build` command. We hope this helps you. If you have any questions or encounter +any issues during the process, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/cert.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/cert.md new file mode 100644 index 00000000000..a5d7fabb56e --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/cert.md @@ -0,0 +1,52 @@ +--- +sidebar_position: 3 +keywords: [sealos cert, cluster certificates, API server certificates, Kubernetes certificates, certificate management, alt-names, certificate verification, kubeadm-config, apiserver.crt] +description: Learn how to update Kubernetes cluster certificates using the sealos cert command. Discover options for adding domain names and IP addresses, and verify your updates easily. +--- + +# Updating Cluster Certificates with `sealos cert` + +The `cert` command in Sealos is used to update the API server certificates in a cluster. This guide provides detailed +instructions on how to use this command and its options. + +## Basic Usage + +To add domain names or IP addresses to the certificate, you can use the `--alt-names` option: + +```bash +sealos cert --alt-names sealos.io,10.103.97.2,127.0.0.1,localhost +``` + +In the above command, replace `sealos.io,10.103.97.2,127.0.0.1,localhost` with the domain names and IP addresses you +want to add. + +**Note**: It is recommended to back up the old certificates before performing this operation. + +After executing the `sealos cert` command, the API server certificates in the cluster will be updated. You don't need to +manually restart the API server as Sealos will automatically handle the restart. + +## Options + +The `cert` command provides the following options: + +- `--alt-names='`': Adds domain names or IP addresses to the certificate, e.g., `sealos.io` or `10.103.97.2`. + +- `-c, --cluster='default'`: Specifies the name of the cluster on which to perform the exec operation. Default is + `default`. + +Each option can be followed by an argument. + +## Certificate Verification + +After updating the certificates, you can use the following commands for verification: + +```bash +kubectl -n kube-system get cm kubeadm-config -o yaml +openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text +``` + +The above commands retrieve the kubeadm-config ConfigMap in the kube-system namespace and display detailed information +about the apiserver.crt certificate. + +That concludes the usage guide for the `sealos cert` command. We hope this helps you. If you have any questions or +encounter any issues during the process, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/commands.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/commands.md new file mode 100644 index 00000000000..b9739326dd7 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/commands.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 0 +keywords: [Sealos commands, cluster management, node management, container operations, Kubernetes cluster, cloud-native applications, image registry, Clusterfile, Sealos installation] +description: Comprehensive guide to Sealos commands for managing Kubernetes clusters, nodes, and containers. Learn about cluster operations, image handling, and cloud-native app deployment. +--- + +# Sealos Command Reference + +## Cluster Management Commands + +- `apply`: Runs cluster images within a Kubernetes cluster using Clusterfile. +- `cert`: Updates the certificates of the Kubernetes API server. +- `run`: Easily runs cloud-native applications. +- `reset`: Resets all content in the cluster. +- `status`: Views the status of the Sealos cluster. + +## Node Management Commands + +- `add`: Adds nodes to the cluster. +- `delete`: Removes nodes from the cluster. + +## Remote Operation Commands + +- `exec`: Executes shell commands or scripts on the specified node. +- `scp`: Copies files to the remote location of the specified node. + +## Experimental Commands + +- `registry`: Commands related to the image registry. + +## Container and Image Commands + +- `build`: Builds images using instructions from Sealfile or Kubefile. +- `create`: Creates a cluster but does not run CMD, used for image inspection. +- `inspect`: Inspects the configuration of containers or images. +- `images`: Lists images in local storage. +- `load`: Loads images from a file. +- `login`: Logs into a container registry. +- `logout`: Logs out of a container registry. +- `manifest`: Operates on manifest lists and image indexes. +- `merge`: Merges multiple images into one. +- `pull`: Pulls images from a specified location. +- `push`: Pushes images to the specified destination. +- `rmi`: Removes one or more images from local storage. +- `save`: Saves images to an archive file. +- `tag`: Adds an additional name to a local image. + +## Other Commands + +- `completion`: Generates autocompletion scripts for the specified shell. +- `docs`: Generates API reference documentation. +- `env`: Prints all environment information used by Sealos. +- `gen`: Generates a Clusterfile with all default settings. +- `version`: Prints version information. + +The `--debug` flag in Sealos is a global flag used to enable debug mode for more detailed information about the system's +operation when issues occur. + +For installation instructions, please refer to +the [Sealos Installation Guide](/self-hosting/lifecycle-management/quick-start/installation); for a quick start guide, +please refer to the [Quick Start Guide](/self-hosting/lifecycle-management/quick-start/.md). diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/create.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/create.md new file mode 100644 index 00000000000..6f7e800bafb --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/create.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 6 +keywords: [sealos create, cluster working directory, Sealos command line tool, debugging, image review] +description: Learn how to use the 'sealos create' command to generate a cluster working directory for debugging and image review without executing the actual cluster. +--- + +# Create Working Directory + +`sealos create` is a command in the Sealos command line tool, mainly used for creating the cluster working directory +without executing the CMD, so as to review the image. This guide will detail its usage and options. + +## Basic Usage + +The `sealos create` command is used to create a cluster working directory but does not actually run, mainly used for +debugging or testing. It can output the address of the cluster image, you can check whether the content of the cluster +image is consistent with the expectation. + +```bash +sealos create docker.io/labring/kubernetes:v1.24.0 +``` + +In the above command, `clustername` represents the name of the cluster you want to create. + +## Options + +The `sealos create` command provides the following options: + +- `-c, --cluster='default'`: The name of the cluster to be created but not actually run. The default is `default`. + +- `--platform='linux/arm64/v8'`: Set the operating system/architecture/version of the image to the provided value, + rather than the current operating system and architecture of the host (for example, `linux/arm`). + +- `--short=false`: If true, only print the mount path. + +- `-e, --env=[]`: Specify environment variables used during the rendering of template files. + +Each option can be followed by an argument. + +## Example + +For example, you can use the following command to create a cluster named `mycluster`, but do not actually run it: + +```bash +sealos create -e registryPort=8443 docker.io/labring/kubernetes:v1.24.0 +``` + +This command will create a cluster working directory with an image name of `docker.io/labring/kubernetes:v1.24.0` and +output the address of the cluster image. The `-e registryPort=8443` option specifies the environment variable used +during the rendering of template files, where `registryPort` is set to `8443`. Please note that in this example, the +cluster is not actually run. + +The above is the usage guide for the `sealos create` command, hope it helps. If you encounter any problems during use, +feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/delete.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/delete.md new file mode 100644 index 00000000000..6ff2867edb1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/delete.md @@ -0,0 +1,74 @@ +--- +sidebar_position: 4 +keywords: [sealos delete, cluster node removal, Kubernetes cluster management, delete control node, sealos command line tool] +description: Learn how to use the 'sealos delete' command to remove nodes from your Kubernetes cluster. Explore options for deleting control nodes and regular nodes efficiently. +--- + +# Delete Cluster Node Removal + +`sealos delete` is a command in the Sealos command line tool, mainly used to remove nodes from the cluster. This guide +will detail its usage and options. + +**Note to ensure the number of control nodes is odd to ensure normal election of etcd** + +## Basic Usage + +### Delete Node + +To remove a node from the cluster, you can use the `--nodes` option: + +```bash +sealos delete --nodes x.x.x.x +``` + +In the above command, `x.x.x.x` should be replaced with the IP address of the node you want to delete. If you +accidentally delete the wrong node, you can use the `sealos add` command to recover it: + +```bash +sealos add --nodes x.x.x.x +``` + +### Delete Control Node + +To remove a control node from the cluster, you can use the `--masters` option: + +```bash +sealos delete --masters x.x.x.x +``` + +Please note, if the `--masters` parameter is specified, sealos will delete your control node. + +### Delete Control Node and Node + +If you want to delete both control nodes and nodes at the same time, you can use the `--masters` and `--nodes` options +at the same time: + +```bash +sealos delete --masters x.x.x.x --nodes x.x.x.x +sealos delete --masters x.x.x.x-x.x.x.y --nodes x.x.x.x-x.x.x.y +``` + +## Options + +The `sealos delete` command provides the following options: + +- `--cluster='default'`: The name of the cluster to which the deletion operation applies. The default is `default`. + +- `--force=false`: You can enter a `--force` flag to force delete nodes. + +- `--masters=''`: The control nodes to be removed. + +- `--nodes=''`: The nodes to be removed. + +Each option can be followed by an argument. + +## Usage Example + +Here is a usage example that deletes a node with the IP address of `192.168.0.2`: + +```bash +sealos delete --nodes 192.168.0.2 +``` + +The above is the usage guide for the `sealos delete` command, hope it helps. If you encounter any problems during use, +feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/env.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/env.md new file mode 100644 index 00000000000..2c0a93af56c --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/env.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 7 +keywords: [sealos env, environment variables, Sealos CLI, Docker environment, container configuration, Buildah log level, registry sync, Sealos command-line tool, container development, DevOps] +description: Learn how to use the 'sealos env' command to view and set environment variables for Sealos, enhancing your container development and DevOps workflows. +--- + +# Environment Variables + +`sealos env` is a command in the Sealos command-line tool, used to display the current environment variables supported +by sealos and their current values. + +## Basic Usage + +### Viewing Environment Variables + +To view the environment variables, you can use the `sealos env` command: + +```bash +sealos env +``` + +### Viewing Environment Variables and Descriptions + +To view the environment variables and their descriptions, you can use the `sealos env -v` command: + +```bash +sealos env -v +``` + +## How to Set Environment Variables + +```shell +BUILDAH_LOG_LEVEL=debug sealos images +``` + +```shell +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t xxx . +``` + +That's the usage guide for the `sealos env` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/exec.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/exec.md new file mode 100644 index 00000000000..1e126ecdabe --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/exec.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 5 +keywords: [sealos exec, cluster management, shell commands, remote execution, Kubernetes administration, node selection, cluster operations, DevOps tools, container orchestration, infrastructure management] +description: Learn how to use the sealos exec command for executing shell commands on cluster nodes. Explore options for node selection and see practical examples for efficient cluster management. +--- + +# Execute Command + +`sealos exec` is a command in the Sealos command-line tool, used to execute Shell commands or scripts on specified +cluster nodes. This guide will detail its usage and options. + +## Basic Usage + +The basic `sealos exec` command format is as follows: + +```bash +sealos exec "shell command or script" +``` + +In the above command, `shell command or script` is the Shell command or script you want to execute on the cluster nodes. + +## Options + +The `sealos exec` command provides the following options: + +- `-c, --cluster='default'`: The name of the cluster on which the command will be executed. The default is `default`. + +- `--ips=[]`: Run commands on nodes with specified IP addresses. + +- `-r, --roles='':` Run commands on nodes with specified roles. Currently supports master,node,registry. + +Each option can be followed by one or more parameters. + +## Examples + +For example, you can use the following command to view the contents of the `/etc/hosts` file on all nodes of the default +cluster: + +```bash +sealos exec "cat /etc/hosts" +``` + +If you want to view the contents of the `/etc/hosts` file on nodes with `master` and `node` roles in a cluster named +`my-cluster`, you can use the following command: + +```bash +sealos exec -c my-cluster -r master,node "cat /etc/hosts" +``` + +If you only want to view the contents of the `/etc/hosts` file on a node with the IP address `172.16.1.38`, you can use +the following command: + +```bash +sealos exec -c my-cluster --ips 172.16.1.38 "cat /etc/hosts" +``` + +That's the usage guide for the `sealos exec` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/gen.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/gen.md new file mode 100644 index 00000000000..a9e358e84de --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/gen.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 3 +keywords: [Sealos gen command, Kubernetes cluster configuration, Clusterfile generation, sealos apply, cluster setup, multi-node cluster, SSH configuration, custom cluster settings] +description: Learn how to use the Sealos gen command to generate Kubernetes cluster configurations. Create single-node or multi-node clusters with custom settings and apply them easily. +--- + +# Generate Cluster Configuration + +Sealos' `gen` command is used to generate a Kubernetes cluster configuration file (Clusterfile), which can then be +applied using the `sealos apply` command. The `gen` command can help users quickly generate a basic configuration file, +which can then be modified and adjusted according to their needs. + +Here are the basic usage of `sealos gen` command and some common examples: + +1. Generate a single-node cluster with default configuration: + + ```bash + sealos gen labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 + ``` + +Notice: labring/helm should be set before labring/calico. + +2. Generate a cluster that includes multiple images and specifies the master and worker nodes: + + ```bash + sealos gen labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \ + --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' + ``` + +Notice: labring/helm should be set before labring/calico. + +3. Specify SSH port, for servers using the same SSH port: + + ```bash + sealos gen labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --port 24 --passwd 'xxx' + ``` + + For servers using different SSH ports: + + ```bash + sealos gen labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3:23,192.168.0.4:24 \ + --nodes 192.168.0.5:25,192.168.0.6:25,192.168.0.7:27 --passwd 'xxx' + ``` + +After the Clusterfile is generated, users can modify this file according to their needs. Add or modify environment +variables; modify the cluster cidr configuration. Once the modifications are done, users can use the `sealos apply` +command to create or update the cluster based on this configuration file. + +Example explanations: + +- [Custom Configuration Installation](/self-hosting/lifecycle-management/operations/run-cluster/gen-apply-cluster.md) + +That's the usage guide for the `sealos gen` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/images.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/images.md new file mode 100644 index 00000000000..ed81879d0db --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/images.md @@ -0,0 +1,73 @@ +--- +sidebar_position: 6 +keywords: [sealos images, Docker images, container images, image management, Sealos CLI, image filtering, image listing, Go template, JSON output, container orchestration] +description: Learn how to use the 'sealos images' command to view, filter, and manage Docker images in Sealos. Discover various parameters for efficient image handling and output customization. +--- + +# Image List + +Sealos' `images` command is primarily used to view locally stored images. Users can use it to view all local images or +to filter and view specific images. The command supports various parameters to help users view and manage images more +conveniently. + +## Basic Usage + +The basic `sealos images` command will display all non-intermediate stage local images, for example: + +```bash +sealos images +``` + +This will display all final stage images stored locally. + +## Examples + +Here are some common examples of the `sealos images` command: + +1. Display all images, including intermediate images built: + + ```bash + sealos images --all + ``` + +2. Display a specific image: + + ```bash + sealos images [imageName] + ``` + +3. Display images in a specified Go template format: + + ```bash + sealos images --format '{{.ID}} {{.Name}} {{.Size}} {{.CreatedAtRaw}}' + ``` + +## Parameters + +Here are some common parameters for the `sealos images` command: + +- `-a, --all`: Display all images, including intermediate images built. + +- `--digests`: Display the digests of images. + +- `-f, --filter`: Filter output based on provided conditions. + +- `--format`: Beautify the images printout using a Go template. + +- `--history`: Display the naming history of images. + +- `--json`: Output in JSON format. + +- `--no-trunc`: Do not truncate the output. + +- `-n, --noheading`: Do not print column headings. + +- `-q, --quiet`: Only display image IDs. + +By combining these parameters, users can easily retrieve and manage locally stored images. For example, using the +`--all` parameter displays all images, including intermediate ones; using the `--filter` parameter filters images based +on specific conditions; using the `--json` parameter outputs image information in JSON format, facilitating programmatic +processing, etc. + +That's the usage guide for the `sealos images` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md new file mode 100644 index 00000000000..6ac75af5d6f --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md @@ -0,0 +1,90 @@ +--- +sidebar_position: 6 +keywords: [sealos inspect, container configuration, image configuration, Docker inspection, OCI archive inspection, Go template format, Buildah inspect, container metadata, image metadata, Sealos commands] +description: Learn how to use Sealos' inspect command to view detailed configuration information of containers and images, including metadata, environment variables, and startup commands. +--- + +# Inspect Details + +Sealos' `inspect` command is primarily used to view the configuration information of build containers or built images. +The command supports viewing detailed information about an image or container, including its metadata, environment +variables, startup commands, etc. + +## Basic Usage + +Use the `sealos inspect` command to view the configuration information of a specified container or image. For example, +to view the configuration of a specified container: + +```bash +sealos inspect containerID +``` + +Or to view the configuration of a specified image: + +```bash +sealos inspect --type image imageWithTag +``` + +## Examples + +Here are some common examples of the `sealos inspect` command: + +1. View container configuration: + + ```bash + sealos inspect containerID + ``` + +2. View image configuration: + + ```bash + sealos inspect --type image imageWithTag + ``` + +3. View configuration information of an image ID: + + ```bash + sealos inspect --type image @imageID # Or just input the imageID, '@' is optional + ``` + +4. View configuration information of a remote image repository: + + ```bash + sealos inspect --type image docker://alpine:latest + ``` + +5. View configuration information of an image in a local OCI archive file: + + ```bash + sealos inspect --type image oci-archive:/abs/path/of/oci/tarfile.tar + ``` + +6. View configuration information of an image in a local Docker archive file: + + ```bash + sealos inspect --type image docker-archive:/abs/path/of/docker/tarfile.tar + ``` + +7. Display image environment variables in Go template format: + + ```bash + sealos inspect --format '{{.OCIv1.Config.Env}}' alpine + ``` + +## Parameters + +Here are some common parameters for the `sealos inspect` command: + +- `-f, --format`: Display output results in Go template format. **Template structure + code [InspectOutput](https://github.com/labring/sealos/blob/f8a17787822714c5fdf21f2a75cc86fadb88adfa/pkg/buildah/inspect.go#L189) + ** + +- `-t, --type`: Specify the type to view, which can be a container (`container`) or an image (`image`). + +Depending on your needs, you can combine these parameters to get specific configuration information. For example, using +the `-t` parameter can specify whether you want to view the configuration information of the container or the image; +using the `-f` parameter, you can define a specific output format, which is convenient for processing or parsing the +output results. + +That's the usage guide for the `sealos inspect` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/load.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/load.md new file mode 100644 index 00000000000..0aa247478f5 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/load.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 6 +keywords: [sealos load, image loading, container images, tar archive, offline image import, Kubernetes images, container management, image archiving, sealos command, Docker alternative] +description: Learn how to use the 'sealos load' command to import container images from tar archives, perfect for offline environments or when network access is limited. +--- + +# Load Image + +`sealos load` is a command used to load images from archive files. This is very useful when you need to import images +from existing archive files, especially in environments without a network connection. + +## Usage: + +`sealos load [flags] [options]` + +## Parameters: + +Here are the parameters for the `sealos load` command: + +- `-i, --input=''`: Load image from a tar archive file. + +## Examples: + +- Load an image from an archive file: `sealos load -i myimage.tar` + +Note that when using the `sealos load` command, you need to ensure that the specified archive file exists and is +correctly formatted. If you encounter problems when importing images, you may need to check your archive files to ensure +they have not been corrupted or incorrectly formatted. + +That's the usage guide for the `sealos load` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/login.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/login.md new file mode 100644 index 00000000000..c44b1510b81 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/login.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 6 +keywords: [sealos login, container registry, image repository, authentication, kubeconfig] +description: Learn how to use the sealos login command to access container registries. Discover parameters, usage examples, and troubleshooting tips for seamless image pulling and pushing. +--- + +# Login to Repository + +The `sealos login` command is used to log into the container registry on the specified server. After logging into the +registry, you can pull and push images. + +## Usage: + +`sealos login [flags] [options] registryName` + +## Parameters: + +Here are the parameters for the `sealos login` command: + +- `--authfile=''`: Path to the authentication file. It can be overridden with the REGISTRY_AUTH_FILE environment + variable. + +- `--cert-dir=''`: Use certificates at the specified path to access the image repository. + +- `--get-login=true`: Return the current login user for the registry. + +- `-k, --kubeconfig=''`: Log into the sealos image repository hub.sealos.io using kubeconfig. + +- `-p, --password=''`: Password for the registry. + +- `--password-stdin=false`: Take the password from standard input. + +- `-u, --username=''`: Username for the registry. + +- `-v, --verbose=false`: Write more detailed information to standard output. + +## Examples: + +- Log into the quay.io registry: `sealos login -u myusername -p mypassword quay.io` + +Please note that when using the `sealos login` command, you need to make sure that you provide the correct username and +password, otherwise the login process might fail. If you encounter problems during the login process, you might need to +check your username and password to ensure they have not been entered incorrectly or forgotten. + +That's the usage guide for the `sealos login` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/logout.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/logout.md new file mode 100644 index 00000000000..bdbbd10f0b1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/logout.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 6 +keywords: [sealos logout, image repository, authentication, registry, command line, Docker, container, credentials, security, DevOps] +description: Learn how to use the 'sealos logout' command to securely remove cached credentials for image repositories. Enhance your container management and security practices. +--- + +# Logout from Repository + +The `sealos logout` command is used to remove the locally cached account and password of the image repository on the +specified server. + +## Usage: + +`sealos logout [flags] [options] registryName` + +## Parameters: + +Here are the parameters for the `sealos logout` command: + +- `--authfile=''`: Path to the authentication file. It can be overridden with the REGISTRY_AUTH_FILE environment + variable. + +- `-a, --all=false`: Delete all authentication information. + +## Examples: + +- Logout from the quay.io image repository: `sealos logout quay.io` + +That's the usage guide for the `sealos logout` command, and we hope it has been helpful. If you encounter any problems +during usage, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md new file mode 100644 index 00000000000..0fbb627dc2b --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 6 +keywords: [sealos manifest, image manifest, multi-architecture support, Docker images, OCI images, manifest list, image index, container registry, image management, cross-platform deployment] +description: Learn how to use Sealos manifest commands to create, modify, and push multi-architecture image manifests for flexible Docker and OCI image management across platforms. +--- + +# Image Manifest + +The `manifest` command of Sealos is used to create, modify, and push manifest lists and image indexes. These functions +are mainly used to handle multi-architecture support of images. In Docker and OCI image specifications, manifest lists ( +also known as "fat manifests") or image indexes allow an image tag (like `myimage:latest`) to be used on various +hardware architectures (like amd64, arm64, ppc64le, etc.). + +Here are some of the major `manifest` subcommands: + +1. `create`: Creates a new manifest list or image index. Example: `sealos manifest create localhost/list` +2. `add`: Adds an image to the manifest list or image index. Example: + `sealos manifest add localhost/list localhost/image` +3. `annotate`: Adds or updates information in entries of the manifest list or image index. Example: + `sealos manifest annotate --annotation A=B localhost/list localhost/image` +4. `inspect`: Displays the content of the manifest list or image index. Example: + `sealos manifest inspect localhost/list` +5. `push`: Pushes the manifest list or image index to the registry. Example: + `sealos manifest push localhost/list transport:destination` +6. `remove` and `rm`: Removes entries from the manifest list or image index, or completely deletes the manifest list or + image index. Example: `sealos manifest remove localhost/list sha256:entryManifestDigest` or + `sealos manifest rm localhost/list` + +With the `sealos manifest` command, you can flexibly manage manifest lists or image indexes, providing support for +multi-architecture Docker or OCI images. Users can create custom manifest lists according to their needs, making it +convenient to deploy and run Docker images on different hardware architectures. + +Users who want to build multi-architecture images through the manifest command can refer to the +document [Building Cluster Images that Support Multiple Architectures](/self-hosting/lifecycle-management/operations/build-image/build-multi-arch-image.md). diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/merge.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/merge.md new file mode 100644 index 00000000000..7dbd3080e3d --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/merge.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 6 +keywords: [sealos merge, image merging, Docker images, Kubernetes, container optimization, image layers, application deployment, Dockerfile, build process, image storage] +description: Learn how to use Sealos merge command to combine multiple Docker images, optimize storage, and simplify application deployment in Kubernetes environments. +--- + +# Merge Image Merging + +The primary function of the `merge` command in Sealos is to merge multiple images into one. It does this by reading the +Dockerfiles of each input image, merging the commands and layer structures into a new image. The running logic of this +command is very similar to the `build` command, and many of the parameters are the same. + +This function is very useful when multiple images share layers, as it can reduce the size of the image and save storage +space. Moreover, since the merged image contains all the functionalities of multiple images, it can help simplify +application deployment. + +Here is a basic usage example of `sealos merge`: + +```bash +sealos merge -t new:0.1.0 kubernetes:v1.19.9 mysql:5.7.0 redis:6.0.0 +``` + +In this example, the three images `kubernetes:v1.19.9`, `mysql:5.7.0`, and `redis:6.0.0` are merged into a new image +`new:0.1.0`. + +The `sealos merge` command provides rich options to customize the merging process, such as `--all-platforms` to attempt +to build images for all base image platforms, `--build-arg` to provide parameters to the builder, `--no-cache` to +disable existing cached images, and so on. + +Please note that the `sealos merge` command builds a new image based on the Dockerfiles of each input image. Therefore, +if the Dockerfiles of the input images are incompatible, or there are any build errors, this command may fail. When +using the `sealos merge` command, make sure you understand the Dockerfile of each input image and adjust as needed. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/pull.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/pull.md new file mode 100644 index 00000000000..778842f1112 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/pull.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 6 +keywords: [sealos pull, container image, image repository, pull command, Docker daemon, image download, remote repositories, authentication, decryption key, pull policy] +description: Learn how to use the sealos pull command to efficiently download container images from repositories, with options for authentication, decryption, and custom policies. +--- + +# Pull Image + +The `sealos pull` command is a very useful one that allows you to download images from the container image repository +and store them locally. Users can obtain images by their tags or digests. If no tag is specified, the image with the ' +latest' tag (if it exists) will be downloaded by default. + +By using this command, users can easily download the required images from remote repositories, greatly improving work +efficiency. + +## Usage: + +`sealos pull [flags] [options] imageName` + +## Parameters: + +The following are the parameters of the `sealos pull` command: + +- `-a, --all-tags=false`: Download all tagged images in the repository. + +- `--authfile=''`: The path to the authentication file. The REGISTRY_AUTH_FILE environment variable can be used to + override it. + +- `--cert-dir=''`: The specified path to the certificate for accessing the image repository. + +- `--creds=''`: Use `[username[:password]]` to access the image repository. + +- `--decryption-key=[]`: The key needed to decrypt the image. + +- `--platform=[linux/arm64/v8]`: When choosing an image, prioritize the specified OS/ARCH over the current operating + system and architecture. + +- `--policy='missing'`: Set the policy, the optional values include 'missing', 'always', 'never'. + +- `-q, --quiet=false`: Do not output progress information when pulling images. + +- `--remove-signatures=false`: Do not copy signatures when pulling images. + +- `--retry=3`: The number of retries when the pull fails. + +- `--retry-delay=2s`: The delay between retries when the pull fails. + +## Examples: + +- Pull an image: `sealos pull my-image:latest` + +- Pull an image from the Docker daemon: `sealos pull docker-daemon:my-image:tag` + +- Pull an image from a specific repository: `sealos pull myregistry/myrepository/my-image:tag` + +- Pull multiple images: `sealos pull imageID1 imageID2 imageID3` + +The above is a usage guide for the `sealos push` command, hoping to help you. If you encounter any problems during use, +feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/push.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/push.md new file mode 100644 index 00000000000..702fd333034 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/push.md @@ -0,0 +1,131 @@ +--- +sidebar_position: 6 +keywords: [sealos push, image push, Docker registry, container image, OCI format, image transport, image encryption, custom resources, authentication, compression] +description: Learn how to use the 'sealos push' command to push container images to various destinations, including Docker registries and local storage, with advanced options for encryption and custom resources. +--- + +# Push Image + +`sealos push` is a command in the Sealos command-line tool, used to push images to a specified location. This command is +particularly useful when you need to push local Docker images to a remote image repository. This guide will provide a +detailed introduction to its usage. + +## Basic Usage + +The basic format of the `sealos push` command is as follows: + +```bash +sealos push IMAGE_ID DESTINATION +``` + +In the above command, `IMAGE_ID` is the ID of the image you want to push, and `DESTINATION` is the location where you +want to push it. The `DESTINATION` uses the "transport:details" format. If not specified, the source IMAGE is reused as +the DESTINATION. + +In Sealos, the transport defines the format and location of the source image and the target image during the copying +process. Here are the various transports supported by Sealos: + +1. `containers-storage`: This transport is used for storing and managing containers running locally, such as images of + containers created using Podman or CRI-O. + +2. `dir`: This transport stores the image in a directory in the local file system, the structure of which conforms to + the OCI layout. + +3. `docker`: This transport is used for interacting with Docker registries, such as Docker Hub or any other compatible + private registry. + +4. `docker-archive`: This transport stores the image as a local Docker tar file (`.tar`), which is Docker's native + format. + +5. `docker-daemon`: This transport is used for interacting with the local Docker daemon. It can extract images from the + Docker daemon or push images to the Docker daemon. + +6. `oci`: This transport stores the image in a directory that conforms to the OCI layout, which is an open container + image format. + +7. `oci-archive`: This transport stores the image as a local OCI tar file (`.tar`). + +8. `ostree`: This transport stores the image in an OSTree repository, which is a file system that supports atomic + upgrades and rollbacks. + +9. `sif`: This is the Singularity SIF format, mainly used for high-performance computing and data-intensive + applications. + +Examples: + +- Push an image to a Docker registry: `sealos push my-image:latest docker://my-registry.example.com/my-image:latest` + +- Export an image from the Docker daemon: `sealos push docker-daemon:my-image:latest dir:/path/to/save/` + +- Push an image to local container storage: `sealos push my-image:latest containers-storage:my-new-image:latest` + +## Example + +For example, you can use the following command to push an image to the `registry.example.com` repository: + +```bash +sealos push my_image_id docker://registry.example.com/my_repository:my_tag +``` + +## Optional Parameters + +- `--all`: This parameter is used to push all images referred by the manifest list. + +- `--authfile`: This parameter is used to specify the path to the authentication file. The REGISTRY_AUTH_FILE + environment variable can be overridden. + +- `--cert-dir`: This parameter is used to specify the path to the certificate required to access the registry. + +- `--compression-format`: This parameter is used to specify the compression format to be used. + +- `--compression-level`: This parameter is used to specify the compression level to be used. + +- `--cr-option`: This parameter is used to control whether the image's Custom Resources (CR) are pushed to the target + image repository. + + Specifically, the optional values for this parameter include: + + - "yes": The image and its associated CR will be pushed to the target image repository. + + - "no": Only push the image, do not push any CR. + + - "only": Only push the CR, do not push the image itself. + + - "auto": Automatically decide whether to push based on the actual status of the image and CR. For example, if the + CR has changed or does not exist in the target repository, it will be pushed. + + Please note, this parameter is mainly used when dealing with images containing custom resources (such as Kubernetes + CRD objects), allowing you to more flexibly control the push process of images and CRs. + +- `--creds`: This parameter is used to access the registry, in the form of `[username[:password]]`. + +- `--digestfile`: This parameter, after copying the image, writes the digest of the resulting image to a file. + +- `-D`, `--disable-compression`: This parameter is used to not compress layers. + +- `--encrypt-layer`: This parameter is used to specify the layer to be encrypted. 0-index layer index supports negative + index (for example, 0 is the first layer, -1 is the last layer). If not defined, all layers will be encrypted when the + encryption-key flag is specified. + +- `--encryption-key`: This parameter is used to specify the key needed to encrypt the image, used together with the + encryption protocol (for example, jwe:/path/to/key.pem). + +- `-f`, `--format`: This parameter is used to specify the type of manifest to use in the target (oci, v2s1, or v2s2) ( + default is the source's + +manifest type, with fallback). + +- `-q`, `--quiet`: This parameter is used to not output progress information when pushing the image. + +- `--remove-signatures`: This parameter is used to not copy signatures when pushing the image. + +- `--retry`: This parameter is used to specify the number of retries when the push/pull fails. + +- `--retry-delay`: This parameter is used to specify the delay between retries when the push/pull fails. + +- `--rm`: This parameter is used to delete the manifest list after the push is successful. + +- `--sign-by`: This parameter is used to sign the image using a GPG key with the specified `FINGERPRINT`. + +That's the guide to using the `sealos push` command, and I hope it's helpful to you. If you encounter any problems +during use, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/registry.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/registry.md new file mode 100644 index 00000000000..502b2f38ee9 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/registry.md @@ -0,0 +1,269 @@ +--- +sidebar_position: 8 +keywords: [sealos registry, Docker image repository, registry save, registry serve, registry passwd, registry sync, registry copy, image synchronization, container management, Kubernetes] +description: Explore Sealos registry commands for efficient Docker image management. Learn to save, serve, sync, and copy images across registries, enhancing your container deployment workflow. +--- + +# Registry Image Repository Commands + +## Sealos: Detailed Explanation and User Guide for the `sealos registry save` Command + +The `registry save` command is used to pull remote Docker images to the local and save them in a specified directory. +This is particularly useful for deploying container images in offline or intranet environments. + +When executing the `registry save` command, it will automatically obtain the `sealos login` authentication information +for repository authentication. + +**Usage Guide** + +1. Use context to automatically retrieve images + + Pull and save images in the default manner. This mode will automatically parse the `charts` directory, `manifests` + directory, and `images` directory to get the image list. + + **Usage Example** + + ```shell + sealos registry save --registry-dir=/tmp/registry1 my-context + ``` + +2. Specified image list mode + + Pass the image list using arguments + + **Usage Example** + + ```shell + sealos registry save --registry-dir=/tmp/registry2 --images=docker.io/library/busybox:latest + ``` + +**Options** + +The following options apply to the `save` command and its subcommands: + +- `--max-procs`: The maximum number of parallel processes used to pull images. +- `--registry-dir`: The local directory to save images. +- `--arch`: The target architecture of the image, such as: `amd64`, `arm64`, etc. +- `--images`: The image list to be pulled and saved, separated by commas. For example: "my-image1:latest,my-image2: + v1.0". + +## Sealos: Detailed Explanation and User Guide for the `sealos registry serve` Command + +In the process of managing Docker image repositories, Sealos provides the `sealos registry serve` command to facilitate +user operations. This article will detail the usage methods and examples of the `sealos registry serve` command. + +### Basic Introduction + +The main function of the `sealos registry serve` command is to start a Docker distribution image repository server, +supporting two modes: `filesystem` and `inmem`. + +1. **Filesystem mode**: In this mode, sealctl will run a Docker distribution image repository server for the specified + directory. In this mode, the image data will be stored on the hard drive. + +2. **In-memory mode**: In this mode, sealctl will run a Docker distribution image repository server in memory. In this + mode, the image data is only stored in memory, and the data will be lost after the process exits. + +### Command Parameters + +The `sealos registry serve filesystem ` command supports the following parameters: + +- `--disable-logging`: Disable log output, default is false. +- `--log-level`: Configure log level, default is 'error'. +- `-p, --port`: The port the server listens to, default is a random unused port. + +### Usage Examples + +Here are some usage examples of the `sealos registry serve` command: + +#### Start an image repository server in the filesystem + +```bash +sealos registry serve filesystem --port=5000 +``` + +The above command will start a filesystem image repository server on port 5000. + +#### Start an image repository server in memory + +```bash +sealos registry serve inmem +``` + +The above command will start an in-memory image repository server. The stored data of this server will be lost when the +process exits. + +Through the `sealctl registry serve` command, users can easily manage and operate Docker image repositories. Whether in +the development environment or in the production environment, it is a powerful and easy-to-use tool. + +## Sealos: Detailed Explanation and User Guide of the `sealos registry passwd` Command + +In the process of managing Docker image repositories, Sealos provides the `sealos registry passwd` command to facilitate +users in modifying the password for the cluster registry. It offers a convenient method to help users change the +password of the registry. + +### Basic Usage + +Use the `sealos registry passwd` command to modify the password of the registry. + +```bash +sealos registry passwd +``` + +### Parameters + +Below are the parameters of the `sealos registry passwd` command: + +- `-c, --cluster-name`: Cluster name, the default is 'default'. + +- `-f, --cri-shim-file-path`: Image cri shim file path, if null it will not update the image cri shim file. The default + path is '/etc/image-cri-shim.yaml'. + +- `-p, --htpasswd-path`: Registry password file path. The default path is '/etc/registry/registry_htpasswd'. + +### Usage Steps + +1. Execute the `sealos registry passwd` command, you can specify parameters according to the needs. + +2. According to the command prompt, input the new password. + +3. After the command is successfully executed, the registry's password will be changed to the new password. + +### Demo Explanation + +[![asciicast](https://asciinema.org/a/Qu05jah4ZZmjMuFR4vHEKvBsQ.svg)](https://asciinema.org/a/Qu05jah4ZZmjMuFR4vHEKvBsQ) + +**In the usage process, it will let the user choose the registry type** + +- registry: Binary startup, execute `systemctl restart registry` to restart the image repository. + +- containerd: Containerd startup, execute "nerdctl restart sealos-registry" to restart the image repository. + +- docker: Docker startup, execute "docker restart sealos-registry" to restart the image repository. + +### Notice + +**After changing the registry password, modify the registry password in the Clusterfile** +After changing the registry password, all nodes and services using this registry need to update their configurations to +use the new password for authentication. Otherwise, they will not be able to pull or push images from this registry. + +If you are unsure about how to update the configuration of nodes and services, it is recommended to consult related +documentation or seek professional technical support before changing the registry password. + +## Sealos: Detailed Explanation and User Guide of the `sealos registry sync` Command + +Sealos' `registry sync` command can help you synchronize all images between two registries. This can be used not only +for image migration but also for backing up your images. + +### Basic Command Usage + +Execute the `sealos registry sync` command for image synchronization: + +```bash +sealos registry sync source dst +``` + +Here `source` represents the address of the source registry, and `dst` is the address of the target registry. + +For example, if you want to synchronize all images in the registry with the address of 127.0.0.1:41669 to the registry +with the address of sealos.hub:5000, you should execute the following command: + +```bash +sealos registry sync 127.0.0.1:41669 sealos.hub:5000 +``` + +### Authentication and Permissions + +Before executing the `sealos registry sync` command, please ensure that you have permissions to access the source +registry and the target registry. You can use `sealos login` to authenticate the registry. + +### Synchronization Process + +Please note that image synchronization may take some time, depending on the number and size of images, as well as the +speed of the network. During the synchronization process, please keep the network connected and ensure not to interrupt +the execution of the command before synchronization is complete. + +Importantly, the `sealos registry sync` command supports incremental synchronization. Images that already exist in the +target registry will not be re-synchronized. + +### Parameter Options + +The `sealos registry sync` command also provides some parameter options, allowing you to control the synchronization +process more finely: + +- `--override-arch ARCH`: Use the specified `ARCH` to replace the current machine architecture to select images. + +- `--override-os OS`: Use the specified `OS` to replace the current operating system to select images. + +- `--override-variant VARIANT`: Use the specified `VARIANT` to replace the current architecture variant to select + images. + +- `-a` or `--all`: If the source image is a list, synchronize all images. This is particularly useful in heterogeneous + environments because by default, only images of the current architecture will be synchronized. + +For example, if you want to synchronize all architecture images, you can add the `-a` parameter: + +```bash +sealos registry sync -a 127.0.0.1:41669 sealos.hub:5000 +``` + +The above is a detailed explanation and usage guide for the `sealos registry sync` command. We hope this information +helps you better understand and use this command. If you encounter any problems during use, feel free to ask at any +time. + +## Sealos: Detailed Explanation and User Guide of the `sealos registry copy` Command + +The `registry copy` command in Sealos is used to copy a specified image from one registry to another registry. This can +assist you in migrating or backing up images between different registries. + +### Basic Command Usage + +Use the `sealos registry copy` command for image copying: + +```bash +sealos registry copy source-image dst +``` + +Here `source-image` represents the full name of the source image (including the address and image name), and `dst` is +the address of the target registry. + +For example, to copy an image named `127.0.0.1:41669/my-image:tag` to a registry with the address `sealos.hub:5000`, you +can execute the following command: + +```bash +sealos registry copy 127.0.0.1:41669/my-image:tag sealos.hub:5000 +``` + +### Authentication and Permissions + +Before executing the `sealos registry copy` command, please ensure that you have permissions to access the source image +and the target registry. You can use `sealos login` to authenticate the registry. + +### Copying Process + +Please note that image copying may take some time, depending on the size of the image and the speed of the network. +During the copying process, please keep the network connected and ensure not to interrupt the execution of the command +before the copying is complete. + +### Parameter Options + +The `sealos registry copy` command provides some parameter options, allowing you to control the copying process more +finely: + +- `--override-arch ARCH`: Use the specified `ARCH` to replace the current machine architecture to select images. + +- `--override-os OS`: Use the specified `OS` to replace the current operating system to select images. + +- `--override-variant VARIANT`: Use the specified `VARIANT` to replace the current architecture variant to select + images. + +- `-a` or `--all`: If the source image is a list, copy all images. This is particularly useful in heterogeneous + environments because, by default, only images of the current architecture will be copied. + +For example, if you want to copy all architecture images, you can add the `-a` parameter: + +```bash +sealos registry copy -a 127.0.0.1:41669/my-image:tag sealos.hub:5000 +``` + +The above is the usage guide for the `sealos registry copy` command. We hope it is helpful to you. If you encounter any +problems during use, feel free to ask us any questions. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/reset.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/reset.md new file mode 100644 index 00000000000..1d473493102 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/reset.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 2 +keywords: [sealos reset, cluster reset, Kubernetes cluster management, sealos command-line tool, cluster data clearing] +description: Learn how to use the 'sealos reset' command to reset and rebuild Kubernetes clusters. Explore basic usage, optional parameters, and best practices for efficient cluster management. +--- + +# Reset Cluster + +The `sealos reset` is a command in the Sealos command-line tool for resetting the entire cluster. This command is +particularly useful when you want to completely clear cluster data or rebuild the cluster. This guide will detail how to +use it. + +## Basic Usage + +The basic format of the `sealos reset` command is as follows: + +```bash +sealos reset --cluster cluster_name +``` + +In the above command, `cluster_name` is the name of the cluster you want to reset. + +## Example + +For instance, you can use the following command to reset a cluster named `mycluster`: + +```bash +sealos reset --cluster mycluster +``` + +## Optional Parameters + +- `--force`: This parameter is used to force the reset of the cluster, even if the cluster reset operation has not been + successfully completed. + +```bash +sealos reset --cluster mycluster --force +``` + +- `--masters`: This parameter is used to specify the master nodes to be reset. + +```bash +sealos reset --cluster mycluster --masters master1 +``` + +- `--nodes`: This parameter is used to specify the worker nodes to be reset. + +```bash +sealos reset --cluster mycluster --nodes node1 node2 +``` + +- `-p`, `--passwd`: This parameter is used to provide a password for authentication. + +- `-i`, `--pk`: This parameter specifies the file to read the identity (private key) used for public key authentication. + +- `--pk-passwd`: This parameter is used for the passphrase to decrypt the PEM-encoded private key. + +- `--port`: This parameter is used to specify the port of the remote host to connect to. + +- `-u`, `--user`: This parameter is used to specify the username for authentication. + +```bash +sealos reset --cluster mycluster --user username --pk /root/.ssh/id_rsa --pk-passwd yourpassword +``` + +The above is the usage guide for the `sealos reset` command. We hope it is helpful to you. If you encounter any problems +during use, feel free to ask us any questions. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md new file mode 100644 index 00000000000..fddfc7612b0 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 6 +keywords: [sealos rmi, delete local images, image management, container cleanup, storage optimization, Docker alternative, Kubernetes tools, image pruning, force delete images, multiple image deletion] +description: Learn how to use the 'sealos rmi' command to efficiently delete local images, manage storage, and optimize your container environment with optional parameters for advanced cleanup. +--- + +# Rmi: Delete Local Images + +`sealos rmi` is a command in the Sealos command-line tool that is used to delete one or more images stored locally. This +command can help you clean up useless or outdated images and save storage space. This guide will detail how to use it. + +## Basic Usage + +The basic format of the `sealos rmi` command is as follows: + +```bash +sealos rmi imageID +``` + +In the above command, `imageID` is the ID of the image you want to delete. + +## Example + +For instance, you can use the following command to delete an image with ID `imageID`: + +```bash +sealos rmi imageID +``` + +If you want to delete multiple images, just list all the image IDs in the command line, for example: + +```bash +sealos rmi imageID1 imageID2 imageID3 +``` + +## Optional Parameters + +- `-a`, `--all`: This parameter is used to delete all images. When using this option, the command will not accept any + image IDs. + +```bash +sealos rmi --all +``` + +- `-f`, `--force`: This parameter is used to forcefully delete an image and any containers using that image. + +```bash +sealos rmi --force imageID +``` + +- `-p`, `--prune`: This parameter is used to prune dangling images (images without a tag and not referenced by any + containers). + +```bash +sealos rmi --prune +``` + +The above is the usage guide for the `sealos rmi` command. We hope it is helpful to you. If you encounter any problems +during use, feel free to ask us any questions. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/run.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/run.md new file mode 100644 index 00000000000..1c0ad8589f0 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/run.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 1 +keywords: [sealos run, cluster initialization, Kubernetes cluster, Docker image, multi-image execution, single-node cluster, custom configuration, remote host authentication] +description: Learn how to use the powerful 'sealos run' command for Kubernetes cluster initialization, application installation, and multi-image execution with various configuration options. +--- + +# Run: Execute Cluster Images + +The `run` command of Sealos is a powerful and flexible tool that supports cluster initialization, application +installation, multi-image execution, single-node clusters, and more. Below is a detailed explanation and some usage +examples of the `sealos run` command and its parameters. + +## Command Overview + +``` +sealos run --masters [arg] --nodes [arg] [Options] +``` + +The `` parameter is the name and version of the Docker image you want to run in the cluster. `--masters` and +`--nodes` are the IP lists of the master and node nodes where you want to run this image. + +### Option Explanation + +- `--cluster='default'`: The name of the cluster where the operation is to be run. + +- `--cmd=[]`: Overwrite the CMD instruction in the image. + +- `--config-file=[]`: The path to the custom configuration file, used to replace resources. + +- `-e, --env=[]`: The environment variables set during command execution. + +- `-f, --force=false`: Forcefully overwrite the application in this cluster. + +- `--masters=''`: The master nodes to be run. + +- `--nodes=''`: The node nodes to be run. + +- `-p, --passwd=''`: Authenticate using the provided password. + +- `-i, --pk='/root/.ssh/id_rsa'`: Choose the private key file from which to read the public key authentication identity. + +- `--pk-passwd=''`: The password to decrypt the PEM-encoded private key. + +- `--port=22`: The connection port of the remote host. + +- `-t, --transport='oci-archive'`: Load image transport from a tar archive file. (Optional values: oci-archive, + docker-archive) + +- `-u, --user=''`: The username for authentication. + +## Examples + +1. Create a cluster on your bare-metal servers, specifying the IP list: +``` +sealos run labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +2. Run multiple images: +``` +sealos run labring/kubernetes:v1.24.0 labring/helm:v3.11.3 calico:v3.24.6 \ + --masters 192.168.64.2,192.168.64.22,192.168.64.20 --nodes 192.168.64.21,192.168.64.19 +``` + +3. Specify the InfraSSH port of the server: +``` +sealos run labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --port 24 --passwd 'xxx' +``` + +4. Customize a VIP Kubernetes cluster: +``` +sealos run -e defaultVIP=10.103.97.2 labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +5. Create a single-node Kubernetes cluster: +``` +sealos run labring/kubernetes:v1.24.0 +``` + +6. Create a cluster using custom environment variables: +``` +sealos run -e DashBoardPort=8443 mydashboard:latest --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +These examples demonstrate the power and flexibility of the `sealos run` command, which can be customized and adjusted +according to your needs. + +For more examples, please refer to [Run Cluster](/self-hosting/lifecycle-management/operations/run-cluster.md). diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/save.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/save.md new file mode 100644 index 00000000000..9e07391f889 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/save.md @@ -0,0 +1,48 @@ +--- +sidebar_position: 6 +keywords: [sealos save, image backup, container migration, oci-archive, docker-archive, image storage, Kubernetes images, CLI tool, image archiving, container management] +description: Learn how to use the 'sealos save' command to store and backup container images efficiently. Explore options for different archive formats and multi-image saving. +--- + +# Save: Store Images + +`sealos save` is a command in the Sealos command-line tool used to save images to archive files. This command can help +you conveniently back up and migrate your images. This guide will detail its usage. + +## Basic Usage + +The basic `sealos save` command format is as follows: + +```bash +sealos save -o outputFilename imageName +``` + +In the above command, `outputFilename` is the name of the archive file you want to save, and `imageName` is the name of +the image you want to save. + +## Example + +For example, you can use the following command to save an image named `labring/kubernetes:latest` to an archive file +named `kubernetes.tar`: + +```bash +sealos save -o kubernetes.tar labring/kubernetes:v1.24.0 +``` + +## Optional Parameters + +- `--format`: This parameter is used to specify the transport format for saving the image. The currently available + options are `oci-archive`, `docker-archive`, `oci-dir`, and `docker-dir`. The default value is `oci-archive`. +- `-m`: This parameter can be used to save multiple images at the same time, but it is only applicable to the + `docker-archive` format. + +For example, you can use the following command to save an image named `labring/kubernetes:latest` to an archive file +named `kubernetes.tar` in the `docker-archive` method: + +```bash +sealos save -o kubernetes.tar --format docker-archive labring/kubernetes:v1.24.0 +sealos save -o kubernetes.tar -m --format docker-archive labring/kubernetes:v1.24.0 labring/helm:v3.5.0 +``` + +The above is the usage guide of the `sealos save` command, and we hope it is helpful to you. If you encounter any +problems during use, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/scp.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/scp.md new file mode 100644 index 00000000000..02ab624e9c8 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/scp.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 5 +keywords: [sealos scp, file transfer, cluster management, remote file copy, sealos command, cluster nodes, IP-based copy, role-based copy, sealos CLI, DevOps tool] +description: Learn how to use the sealos scp command for efficient file transfer to cluster nodes. Explore options for IP and role-based copying in Sealos clusters. +--- + +# Scp: Copy Files + +`sealos scp` is a command in the Sealos command-line tool, used for copying files to specified cluster nodes. This guide +will detail its usage and options. + +## Basic Usage + +The basic `sealos scp` command format is as follows: + +```bash +sealos scp "source file path" "destination file path" +``` + +In the above command, `source file path` is the local path of the file you want to copy, and `destination file path` is +the remote node path you want to copy the file to. + +## Options + +The `sealos scp` command provides the following options: + +- `-c, --cluster='default'`: The name of the cluster to which the files should be copied. The default is `default`. + +- `--ips=[]`: Copies the files to nodes with the specified IP addresses. + +- `-r, --roles='':`: Copies the files to nodes with specified roles. + +Each option can be followed by one or more arguments. + +## Examples + +For example, you can use the following command to copy the local file `/root/aa.txt` to `/root/dd.txt` on all nodes in +the default cluster: + +```bash +sealos scp "/root/aa.txt" "/root/dd.txt" +``` + +If you want to copy files on the nodes with the `master` and `node` roles in the cluster named `my-cluster`, you can use +the following command: + +```bash +sealos scp -c my-cluster -r master,node "/root/aa.txt" "/root/dd.txt" +``` + +If you only want to copy files on the node with the IP address `172.16.1.38`, you can use the following command: + +```bash +sealos scp -c my-cluster --ips 172.16.1.38 "/root/aa.txt" "/root/dd.txt" +``` + +The above is the usage guide for the `sealos scp` command, and we hope it is helpful to you. If you encounter any +problems during use, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/tag.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/tag.md new file mode 100644 index 00000000000..a94abeffaba --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/commands/tag.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 6 +keywords: [sealos tag, image management, Docker tagging, container images, Sealos CLI, image naming, Kubernetes images, container orchestration, image tagging, DevOps tools] +description: Learn how to use the 'sealos tag' command to efficiently manage and rename container images in Sealos. Enhance your Kubernetes workflow with this powerful image tagging tool. +--- + +# Tag: Add Image Names + +`sealos tag` is a command in the Sealos command-line tool, used to add one or more additional names to the images stored +locally. This command can help you better manage your images. This guide will detail its usage. + +## Basic Usage + +The basic `sealos tag` command format is as follows: + +```bash +sealos tag imageName newName +``` + +In the above command, `imageName` is the name of the image you want to operate on, and `newName` is the new tag you want +to add. + +## Examples + +For example, you can use the following command to add a new name `firstNewName` to an image named `imageName`: + +```bash +sealos tag imageName firstNewName +``` + +You can also add multiple names at once, for example, add two names `firstNewName` and `SecondNewName`: + +```bash +sealos tag imageName firstNewName SecondNewName +``` + +The above is the usage guide for the `sealos tag` command, and we hope it is helpful to you. If you encounter any +problems during use, feel free to ask us. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md new file mode 100644 index 00000000000..1fb9d1b51f1 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 10 +keywords: [Kubernetes cluster image, Sealos, container runtime interface, image versions, rootfs-type images, Kubernetes deployment, cluster management, container orchestration, CRI options, Sealos documentation] +description: "Explore Sealos' Kubernetes cluster images: types, versions, and CRI options. Learn about rootfs-type images for efficient Kubernetes deployment and management." +--- + +# Kubernetes Cluster Image Documentation + +This document provides an overview of the rootfs-type cluster images offered by Sealos, including the image names, +types, and versions. + +## Image Names + +The official cluster images provided by Sealos include the following: + +1. kubernetes: Kubernetes image with containerd as the container runtime interface (CRI). +2. kubernetes-docker: Kubernetes image with Docker as the CRI. +3. kubernetes-crio: Kubernetes image with Crio as the CRI. + +Currently, Sealos primarily provides Kubernetes-related images and has not yet provided other types of cluster images +such as k3s or k0s. + +## Image Types + +Sealos offers different types of Kubernetes cluster images based on the container runtime interface (CRI): + +1. Kubernetes image with containerd as the CRI. +2. Kubernetes image with Docker as the CRI. +3. Kubernetes image with Crio as the CRI. + +Users can choose the appropriate image type based on their requirements and preferences. + +## Image Versions + +Sealos offers multiple versions of cluster images. Examples include: + +### 1. Development Version + +This version is suitable for users who want to try out the latest features of the project. The development version may +contain new features and improvements that have not been thoroughly tested and may not be as stable. + +Example: `v1.26(v1.26-amd64/v1.26-arm64)` + +### 2. Latest Version + +The latest version is typically more stable than the development version but may not include all the new features. This +version is recommended for most users. + +Example: `v1.26.0(v1.26.0-amd64/v1.26.0-arm64)` + +### 3. Release Version (Including Historical Versions) + +The release version includes historical versions. Release versions have usually undergone rigorous testing and are +considered stable. + +Example: `v1.26.0-4.1.5(v1.26.0-4.1.5-amd64/v1.26.0-4.1.5-arm64)` `4.1.5` is the corresponding version number for +Sealos. + +When choosing an image version, users should consider their requirements and preferences. Additionally, Sealos provides +sub-versions for different processor architectures to meet the needs of users on different hardware platforms. + +## Summary + +This document provides an overview of the rootfs-type cluster images offered by Sealos, including the image names, +types, and versions. Users can select the appropriate image type and version based on their requirements and preferences +to run containers in a Kubernetes cluster. diff --git a/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/sealos.md b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/sealos.md new file mode 100644 index 00000000000..4982be8a0c9 --- /dev/null +++ b/docs/5.0/docs/developer-guide/lifecycle-management/reference/sealos/sealos.md @@ -0,0 +1,19 @@ +--- +sidebar_position: 0 +keywords: [Sealos, cloud operating system, Kubernetes clusters, cloud-native applications, cluster management, container management, image management, cluster images, Sealos user guide, Rootfs cluster images] +description: Explore Sealos, a unified cloud OS for managing Kubernetes clusters and cloud-native apps. Learn about cluster management, containers, and images with our comprehensive user guide. +--- + +# Sealos User Guide + +Sealos is a unified cloud operating system designed to manage cloud-native applications. It provides a set of +command-line tools to help users manage Kubernetes clusters, nodes, perform remote operations, manage containers and +images, and perform other functions. Below are detailed introductions to these commands: + +This chapter provides a user guide for using Sealos, as well as information related to cluster images. + +- Sealos User Guide: For detailed information about each command, including all supported parameters and subcommands, + please refer to the [sealos](/self-hosting/lifecycle-management/reference/sealos/commands.md) reference documentation. +- Cluster Images: + - [Rootfs Cluster Images](/self-hosting/lifecycle-management/reference/sealos/kubernetes-cluster-image.md) + - [Application Cluster Images](/self-hosting/lifecycle-management/reference/sealos/app-cluster-image.md) diff --git a/docs/5.0/docs/developer-guide/sealos/QA.md b/docs/5.0/docs/developer-guide/sealos/QA.md new file mode 100644 index 00000000000..d8475c3065f --- /dev/null +++ b/docs/5.0/docs/developer-guide/sealos/QA.md @@ -0,0 +1,126 @@ +--- +sidebar_position: 3 +keywords: [Sealos Cloud, deployment issues, certificate renewal, domain name change, user registration, kubernetes cluster, iptables, system kernel, networking, resource constraints] +description: Comprehensive guide for Sealos Cloud deployment issues, certificate management, and user registration. Includes solutions for common problems and step-by-step instructions for system administrators. +--- + +# Q&A + +Encountering issues during the deployment and use of Sealos Cloud is not uncommon. To assist you effectively, we have +compiled a list of frequently encountered problems along with comprehensive solutions. + +## Deployment Related Issues + +This section details the problems you may face during the deployment phase and their respective solutions. For issues +not covered here, please consult with us at the [Sealos Community](https://github.com/labring/sealos/discussions). + +### Q1: iptables / ip_forward Concerns + +**Problem Overview**: In some operating systems, such as older versions of Centos and RHEL, iptables or IPv4 IP +forwarding is not enabled by default. This can hinder the creation of iptables rules or the forwarding of packets, +potentially preventing the cluster from starting correctly. + +**Resolution Strategy**: To address this, execute the following commands on each node to activate iptables and IP +forwarding: + +```shell +$ modprobe br_netfilter +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables +$ echo 1 > /proc/sys/net/ipv4/ip_forward +``` + +### Q2: Issues with System Kernel + +- **Problem Overview**: An outdated system kernel can impede the proper startup of the cluster. Also, certain + applications, especially those dependent on MongoDB 5.0, might not function with an older kernel. +- **Resolution Strategy**: Ensure your system's kernel version is at least 5.4 or higher before commencing the + deployment. + +### Q3: System Resource Constraints + +- **Problem Overview**: Limited system resources can lead to deployment delays or even halts. If you encounter prolonged + wait times, it's likely due to insufficient system resources. +- **Resolution Strategy**: Check the resource status of your nodes using `kubectl describe nodes`, focusing on CPU, + memory, and storage availability. + +### Q4: Networking Issues + +- **Problem Overview**: Incorrect server configuration can lead to various network issues during deployment. Common + areas of concern include: + 1. Misconfiguration of http_proxy / https_proxy environment variables; + 2. Inadequate server firewall settings; + 3. Improper server routing configurations; +- **Resolution Strategy**: Troubleshoot network issues by verifying the correctness of these configurations. + +## Certificate and Domain Name Issues + +### Certificate Renewal Process + +Certificates are crucial for the security of your Sealos cluster. Follow these steps to update your certificates, +especially as they approach their expiration date: + +1. **Backup Existing Certificate**: + + On the `master0` node, backup your current certificate. This step is crucial to prevent loss of the certificate + during the update process. Use this command: + + ```shell + $ kubectl get secret -n sealos-system wildcard-cert -o yaml > cert-backup.yaml + ``` + + This will save the `wildcard-cert` certificate in YAML format to `cert-backup.yaml`. + +2. **Storing the New Certificate**: + + Place your new certificate files (.crt and .key) on the `master0` node. + +3. **Updating the Certificate**: + + To update, use the script below, replacing `` and `` with the actual paths of your + new certificate and key files. + + ```shell + #!/bin/bash + # Set Variables + CRT_FILE= + KEY_FILE= + + # Base64 encode the certificate and key files + CRT_BASE64=$(cat $CRT_FILE | base64 -w 0) + KEY_BASE64=$(cat $KEY_FILE | base64 -w 0) + + # Create JSON for update + PATCH_JSON='{"data":{"tls.crt":"'$CRT_BASE64'","tls.key":"'$KEY_BASE64'"}}' + + # Update the Secret using kubectl patch + kubectl patch secret wildcard-cert -n sealos-system -p $PATCH_JSON + ``` + + This script encodes the new certificate in Base64 and updates the Kubernetes cluster's Secret object using + `kubectl patch`. + +### Changing the Domain Name + +Changing a domain name in a Sealos cluster is complex, often requiring adjustments in multiple components and services. +We do not currently provide a comprehensive guide for this process in our documentation. However, future plans include +the release of a Sealos Cluster Management Panel for easier domain name and certificate replacement. + +It's important to note that domain name changes demand deep knowledge of the cluster's network setup and may involve +intricate DNS settings and service discovery. We recommend undertaking such changes only if you have the requisite +expertise or with guidance from a professional. + +### user registration switch + +disabled user register: + +```shell +kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: true/signUpEnabled: false/g' | kubectl apply -f - +kubectl rollout restart deployment desktop-frontend -n sealos +``` + +enabled user register: + +```shell +kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: false/signUpEnabled: true/g' | kubectl apply -f - +kubectl rollout restart deployment desktop-frontend -n sealos +``` diff --git a/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-1.jpg b/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-1.jpg new file mode 100644 index 00000000000..680d572141b Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-1.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-2.jpg b/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-2.jpg new file mode 100644 index 00000000000..8b6a354702c Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/chrome-certificate-2.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-1.png b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-1.png new file mode 100644 index 00000000000..6e2c46692cf Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-1.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-2.jpg b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-2.jpg new file mode 100644 index 00000000000..a99aaeaf5a0 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-2.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-3.jpg b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-3.jpg new file mode 100644 index 00000000000..8a42e6c08c8 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/firefox-export-certificate-3.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-1.jpg b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-1.jpg new file mode 100644 index 00000000000..3a211ccd3e1 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-1.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-2.jpg b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-2.jpg new file mode 100644 index 00000000000..357d5880dbe Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-2.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-3.jpg b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-3.jpg new file mode 100644 index 00000000000..9c33c03204f Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/safari-export-certificate-3.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-cost-center.jpg b/docs/5.0/docs/developer-guide/sealos/images/sealos-cost-center.jpg new file mode 100644 index 00000000000..e8e59ccb870 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-cost-center.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-1.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-1.png new file mode 100644 index 00000000000..790d9cc7a3d Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-1.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-2.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-2.png new file mode 100644 index 00000000000..9f04a466892 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-2.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-3.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-3.png new file mode 100644 index 00000000000..ea555c230e1 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-3.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-4.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-4.png new file mode 100644 index 00000000000..d409c55ba36 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-4.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-5.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-5.png new file mode 100644 index 00000000000..3cde5ae7685 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-5.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-6.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-6.png new file mode 100644 index 00000000000..4a6ef666fb1 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-6.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate.jpg b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate.jpg new file mode 100644 index 00000000000..97dbcc274b2 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate1.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate1.png new file mode 100644 index 00000000000..3f1bfaebdc2 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate1.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate2.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate2.png new file mode 100644 index 00000000000..7c33e2693e9 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate2.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate3.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate3.png new file mode 100644 index 00000000000..609a653a4f1 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate3.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate4.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate4.png new file mode 100644 index 00000000000..6c6a20aadb7 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license-activate4.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/sealos-license.png b/docs/5.0/docs/developer-guide/sealos/images/sealos-license.png new file mode 100644 index 00000000000..aa820a06c10 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/sealos-license.png differ diff --git a/docs/5.0/docs/developer-guide/sealos/images/windows-trust-certificate.jpg b/docs/5.0/docs/developer-guide/sealos/images/windows-trust-certificate.jpg new file mode 100644 index 00000000000..243d0d2d558 Binary files /dev/null and b/docs/5.0/docs/developer-guide/sealos/images/windows-trust-certificate.jpg differ diff --git a/docs/5.0/docs/developer-guide/sealos/installation.md b/docs/5.0/docs/developer-guide/sealos/installation.md new file mode 100644 index 00000000000..8fab95e05c7 --- /dev/null +++ b/docs/5.0/docs/developer-guide/sealos/installation.md @@ -0,0 +1,390 @@ +--- +sidebar_position: 1 +keywords: [sealos cluster, kubernetes installation, self-signed certificates, domain configuration, cloud deployment, nip.io, cert-manager, cluster setup, network considerations, hardware requirements] +description: Learn how to install and configure a Sealos cluster with Kubernetes, including domain setup, certificate management, and network considerations for optimal deployment. +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Install Sealos Cluster + +export const Highlight = ({children, color}) => ( + + {children} + +); + +:::tip + +In the context of large-scale clusters and corporate production +environments, [the enterprise or bespoke editions of the Sealos private cloud](/self-hosting) +come highly recommended. + +::: + +## Before You Begin + +### Hardware + +- Unique hostnames for each cluster node. +- Time synchronization across all nodes. +- Preferably use a fresh operating system for setting up the cluster. **Refrain from installing Docker yourself!** +- Compatible with numerous Linux versions like Ubuntu, Debian, CentOS, Rocky Linux. +- **Ensure a system kernel version of 5.4 or higher**. + +Recommended System Configuration: + +We advise using Ubuntu 22.04 LTS with a kernel version of 5.4 or higher. The specifications are as follows: + +| Operating System | Kernel Version | CPU | Memory | Storage | Masters | Nodes | +|------------------|----------------|-----|--------|---------|------------|-------| +| Ubuntu 22.04 LTS | ≥ 5.4 | 8C | 16GB | 100GB | Odd Number | Any | + +:::info +Kubernetes and Sealos Cloud Operating system require roughly 2 cores (2c) and 2GB of memory (2g) per Master node, and +about 1 core (1c) and 1GB of memory (1g) per Node node. Ensure each node in your cluster is well-equipped for these +system components. +::: + +### Network Considerations + +- All nodes must be interconnected; +- Installation scripts should be run on the **first Master node** of the Kubernetes cluster; **nodes outside the cluster + aren't set up for installations yet**; +- Make sure all nodes are capable of mutual communication. + +### Domain Name Usage + +- A domain name is necessary for accessing Sealos and its services; +- If you lack a domain name, `nip.io` offers a free domain name service. + +### Certificate Requirements + +Sealos uses certificates for secure communication. Without your +certificates, [cert-manager](https://cert-manager.io/docs/) will be employed for auto-certification. + +If you are providing your certificate, it should support the following domains (assuming your domain is +cloud.example.io): + +- `*.cloud.example.io` +- `cloud.example.io` + +## Installation Steps + +We offer a one-click installation script to streamline the deployment process. This script is capable of setting up a +Sealos cluster from scratch or integrating it into an existing Kubernetes cluster (use with caution on pre-existing +clusters). + +:::info +This script is specifically designed for deploying Sealos clusters on "Kubernetes clusters installed via Sealos," and is +not compatible with Kubernetes clusters set up in other ways. + +For instructions on deploying Kubernetes clusters using Sealos, refer +to: [Installing Kubernetes Clusters](/self-hosting/lifecycle-management/quick-start/deploy-kubernetes.md). This method +is compatible with most Kubernetes versions available on [Docker Hub](https://hub.docker.com/r/labring/kubernetes/tags), +except for version 1.28 and higher. +::: + +If your system is new to Kubernetes, **we advise using this script to install both Kubernetes and the Sealos cluster +simultaneously.** + +There are different installation options based on your domain name needs: + +### 1. No public domain, don't want custom domains + +If you don't have a public domain or need custom domains, you can use the free `nip.io` wildcard DNS service. `nip.io` +maps dynamic IP addresses to fixed subdomains, useful for local dev environments. + +It works by taking any IP address as part of a `nip.io` subdomain, and resolving requests back to that IP. For example, +if your intranet IP is `192.168.1.10`, you can use the domain `192.168.1.10.nip.io`. Requests to this domain will +resolve to `192.168.1.10`, eliminating the need to modify local hosts or set up intranet DNS. + +To use nip.io for Sealos, run the below on the first master node and enter prompts: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh +``` + +When prompted for the Sealos Cloud domain name, use a format like `[ip].nip.io`, where [ip] is your Master node's IP. + +After installation, the terminal will display the Sealos access domain and login credentials, as shown below: + +```shell +Sealos cloud login info: +Cloud Version: latest +URL: https://10.214.210.102.nip.io +admin Username: admin +admin Password: sealos2023 +``` + +### 2. Have public domain, want public access + +If you have a public domain and want public Sealos access, you'll need a trusted public SSL/TLS certificate. You can use +acme.sh to automatically issue certs, or get free certs from your domain provider or purchase commercial certificates. + +Place the certificate files in a directory on the first master, like `/root/certs/`. + +:::info + +You'll also need to configure DNS records at your domain provider: + +``` +cloud.example.io A +*.cloud.example.io A +``` + +This maps your domain and subdomains to the first master's public IP. + +::: + +Then run below on the first master, entering prompts: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ +--cloud-domain= \ +--cert-path= \ +--key-path= +``` + ++ `` is your public domain ++ `` is the certificate file path (`.crt` or `.pem`) e.g. `/root/certs/example.crt` ++ `` is the private key file path (`.key` or `.pem`) e.g. `/root/certs/example.key` + +### 3. Have public domain, want internal access + +If you have a public domain but only internal IPs, or only want internal Sealos access, you just need to configure DNS +records resolving to the first master's internal IP: + +``` +cloud.example.io A +*.cloud.example.io A +``` + +Then run the below on the first master, entering prompts: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ +--cloud-domain= +``` + +Where `` is your public domain. + +The installer will use [cert-manager](https://cert-manager.io/docs/) to automatically sign certificates. + +### 4. No public domain, want custom domain + +If you don't have a public domain but need a custom domain, set up internal DNS resolving a custom domain to the first +master's internal IP. + +:::note + +Assuming the first master internal IP is `192.168.1.10`, and your custom domain is `cloud.example.io`. + +::: + +You can use CoreDNS, Reference configuration: + +``` +(global_cache) { + cache { + # [5, 60] + success 65536 3600 300 + # [1, 10] + denial 8192 600 60 + prefetch 1 60m 10% + } +} + +.:53 { + errors + health + ready + + import global_cache + + template IN A cloud.example.io { + answer "{{ .Name }} 60 IN A 192.168.1.10" + fallthrough + } + + forward . 223.5.5.5 + + log + loop + + reload 6s +} +``` + +This resolves `cloud.example.io` and subdomains to the first master internal IP. + +Then run below on the first master, entering prompts: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ +--cloud-domain= +``` + +Where `` is your custom domain. + +The installer uses [cert-manager](https://cert-manager.io/docs/) for certificates. + +## Ensuring Browsers Trust Your Self-Signed Certificate + +When using installation options 1, 3, or 4, as highlighted earlier, your browser won't automatically recognize and trust +your certificate. This leads to a warning message when you try to enter Sealos Cloud: + +![](images/chrome-certificate-1.jpg) + +Continuing to Sealos Cloud despite the warning results in issues like the App icons not appearing correctly, and Apps +failing to launch. + +![](images/chrome-certificate-2.jpg) + +To address this, you'll need to export the self-signed certificate and set up your system to trust it. Follow these +steps to do so. + +### Exporting Self-Signed Certificates + +The process of exporting self-signed certificates differs slightly in various browsers. Here's a guide for exporting +these certificates in some of the most commonly used browsers: + +#### Chrome (includes browsers based on Chromium, like the updated Edge and Brave) + +1. In the address bar, click the "Not Secure" warning on the left side. +2. Select "Certificate is invalid" to bring up a window with certificate information. +3. In this window, go to the "Details" tab. +4. Within "Details", find and click on the "Export" option. +5. Choose a file name and location for saving, then complete the exporting procedure. + +#### Firefox + +1. On the webpage, click on "Advanced". + + ![Firefox Certificate Export Step 1](images/firefox-export-certificate-1.png) + +2. Next, click "View Certificate". + + ![Firefox Certificate Export Step 2](images/firefox-export-certificate-2.jpg) + +3. On the certificate page, select "PEM (certificate)". + + ![Firefox Certificate Export Step 3](images/firefox-export-certificate-3.jpg) + +#### Safari + +1. Select "Show Details" on the page. + + ![Safari Certificate Export Step 1](images/safari-export-certificate-1.jpg) + +2. Click on "View this Certificate". + + ![Safari Certificate Export Step 2](images/safari-export-certificate-2.jpg) + +3. You'll see a window displaying the certificate chain. + + ![Safari Certificate Export Step 3](images/safari-export-certificate-3.jpg) + +4. To export the certificate, drag the one highlighted in red to either your desktop or a specific folder. + +### Trusting Self-Signed Certificates + +#### macOS + +To trust a self-signed certificate on macOS, use the following command: + +```bash +# Assuming the certificate is stored at ~/Downloads/10.214.210.102.nip.io.cer +$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/Downloads/10.214.210.102.nip.io.cer +``` + +You can also trust the certificate through these steps: + +##### 1. Adding the Certificate to Keychain + +1. Open **Keychain Access**, click on the "System" category under "System Keychains." +2. Navigate to the certificate's location in "Finder" and **double-click the certificate file** (usually `.cer`, `.crt`, + or `.pem`). +3. Authenticate with your username and password to allow changes. +4. The certificate is now added to your keychain. + +##### 2. Trusting the Certificate + +1. In Keychain Access, locate and double-click the newly added self-signed certificate in the "System" category. +2. In the certificate window, expand the "Trust" section. +3. Change the setting next to "When using this certificate" from "Use System Defaults" to "Always Trust." +4. Close the window and authenticate if prompted to confirm the changes. +5. The certificate is now trusted. + +:::info Note + +Self-signed certificates, not issued by a third-party Certificate Authority (CA), won't be trusted by other devices. +Manually perform these steps on each device within your company or organization that needs to trust the certificate. + +::: + +#### Windows + +1. Right-click the root certificate file and select "Install Certificate." +2. Choose "Current User" or "Local Machine," then "Next." +3. Select "Place all certificates in the following store," click "Browse," choose "Trusted Root Certification + Authorities," "OK," then "Next." +4. Click "Finish," "Yes," then "OK." + +![](images/windows-trust-certificate.jpg) + +#### Linux + +Linux distributions vary in updating the root certificate store and paths for private certificates. First, copy the +self-signed CA certificate to the designated path, then run the command to update the root certificate store. + + + + + ```bash + # Debian/Ubuntu/Gentoo + $ sudo cp root_ca.crt /usr/local/share/ca-certificates/root_ca.crt + $ sudo update-ca-certificates + $ sudo rm /usr/local/share/ca-certificates/root_ca.crt + $ sudo update-ca-certificates --fresh + ``` + + + + + ```bash + # CentOS/Fedora/RHEL + $ yum install ca-certificates + $ update-ca-trust force-enable + $ cp root_ca.crt /etc/pki/ca-trust/source/anchors/ + $ update-ca-trust + ``` + + + + + ```bash + # Alpine + $ apk update && apk add --no-cache ca-certificates + $ cp root_ca.crt /usr/local/share/ca-certificates/ + $ update-ca-certificates + ``` + + + + + ```bash + # OpenSUSE/SLES + $ cp root_ca.crt /etc/pki/trust/anchors/ + $ update-ca-certificates + ``` + + + diff --git a/docs/5.0/docs/developer-guide/system-design/billing-system.md b/docs/5.0/docs/developer-guide/system-design/billing-system.md new file mode 100644 index 00000000000..4eeb1d57574 --- /dev/null +++ b/docs/5.0/docs/developer-guide/system-design/billing-system.md @@ -0,0 +1,6 @@ +--- +keywords: [billing system, Sealos, cloud platform, usage tracking, payment processing, subscription management, cost optimization, cloud billing, enterprise billing, scalable billing] +description: Explore Sealos' robust billing system for cloud platforms. Learn about usage tracking, payment processing, and subscription management for optimized cloud costs. +--- + +# Billing System \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/system-design/images/application_dark.png b/docs/5.0/docs/developer-guide/system-design/images/application_dark.png new file mode 100644 index 00000000000..403e9223d16 Binary files /dev/null and b/docs/5.0/docs/developer-guide/system-design/images/application_dark.png differ diff --git a/docs/5.0/docs/developer-guide/system-design/images/application_light.png b/docs/5.0/docs/developer-guide/system-design/images/application_light.png new file mode 100644 index 00000000000..500f67bbe58 Binary files /dev/null and b/docs/5.0/docs/developer-guide/system-design/images/application_light.png differ diff --git a/docs/5.0/docs/developer-guide/system-design/images/architecture_dark.png b/docs/5.0/docs/developer-guide/system-design/images/architecture_dark.png new file mode 100644 index 00000000000..6d14555ef4d Binary files /dev/null and b/docs/5.0/docs/developer-guide/system-design/images/architecture_dark.png differ diff --git a/docs/5.0/docs/developer-guide/system-design/images/architecture_light.png b/docs/5.0/docs/developer-guide/system-design/images/architecture_light.png new file mode 100644 index 00000000000..17bf8cf5d6a Binary files /dev/null and b/docs/5.0/docs/developer-guide/system-design/images/architecture_light.png differ diff --git "a/docs/5.0/docs/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" "b/docs/5.0/docs/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" new file mode 100644 index 00000000000..44b16d80d80 Binary files /dev/null and "b/docs/5.0/docs/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" differ diff --git "a/docs/5.0/docs/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" "b/docs/5.0/docs/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" new file mode 100644 index 00000000000..08124bf3e46 Binary files /dev/null and "b/docs/5.0/docs/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" differ diff --git a/docs/5.0/docs/developer-guide/system-design/monitor-system.md b/docs/5.0/docs/developer-guide/system-design/monitor-system.md new file mode 100644 index 00000000000..6c947d3a54b --- /dev/null +++ b/docs/5.0/docs/developer-guide/system-design/monitor-system.md @@ -0,0 +1,6 @@ +--- +keywords: [monitor system, Sealos, Kubernetes monitoring, system performance, observability, metrics collection, log analysis, alerting, dashboard visualization, cloud-native monitoring] +description: Explore Sealos' robust monitor system for Kubernetes clusters. Learn about performance tracking, log analysis, and alerting features for optimal cloud-native observability. +--- + +# Monitor System \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/system-design/system-application.md b/docs/5.0/docs/developer-guide/system-design/system-application.md new file mode 100644 index 00000000000..eb2f7faa976 --- /dev/null +++ b/docs/5.0/docs/developer-guide/system-design/system-application.md @@ -0,0 +1,6 @@ +--- +keywords: [system application, Sealos, containerization, cloud-native, Kubernetes, application management, scalability, microservices, DevOps, cloud computing] +description: Explore Sealos system applications for efficient cloud-native containerization. Learn how to optimize application management and scalability in Kubernetes environments. +--- + +# System Application \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/system-design/system-architecture.md b/docs/5.0/docs/developer-guide/system-design/system-architecture.md new file mode 100644 index 00000000000..6eb88755de2 --- /dev/null +++ b/docs/5.0/docs/developer-guide/system-design/system-architecture.md @@ -0,0 +1,6 @@ +--- +keywords: [system architecture, Sealos, cloud native, distributed systems, microservices, scalability, containerization, Kubernetes, infrastructure design, DevOps] +description: Explore Sealos' system architecture for cloud-native environments. Learn about distributed systems, microservices, and scalable infrastructure design for modern applications. +--- + +# System Architecture \ No newline at end of file diff --git a/docs/5.0/docs/developer-guide/system-design/user-system.md b/docs/5.0/docs/developer-guide/system-design/user-system.md new file mode 100644 index 00000000000..3bcb6451b72 --- /dev/null +++ b/docs/5.0/docs/developer-guide/system-design/user-system.md @@ -0,0 +1,6 @@ +--- +keywords: [user system, Sealos, authentication, authorization, identity management, access control, user roles, permissions, security, cloud native] +description: Explore Sealos' user system for robust authentication, authorization, and identity management in cloud-native environments. Learn about access control and security features. +--- + +# User System \ No newline at end of file diff --git a/docs/5.0/docs/images/overview-1.png b/docs/5.0/docs/images/overview-1.png new file mode 100644 index 00000000000..af1a5bfadae Binary files /dev/null and b/docs/5.0/docs/images/overview-1.png differ diff --git a/docs/5.0/docs/images/overview-2.jpeg b/docs/5.0/docs/images/overview-2.jpeg new file mode 100644 index 00000000000..dc2a48c6c65 Binary files /dev/null and b/docs/5.0/docs/images/overview-2.jpeg differ diff --git a/docs/5.0/docs/images/sealos-desktop.webp b/docs/5.0/docs/images/sealos-desktop.webp new file mode 100644 index 00000000000..8a1e98ad2d8 Binary files /dev/null and b/docs/5.0/docs/images/sealos-desktop.webp differ diff --git a/docs/5.0/docs/msa/privacy-policy.md b/docs/5.0/docs/msa/privacy-policy.md new file mode 100644 index 00000000000..6c8a67e4766 --- /dev/null +++ b/docs/5.0/docs/msa/privacy-policy.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 2 +--- + +# Sealos Cloud Privacy Policy + +We prioritize your privacy immensely. This policy details the collection, use, disclosure, and protection of your +personal information when you utilize our services. Please thoroughly understand its contents. + +**Information Collection** + +1. We may gather your personal details like name, phone number, email, and address during registration or service usage. +2. We also collect data produced during service use, such as operational logs, IP addresses, and device types. +3. For enhanced user experience, technologies like cookies may be employed to store information related to your service + interaction. + +**Information Usage** + +1. The handling of your personal data adheres to legal regulations and user agreements. +2. We utilize the information for improving service quality, innovating new products, and other similar purposes. +3. Collected data might be used for delivering service-related notifications and advertisements. + +**Disclosure of Information** + +1. Your personal data will not be shared with third parties, except under these circumstances: + + 1. With your prior agreement; + 2. When legally or regulatorily required; + 3. To uphold our or other users' legal rights. + +2. We may share your information with affiliated entities or partners, ensuring data security through strict + confidentiality. + +**Protection of Information** + +1. We apply various security measures, like encryption and access control, to prevent unauthorized data access, use, or + disclosure. +2. Regular safety assessments are conducted on stored personal data to guarantee its security. +3. Should a data leak or similar security incident occur, we'll immediately implement emergency measures and inform you + as required by law. + +**User Rights** + +1. You have complete authority to access, correct, or delete your personal data at any time. +2. Opting out of data collection can limit your access to certain service features. +3. You may request a halt in processing your personal data, which might affect service continuation. + +**Privacy Policy Updates** + +1. We may periodically update this policy, and any changes will be published on our service page. Continuing service use + implies acceptance of any updated terms. +2. Regularly reviewing this policy is encouraged to stay informed about your data protection. + +**Minor Protection** + +Minors' data protection is crucial to us. If you're a minor, please engage with our services under guardian supervision, +ensuring proper data management. + +**Cross-border Data Transfer** + +Considering our servers' diverse locations, your data may be transferred and processed internationally. We assure that +cross-border data remains securely protected. + +**Contact Us** + +1. For any questions, suggestions, or complaints about this policy, please reach us via email fanux@sealos.io +2. We are committed to quickly resolving any issues you raise. \ No newline at end of file diff --git a/docs/5.0/docs/msa/terms-of-service.md b/docs/5.0/docs/msa/terms-of-service.md new file mode 100644 index 00000000000..0120c1a7877 --- /dev/null +++ b/docs/5.0/docs/msa/terms-of-service.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 1 +--- + +# Sealos Cloud Terms of Service + +These Sealos Cloud Terms of Service (this “Agreement”) are entered into by and between you and Zhuhai Huanjie Cloud +Computing Co., Ltd. (referred to as “we/us” or "the Company") regarding the use of our cloud services (hereafter +referred to as "the Service"). We urge you to read and understand every clause, particularly those concerning +limitations of our liability, restrictions on your rights, and the terms about dispute resolution and legal +jurisdiction. If any aspect of this agreement is not acceptable to you, refrain from registering for or using the +Service. + +**Article 1: Scope of Services** + +1. We offer a range of internet-based IT services, including but not limited to storage, computation, and network + transmission. +2. Technical support and customer assistance will be provided to enhance your experience with the Service. +3. We reserve the right to modify, suspend, or discontinue any or all aspects of the Service without any obligation to + you. + +**Article 2: Account Registration and Management** + +1. Prior to using the Service, registering an account is mandatory. You must ensure that the information provided at + registration is accurate and updated regularly. +2. The security of your account credentials is your responsibility. Any misuse of your account should be reported to us + immediately. +3. We hold the right to inspect your account and, if irregularities are detected, may halt or terminate the services + provided to you. + +**Article 3: Usage Guidelines** + +1. The Service must not be used for illegal activities or in ways that infringe upon the rights of others, including + intellectual property rights and confidentiality breaches. +2. The Service must not be used for malicious registration of accounts, whether for profit, speculation, or other + purposes. +3. Dissemination of illegal, harmful, or malevolent content via the Service is strictly prohibited. +4. You are liable for adhering to all relevant laws and the terms of this agreement, including the responsibility for + the content shared and outcomes arising from your use of the Service. + +**Article 4: Fees and Payment** + +1. You agree to the fee structure associated with the Service, as outlined in our published rates. +2. We may revise the fee structure based on market conditions, notifying you in advance. Continued use of the Service + implies agreement to the revised fees. +3. Non-payment of fees may lead to the suspension or termination of the Service, and we retain the right to seek + compensation. + +**Article 5: Disclaimer and Limitation of Liability** + +1. The Service is provided based on existing technology and conditions, and we do not guarantee uninterrupted, + completely secure, or error-free service. +2. We are not liable for Service disruptions or unavailability due to force majeure. +3. We bear no responsibility for loss or damage of data caused by your actions. + +**Article 6: Privacy Policy** + +Your agreement to and compliance with our privacy policy, an integral part of this agreement, is required. Please refer +to the detailed "Privacy Policy" section below. + +**Article 7: Intellectual Property Rights** + +1. The intellectual property of the Service and all related materials, including software and documentation, is owned by + us. Unauthorized reproduction, distribution, or reverse engineering is prohibited. +2. While you retain intellectual property rights over your data and content generated within the Service, you grant us + permission for necessary operations such as storage and backup to facilitate the Service. + +**Article 8: Agreement Termination** + +1. Violation of any terms of this agreement permits us to cease providing the Service immediately and to pursue legal + remedies. +2. You can terminate this agreement by requesting the cancellation of your account. + +**Article 9: Dispute Resolution and Governing Law** + +1. This agreement is governed by the laws of the People's Republic of China. Disputes arising from this agreement should + be resolved through negotiation; failing that, legal action may be pursued in a competent court. +2. The agreement includes provisions for resolving disputes and the applicable legal framework. + +**Article 10: Network Security** + +1. You bear the consequences for any services provided through the platform that violate national laws. +2. You are responsible for overseeing the services you offer and bear consequences for any illegal activities conducted + by your users. +3. Should we discover your involvement in illegal activities, legal action will be taken and evidence provided to the + authorities. + +**Article 11: Additional Provisions** + +1. Should parts of this agreement become invalid due to legal conflicts, it does not affect the validity of the + remaining terms. +2. The Company retains the ultimate interpretive authority over this agreement and the privacy policy. For inquiries, + please contact us. \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos1.png b/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos1.png new file mode 100644 index 00000000000..7313d36f548 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos1.png differ diff --git a/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos2.png b/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos2.png new file mode 100644 index 00000000000..32f0fb67f31 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/ai-applications/imgs/sealos2.png differ diff --git a/docs/5.0/docs/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md b/docs/5.0/docs/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md new file mode 100644 index 00000000000..1b4b1f6ebdb --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +keywords: [FastGPT, AI Knowledge Base, Sealos, FastGPT installation, deploy FastGPT] +description: Quick and easy installation of FastGPT AI Knowledge Base on Sealos. No server needed, deploy in minutes and start using immediately. +--- + +# Quick Installation of FastGPT AI Knowledge Base + +No server, no magic, no domain name, click to deploy 👇 + +[![](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3DFastGPT) + +The database needs to be deployed. After the deployment, you need to wait 2 to 4 minutes to access the database. The +minimum configuration is used by default, and the first access is a little slow. + +![](imgs/sealos1.png) + +## Run + +Click on the [external address] provided by sealos to use it. The login user name is root, and the password is the newly +set environment variable (1234 in the figure above) + +![](imgs/sealos2.png) \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/baas/install-fireboom.md b/docs/5.0/docs/quick-start/examples/baas/install-fireboom.md new file mode 100644 index 00000000000..6b49a051cea --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/baas/install-fireboom.md @@ -0,0 +1,109 @@ +--- +keywords: [Fireboom, visual API development, Sealos, application deployment, full-stack development, declarative programming, API endpoint, persistent storage, Swagger] +description: Quick installation guide for Fireboom on Sealos. Learn how to deploy and configure Fireboom, a visual API development platform, with step-by-step instructions. +--- + +# Quick Installation of Fireboom + +[Fireboom](https://fireboom.io) is a visual API development platform designed for developers, providing a declarative +development framework, a visual editing suite, and a hook mechanism. + +Official website: https://fireboom.io + +**Features** + +- Minute-level delivery: Reduce the interface development time from 2 days to 2 minutes in traditional mode. + +- Front-end to full-stack: Visual development significantly reduces the threshold for interface development, allowing + front-end developers to easily become full-stack developers. + +- Back-end without bricklaying: Declarative programming avoids copy and paste, reduces the probability of bugs, and + allows back-end developers to focus on business development. + +## Step 1: Create a New Application + +- Open the "Application Management" application in the [Sealos](https://cloud.sealos.io) desktop environment. + +![](../images/fireboom/1-1.png) + +- In "Application Management", click "Create New Application" to create a new application. + +## Step 2: Application Deployment + +- Basic Configuration: + + - Application Name (custom): fireboom + + - Image Name (default latest version): fireboomapi/fireboom_server:latest + + - CPU (recommended): 2 Core (minimum 1 Core) + + - Memory (recommended): 4 G (minimum 512 M) + +- Deployment Mode: + + - Number of Instances (custom): 1 + +![](../images/fireboom/2-1.png) + +- Network Configuration: + + - Control Panel: 9123 + - API Endpoint: 9991, enable external access + +![](../images/fireboom/2-2.png) + +- Advanced Configuration: + + - Command Settings: + - Parameter Settings: dev (dev for development mode, start for production mode) + + - Persistent Storage: + + - Metadata: /fbserver/store + - Uploaded Files: /fbserver/upload + +![](../images/fireboom/2-3.png) + +## Step 3: Deploy the Application + +1. Click "Deploy Application" to start deploying the application. + +![](../images/fireboom/3-1.png) + +2. Click "Details" to check. When the STATUS of the application changes from Pending to Running, it means that the + application has been successfully launched. + +![](../images/fireboom/3-2.png) + +## Step 4: Access the Application + +- Access the Control Panel: Domain corresponding to 9123 + +![](../images/fireboom/4-1.png) + +- Access the API Endpoint: Domain corresponding to 9991 + +``` +status ok +``` + +## Step 5: Configure Fireboom (optional) + +After setting, you can easily use the Swagger document~ + +1. View the public address of the API: Settings -> System + +![](../images/fireboom/5-1.png) + +2. Modify it to the public domain of the API endpoint, corresponding to 9991 + + - Static Value: Select static value and set it to the public domain of the **API Endpoint** + - Environment Variable: Go to Environment Variables, find FB_API_PUBLIC_URL and set it to the public domain of the * + *API Endpoint** + +![](../images/fireboom/5-2.png) + +3. Use the Swagger document to test the API + +![](../images/fireboom/5-3.png) \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/blog-platform/install-halo.md b/docs/5.0/docs/quick-start/examples/blog-platform/install-halo.md new file mode 100644 index 00000000000..c85753930c6 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/blog-platform/install-halo.md @@ -0,0 +1,165 @@ +--- +sidebar_position: 2 +keywords: [Halo Blogging Platform, Sealos, PostgreSQL deployment, open-source website tool, Halo installation] +description: Quickly deploy the Halo Blogging Platform on Sealos with PostgreSQL. Follow our step-by-step guide for seamless setup and management. +--- + +# Quick Installation of Halo Blogging Platform + +Deploy Halo Blogging Platform swiftly on Sealos + +![](../images/halo_img-1.png) + +[Halo](https://github.com/halo-dev/halo) is a powerful and easy-to-use open-source website building tool. +This article will introduce how to deploy Halo on Sealos, while deploying PostgreSQL on Sealos can help you easily +manage and maintain the database to meet different business needs. + +## Step 1: Deploy PostgreSQL on Sealos + +### First, open [Sealos](https://cloud.sealos.io) and click on "More Apps" to enter the PostgreSQL deployment interface: + +![](../images/halo_img-2.png) + +### Fill in the configuration + +In the PostgreSQL deployment interface, click on "Create Cluster" and fill in the relevant configuration information as +prompted. + +![](../images/halo_img-3.png) + +After entering the corresponding configuration, click on "Create Cluster": + +![](../images/halo_img-4.png) + +### Check the database configuration: + +![](../images/halo_img-5.png) + +Save the generated configuration containing the database username, password, and connection method for use in the +following Halo configuration: + +![](../images/halo_img-6.png) + +> The PostgreSQL configuration can be seen in the image as follows: +> +> Username: root +> +> Password: jxidRwmY82eeuFa01tHN28msb86woounM0QMbyl1jhwzKxT9IDqlNkFfyy4R34G3 +> +> pg DNS name: acid-halo-pg.ns-sy32q9p9.svc.cluster.local:5432 + +## Step 2: Deploy Halo on Sealos + +### Open App Launchpad + +![](../images/halo_img-7.png) + +![](../images/halo_img-8.png) + +### Fill in the configuration + +- Customize the application name + +- Set the image name to `halohub/halo:2.5` + +- CPU and storage should be configured according to actual conditions, memory requires 500Mi to start Halo, you can + refer to the official [prepare](https://docs.halo.run/getting-started/prepare) + +- Expose port should be 8090. At the same time, setting it to external network access will automatically configure an + exit domain for the application for external network access, and you also need to configure this address in Halo + +- Environment variables include database configuration and other related configurations. It is important to note that + you need to configure the database connection information based on the username, password, and DNS you set in Step 1. + Additionally, you need to configure the username and password for the super administrator of Halo. + +Configure Halo environment variables as follows: + +```Bash +spring.sql.init.platform=postgresql +spring.r2dbc.url=r2dbc:pool:postgresql://acid-halo-pg.ns-sy32q9p9.svc.cluster.local:5432/halo +spring.r2dbc.username=root +spring.r2dbc.password=jxidRwmY82eeuFa01tHN28msb86woounM0QMbyl1jhwzKxT9IDqlNkFfyy4R34G3 +halo.external-url=tmtdvfjiyyfh.cloud.sealos.io +halo.security.initializer.superadminusername=root +halo.security.initializer.superadminpassword=sealos +``` + +Detailed explanation of environment variable configuration: + +| Parameter Name | Description | +|----------------------------------------------|----------------------------------------------------------------------------------------------------------| +| spring.r2dbc.url | Database connection address, see Database Link Format below for details | +| spring.r2dbc.username | Database username | +| spring.r2dbc.password | Database password | +| spring.sql.init.platform | Database platform name, supports postgresql, mysql, h2 | +| halo.external-url | External access link, if you need public network access, you need to configure the actual access address | +| halo.security.initializer.superadminusername | Initial super administrator username | +| halo.security.initializer.superadminpassword | Initial super administrator password | + +Database link format (here we use the postgresql format): + +| Connection Method | Connection Address Format | spring.sql.init.platform | +|-------------------|------------------------------------------------------------------------------------|--------------------------| +| PostgreSQL | r2dbc:pool:postgresql://`{HOST}`:`{PORT}`/`{DATABASE}` | postgresql | +| MySQL | r2dbc:pool:mysql://`{HOST}`:`{PORT}`/`{DATABASE}` | mysql | +| MariaDB | r2dbc:pool:mariadb://`{HOST}`:`{PORT}`/`{DATABASE}` | mysql | +| H2 Database | r2dbc:h2:file:///`${halo.work-dir}`/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE | h2 | + +### Network configuration + +![](../images/halo_img-9.png) + +### Environment variable configuration + +![](../images/halo_img-10.png) + +### Configure Persistent Storage Volume + +Mount `/root/.halo2` directory to persist Halo data: + +![](../images/halo_img-11.png) + +## Step 3: Access Halo via the Public Network + +After successfully launching the application, you can access Halo through the public network address for configuration: + +![](../images/halo_img-12.png) + +![](../images/halo_img-13.png) + +### **Initialize Halo** + +![](../images/halo_img-14.png) + +![](../images/halo_img-15.png) + +### **First Halo:** + +![](../images/halo_img-16.png) + +![](../images/halo_img-17.png) + +![](../images/halo_img-18.png) + +## FAQ + +### Forgot Password + +#### Enter the App Launchpad and click on "Logs": + +![](../images/halo_img-19.png) + +![](../images/halo_img-20.png) + +You can see the following information in the logs: Username: `admin` Password: `QTu2J2xgUQ3ngqUo` + +#### Alternatively, you can view the logs by executing the following command in the terminal: + +![](../images/halo_img-21.png) + +``` +root@td3q8uc46:~# kubectl logs halo-0 | grep 'Generated random password:' | tail -1 +2023-05-30T13:32:16.942+08:00 INFO 7 --- [-controller-t-1] r.h.app.security.SuperAdminInitializer : === Generated random password: QTu2J2xgUQ3ngqUo for super administrator: admin === +``` + +![](../images/halo_img-22.png) \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/blog-platform/install-wordpress.md b/docs/5.0/docs/quick-start/examples/blog-platform/install-wordpress.md new file mode 100644 index 00000000000..d40e234680c --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/blog-platform/install-wordpress.md @@ -0,0 +1,121 @@ +--- +sidebar_position: 1 +keywords: [WordPress installation, Sealos, MySQL database, WordPress setup, CMS deployment] +description: Quick and easy WordPress installation with Sealos. Learn how to set up WordPress and MySQL database for a seamless CMS deployment. +--- + +# Quick Installation of WordPress + +[WordPress](https://github.com/WordPress/WordPress) is a powerful, user-friendly and open source content management +system (CMS) that can be used to publish websites, news, blogs and other content online. It provides convenient methods +for content editing, publishing and updating, and can also be highly customized through themes and plugins. WordPress +has become a very successful and popular CMS system, with over 30 million websites built on WordPress worldwide. + +> By deploying **WordPress** with **Sealos**, you can greatly reduce deployment time and start users' content publishing +> journey at lightning speed. + +WordPress requires a MySQL database to be installed and used together. As a best practice for using Sealos, it is +recommended to deploy the MySQL database independently using a database application, and quickly install WordPress based +on the independent database. + +## Create MySQL instance + +Open the **Database** application in the [Sealos](https://cloud.sealos.io) desktop environment, quickly set up the +required database instance and wait for the database deployment to be completed. + +![](../images/wordpress_15.png) + +![](../images/wordpress_16.png) + +![](../images/wordpress_17.png) + +## Create a New Database + +When installing a MySQL instance through the **Database** application, user-defined databases are not automatically +created. When connecting an application to the MySQL database, you need to manually create the corresponding database in +the MySQL instance. + +You can access the database terminal command line in the following ways: + +![](../images/wordpress_12.png) +![](../images/wordpress_13.png) + +Alternatively, you can access the database terminal command line using the following methods: + +`mysql -u username -p -h yourhost` + +![](../images/wordpress_14.png) + +After successfully connecting to the database, you can create a new database using the following command: + +`CREATE DATABASE yourdb;` + +At this point, you have manually created a user-defined database in the MySQL instance. + +## App Launchpad + +Click on App Launchpad to enter the installation interface. + +![](../images/wordpress_1.png) + +## Basic Configuration + +Begin by setting a custom application name and selecting the image to install. Sealos supports both public and private +image sources. In this example, the official image source is used, and if no image version is specified, the latest +version will be pulled by default. + +Next, configure CPU and memory resources for WordPress. WordPress is very lightweight, and a small amount of resources +is sufficient to ensure the normal operation of the program. + +![](../images/wordpress_8.png) + +## NetWork Configuration + +For network configuration, enable external access, and Sealos will automatically assign an exit domain name for users to +access from the internet. If the user has already registered their custom domain, they can create a CNAME record +pointing to the assigned exit domain name, allowing the custom domain to be used to access the installed application. + +Note: In subsequent demonstrations, a randomly generated exit domain name by Sealos will be used. + +![](../images/wordpress_9.png) + +## Advanced Configuration + +In the advanced configuration, you need to configure the environment variables for WordPress based on the actual +database situation. + +In the advanced configuration, you need to set environment variables and local storage for WordPress. + +Common WordPress environment variables are shown below: + +```Plain +WORDPRESS_DB_HOST IP address of the database instance +WORDPRESS_DB_USER Database user for connection +WORDPRESS_DB_PASSWORD User password required for connecting to the database +WORDPRESS_DB_NAME Name of the connected database +``` + +Based on the previously installed MySQL example, you can configure the environment variables as follows: + +```Plain +WORDPRESS_DB_HOST Database IP Address +WORDPRESS_DB_USER Database username +WORDPRESS_DB_PASSWORD Database password +``` + +The storage volume mount point for the official WordPress image is: /var/www/html. Users can allocate storage space for +the application according to their needs. + +With this, WordPress is also successfully installed. Click on the details, and you can successfully access it through +the external network address. + +![](../images/wordpress_10.png) + +Click on the link, and the following page shows that the installation was successful: + +![](../images/wordpress_11.png) + +**Note: If the deployment fails, first check whether the user-defined database that WordPress is trying to access exists +in the MySQL instance.** + + diff --git a/docs/5.0/docs/quick-start/examples/dial-testing-system/install-uptime-kuma.md b/docs/5.0/docs/quick-start/examples/dial-testing-system/install-uptime-kuma.md new file mode 100644 index 00000000000..8f21bddc3cf --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/dial-testing-system/install-uptime-kuma.md @@ -0,0 +1,69 @@ +--- +sidebar_position: 1 +keywords: [Uptime Kuma, server monitoring, open-source monitoring, Sealos, application deployment] +description: Quickly install Uptime Kuma for real-time server monitoring with Sealos. Follow these steps to deploy and configure your application efficiently. +--- + +# Quick Installation of Uptime Kuma + +![](../images/uptimekuma_img-10.png) + +[Uptime Kuma](https://github.com/louislam/uptime-kuma) is an open-source and easy-to-use server monitoring tool. It +helps you monitor the real-time status, response time, and other key metrics of your server to ensure that it always +remains in optimal condition. If you want to quickly install Uptime Kuma, follow these steps: + +### Step 1: First, enter Sealos and open the App Launchpad + +![](../images/uptimekuma_img-1.png) + +### Step 2: Create a New Application + +Open the App Launchpad in the [Sealos](https://cloud.sealos.io) desktop environment, click "New Application" to create a +new application. + +![](../images/uptimekuma_img-2.png) + +### Step 3: Set Startup Parameters + +Configure the startup parameters as follows: + +- Set the container exposed port to 3001 +- Enable public network access to access the application via the provided domain + +![](../images/uptimekuma_img-3.png) + +![](../images/uptimekuma_img-4.png) + +### Step 4: Set up Storage Volumes + +In the advanced settings, add a storage volume mount to persist the Uptime Kuma data directory `/app/data`. This ensures +that the application data is not lost when the container restarts. + +![](../images/uptimekuma_img-5.png) + +### Step 5: Deploy the Application + +Click 「Deploy Application」 to start the application: + +![](../images/uptimekuma_img-6.png) + +### Step 6: Access the Application + +Once the application is successfully launched, you can access it using its public network address. Enter the application +domain in your browser to access the main interface. + +![](../images/uptimekuma_img-7.png) + +### Step 7: Create an Administrator Account + +To ensure the security of Uptime Kuma, you will need to create an administrator account when you first access the +application. Fill in the basic information for the administrator account, including the username and password. After +completing the form, click the "Create" button to register the account. + +![](../images/uptimekuma_img-8.png) + +### Step 8: Add Custom Monitoring Items + +![](../images/uptimekuma_img-9.png) + +![](../images/uptimekuma_img-0.png) \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/gitea/install-gitea.md b/docs/5.0/docs/quick-start/examples/gitea/install-gitea.md new file mode 100644 index 00000000000..90c7691ced5 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/gitea/install-gitea.md @@ -0,0 +1,118 @@ +--- +keywords: [Gitea installation, self-hosted Git, Sealos, CI/CD, MySQL database setup] +description: Quick guide to install Gitea on Sealos, covering self-hosted Git, CI/CD, and MySQL database setup. Follow these steps for a seamless deployment. +--- + +# Quick Installation of Gitea + +Git with a cup of tea! Painless self-hosted all-in-one software development service, includes Git hosting, code review, +team collaboration, package registry and CI/CD. + +## Step 1: Log in to Sealos + +- Go to the [Sealos](https://cloud.sealos.io/) official website + +![](../images/gitea-0.png) + +## Step 2: Open the App Launchpad + +![](../images/gitea-1.png) + +## Step 3: Create a new application + +- In App Launchpad, click "Create New Application" to create a new application. + +![](../images/gitea-2.png) + +## Step 4: Application deployment + +- Basic configuration: + + - Application name (custom): gitea + - Image name (default latest version): gitea/gitea:latest-rootless + - CPU (recommended): 1 Core + - Memory (recommended): 1 G + +- Deployment mode: + + - Number of instances (custom): 1 + +![](../images/gitea-3.png) + +- Network configuration: + + - Container port: 3000 + - Accessible to the Public: enabled + +![](../images/gitea-4.png) + +- Advanced configuration: + + - Custom local storage, persist Gitea data (recommended 1 G). + +![](../images/gitea-5.png) + +## Step 5: Deploy the application + +- Click「Deploy Application」 to start deploying the application. + +![](../images/gitea-6.png) + +## Step 6: Configure the database + +- Configure MySQL database for Gitea via Sealos +- Click Database + +![](../images/gitea-9.png) + +- Create a new database + +![](../images/gitea-10.png) + +- Basic configuration: + + - Cluster type: mysql + - Database version: ac-mysql-8.0.30 + - CPU (recommended): 1 Core + - Memory (recommended): 1 G + +![](../images/gitea-11.png) + +- After deployment is successful, enter the details page to view the MySQL connection information + +![](../images/gitea-12.png) + +- Click "One-click Connection" to enter the MySQL terminal connection + +![](../images/gitea-13.png) + +- Execute + +```sql +CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; +``` + +Create the database needed for Gitea + +![](../images/gitea-14.png) + +## Step 7: Access the application + +- Click 「App Launchpad」 to view.When the application's STATUS changes from Pending to Running, it means the application + has started successfully. + +- When the STATUS is Running, you can directly access the external address. + +![](../images/gitea-7.png) + +- After accessing the external address, enter the configuration page and configure according to the details of the MySQL + just created + +![](../images/gitea-15.png) + +- After configuring, click Install, wait for a while and you can enter the login page, deployment successful! + +![](../images/gitea-16.png) + +![](../images/gitea-17.png) + diff --git a/docs/5.0/docs/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png b/docs/5.0/docs/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png new file mode 100644 index 00000000000..025a0c4e45a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png new file mode 100644 index 00000000000..1ca1cd0ed53 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-1iudM0.png b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-1iudM0.png new file mode 100644 index 00000000000..5ba9b3ad878 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-1iudM0.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png new file mode 100644 index 00000000000..ac8de099a1a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg new file mode 100644 index 00000000000..1b1fe554ea5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg new file mode 100644 index 00000000000..a773666c4ff Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-59-FxJE12.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-59-FxJE12.png new file mode 100644 index 00000000000..fdc343a80ed Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-11-59-FxJE12.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-01-DKect7.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-01-DKect7.png new file mode 100644 index 00000000000..b4d2db4792a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-01-DKect7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-05-CWczxm.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-05-CWczxm.png new file mode 100644 index 00000000000..d512ad14195 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-05-CWczxm.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png new file mode 100644 index 00000000000..28a241ade20 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png new file mode 100644 index 00000000000..aa8e415fb5b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-09-RslDGj.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-09-RslDGj.png new file mode 100644 index 00000000000..0935a645d99 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-09-RslDGj.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png new file mode 100644 index 00000000000..a446015a5c5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png new file mode 100644 index 00000000000..6996e718eb5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png new file mode 100644 index 00000000000..c76f2e0535a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png new file mode 100644 index 00000000000..ba4d166331c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg new file mode 100644 index 00000000000..7ca839b52b2 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png new file mode 100644 index 00000000000..ac7134504f8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png new file mode 100644 index 00000000000..59460d087f2 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png new file mode 100644 index 00000000000..0fc1e2d152b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png new file mode 100644 index 00000000000..00e7aa10391 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png new file mode 100644 index 00000000000..08ff96c0c12 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-1.png b/docs/5.0/docs/quick-start/examples/images/appsmith-1.png new file mode 100644 index 00000000000..700c4e0d4d3 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-2.png b/docs/5.0/docs/quick-start/examples/images/appsmith-2.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-3.png b/docs/5.0/docs/quick-start/examples/images/appsmith-3.png new file mode 100644 index 00000000000..01876eeff7a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-4.png b/docs/5.0/docs/quick-start/examples/images/appsmith-4.png new file mode 100644 index 00000000000..fad0d90a71d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-5.png b/docs/5.0/docs/quick-start/examples/images/appsmith-5.png new file mode 100644 index 00000000000..d6567da245a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-6.png b/docs/5.0/docs/quick-start/examples/images/appsmith-6.png new file mode 100644 index 00000000000..78b505e7529 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-7.png b/docs/5.0/docs/quick-start/examples/images/appsmith-7.png new file mode 100644 index 00000000000..9771645376a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/appsmith-8.png b/docs/5.0/docs/quick-start/examples/images/appsmith-8.png new file mode 100644 index 00000000000..ca7f7e62e60 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/appsmith-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/1-1.png b/docs/5.0/docs/quick-start/examples/images/fireboom/1-1.png new file mode 100644 index 00000000000..2e8a8d45325 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/1-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/2-1.png b/docs/5.0/docs/quick-start/examples/images/fireboom/2-1.png new file mode 100644 index 00000000000..5fb4c0ec51f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/2-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/2-2.png b/docs/5.0/docs/quick-start/examples/images/fireboom/2-2.png new file mode 100644 index 00000000000..714ad389184 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/2-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/2-3.png b/docs/5.0/docs/quick-start/examples/images/fireboom/2-3.png new file mode 100644 index 00000000000..e0d5a1a605d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/2-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/3-1.png b/docs/5.0/docs/quick-start/examples/images/fireboom/3-1.png new file mode 100644 index 00000000000..10d9ef1b793 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/3-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/3-2.png b/docs/5.0/docs/quick-start/examples/images/fireboom/3-2.png new file mode 100644 index 00000000000..eef62cdfc5f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/3-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/4-1.png b/docs/5.0/docs/quick-start/examples/images/fireboom/4-1.png new file mode 100644 index 00000000000..f717abd1abf Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/4-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/5-1.png b/docs/5.0/docs/quick-start/examples/images/fireboom/5-1.png new file mode 100644 index 00000000000..477f9ebd26e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/5-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/5-2.png b/docs/5.0/docs/quick-start/examples/images/fireboom/5-2.png new file mode 100644 index 00000000000..e353d414d31 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/5-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/5-3.png b/docs/5.0/docs/quick-start/examples/images/fireboom/5-3.png new file mode 100644 index 00000000000..d1bddbf12c6 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/5-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-architecture.jpeg b/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-architecture.jpeg new file mode 100644 index 00000000000..7f9660c847f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-architecture.jpeg differ diff --git a/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-intro.jpeg b/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-intro.jpeg new file mode 100644 index 00000000000..848bd2b5d97 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/fireboom/fireboom-intro.jpeg differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-0.png b/docs/5.0/docs/quick-start/examples/images/gitea-0.png new file mode 100644 index 00000000000..946d921d4ce Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-1.png b/docs/5.0/docs/quick-start/examples/images/gitea-1.png new file mode 100644 index 00000000000..cae3923a16f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-10.png b/docs/5.0/docs/quick-start/examples/images/gitea-10.png new file mode 100644 index 00000000000..0087724d0b1 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-11.png b/docs/5.0/docs/quick-start/examples/images/gitea-11.png new file mode 100644 index 00000000000..b820dc0b781 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-11.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-12.png b/docs/5.0/docs/quick-start/examples/images/gitea-12.png new file mode 100644 index 00000000000..31c2451f5e3 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-12.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-13.png b/docs/5.0/docs/quick-start/examples/images/gitea-13.png new file mode 100644 index 00000000000..5557c68da9c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-13.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-14.png b/docs/5.0/docs/quick-start/examples/images/gitea-14.png new file mode 100644 index 00000000000..566c44f970b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-14.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-15.png b/docs/5.0/docs/quick-start/examples/images/gitea-15.png new file mode 100644 index 00000000000..90e280b8053 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-15.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-16.png b/docs/5.0/docs/quick-start/examples/images/gitea-16.png new file mode 100644 index 00000000000..901bcb8ac4a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-16.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-17.png b/docs/5.0/docs/quick-start/examples/images/gitea-17.png new file mode 100644 index 00000000000..d0f6300f249 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-17.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-2.png b/docs/5.0/docs/quick-start/examples/images/gitea-2.png new file mode 100644 index 00000000000..295b148d179 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-3.png b/docs/5.0/docs/quick-start/examples/images/gitea-3.png new file mode 100644 index 00000000000..2d9a9a6554b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-4.png b/docs/5.0/docs/quick-start/examples/images/gitea-4.png new file mode 100644 index 00000000000..9a7d30cba2e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-5.png b/docs/5.0/docs/quick-start/examples/images/gitea-5.png new file mode 100644 index 00000000000..9fe9a5f7ac9 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-6.png b/docs/5.0/docs/quick-start/examples/images/gitea-6.png new file mode 100644 index 00000000000..e7db5c84451 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-7.png b/docs/5.0/docs/quick-start/examples/images/gitea-7.png new file mode 100644 index 00000000000..6ced9251709 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-8.png b/docs/5.0/docs/quick-start/examples/images/gitea-8.png new file mode 100644 index 00000000000..9395b5fdd4d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/gitea-9.png b/docs/5.0/docs/quick-start/examples/images/gitea-9.png new file mode 100644 index 00000000000..9da2f0456b5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/gitea-9.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-1.png b/docs/5.0/docs/quick-start/examples/images/halo_img-1.png new file mode 100644 index 00000000000..ccc68e469f5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-10.png b/docs/5.0/docs/quick-start/examples/images/halo_img-10.png new file mode 100644 index 00000000000..e1137ca4154 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-11.png b/docs/5.0/docs/quick-start/examples/images/halo_img-11.png new file mode 100644 index 00000000000..707d5e9c313 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-11.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-12.png b/docs/5.0/docs/quick-start/examples/images/halo_img-12.png new file mode 100644 index 00000000000..a62bad32ef8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-12.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-13.png b/docs/5.0/docs/quick-start/examples/images/halo_img-13.png new file mode 100644 index 00000000000..d270bab0a42 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-13.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-14.png b/docs/5.0/docs/quick-start/examples/images/halo_img-14.png new file mode 100644 index 00000000000..2865276b96d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-14.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-15.png b/docs/5.0/docs/quick-start/examples/images/halo_img-15.png new file mode 100644 index 00000000000..c9afff34a93 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-15.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-16.png b/docs/5.0/docs/quick-start/examples/images/halo_img-16.png new file mode 100644 index 00000000000..8d843a1f0e7 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-16.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-17.png b/docs/5.0/docs/quick-start/examples/images/halo_img-17.png new file mode 100644 index 00000000000..6e7d3f8e858 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-17.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-18.png b/docs/5.0/docs/quick-start/examples/images/halo_img-18.png new file mode 100644 index 00000000000..a3d0fcb8dd9 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-18.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-19.png b/docs/5.0/docs/quick-start/examples/images/halo_img-19.png new file mode 100644 index 00000000000..5254c15d967 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-19.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-2.png b/docs/5.0/docs/quick-start/examples/images/halo_img-2.png new file mode 100644 index 00000000000..5a5cfc3f268 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-20.png b/docs/5.0/docs/quick-start/examples/images/halo_img-20.png new file mode 100644 index 00000000000..d20e5101e4b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-20.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-21.png b/docs/5.0/docs/quick-start/examples/images/halo_img-21.png new file mode 100644 index 00000000000..42dcb2303a1 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-21.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-22.png b/docs/5.0/docs/quick-start/examples/images/halo_img-22.png new file mode 100644 index 00000000000..e560a5aec5b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-22.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-3.png b/docs/5.0/docs/quick-start/examples/images/halo_img-3.png new file mode 100644 index 00000000000..3a23c04cef7 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-4.png b/docs/5.0/docs/quick-start/examples/images/halo_img-4.png new file mode 100644 index 00000000000..13665f4535d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-5.png b/docs/5.0/docs/quick-start/examples/images/halo_img-5.png new file mode 100644 index 00000000000..200db6367fd Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-6.png b/docs/5.0/docs/quick-start/examples/images/halo_img-6.png new file mode 100644 index 00000000000..19ce13c9b30 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-7.png b/docs/5.0/docs/quick-start/examples/images/halo_img-7.png new file mode 100644 index 00000000000..d450ab20f87 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-8.png b/docs/5.0/docs/quick-start/examples/images/halo_img-8.png new file mode 100644 index 00000000000..5d857a1b40e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/halo_img-9.png b/docs/5.0/docs/quick-start/examples/images/halo_img-9.png new file mode 100644 index 00000000000..4e32d5475cf Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/halo_img-9.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa1.jpg b/docs/5.0/docs/quick-start/examples/images/illa1.jpg new file mode 100644 index 00000000000..54a850adda8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa1.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa2.jpg b/docs/5.0/docs/quick-start/examples/images/illa2.jpg new file mode 100644 index 00000000000..12cce4d52c7 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa2.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa3.jpg b/docs/5.0/docs/quick-start/examples/images/illa3.jpg new file mode 100644 index 00000000000..70f6161f8ab Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa3.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa_create_app.jpg b/docs/5.0/docs/quick-start/examples/images/illa_create_app.jpg new file mode 100644 index 00000000000..6e08c84f938 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa_create_app.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa_deploy.jpg b/docs/5.0/docs/quick-start/examples/images/illa_deploy.jpg new file mode 100644 index 00000000000..a58a40e309f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa_deploy.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa_home.jpg b/docs/5.0/docs/quick-start/examples/images/illa_home.jpg new file mode 100644 index 00000000000..e015a82bac8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa_home.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa_log_in.jpeg b/docs/5.0/docs/quick-start/examples/images/illa_log_in.jpeg new file mode 100644 index 00000000000..f15fc6a5d7b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa_log_in.jpeg differ diff --git a/docs/5.0/docs/quick-start/examples/images/illa_run.jpg b/docs/5.0/docs/quick-start/examples/images/illa_run.jpg new file mode 100644 index 00000000000..ea75049cf2c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/illa_run.jpg differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-1.png b/docs/5.0/docs/quick-start/examples/images/pageplug-1.png new file mode 100644 index 00000000000..700c4e0d4d3 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-10.png b/docs/5.0/docs/quick-start/examples/images/pageplug-10.png new file mode 100644 index 00000000000..0aa0f2546ce Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-11.png b/docs/5.0/docs/quick-start/examples/images/pageplug-11.png new file mode 100644 index 00000000000..ef702aadb7e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-11.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-2.png b/docs/5.0/docs/quick-start/examples/images/pageplug-2.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-3.png b/docs/5.0/docs/quick-start/examples/images/pageplug-3.png new file mode 100644 index 00000000000..00edfb9382b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-4.png b/docs/5.0/docs/quick-start/examples/images/pageplug-4.png new file mode 100644 index 00000000000..c947ad852ca Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-5.png b/docs/5.0/docs/quick-start/examples/images/pageplug-5.png new file mode 100644 index 00000000000..289789fd639 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-6.png b/docs/5.0/docs/quick-start/examples/images/pageplug-6.png new file mode 100644 index 00000000000..a58fbc16537 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-7.png b/docs/5.0/docs/quick-start/examples/images/pageplug-7.png new file mode 100644 index 00000000000..414ff44e067 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-8.png b/docs/5.0/docs/quick-start/examples/images/pageplug-8.png new file mode 100644 index 00000000000..dc7bb21bd4e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/pageplug-9.png b/docs/5.0/docs/quick-start/examples/images/pageplug-9.png new file mode 100644 index 00000000000..0011841a7d1 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/pageplug-9.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/0.png b/docs/5.0/docs/quick-start/examples/images/tailchat/0.png new file mode 100644 index 00000000000..197223de4a8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/0.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/1.png b/docs/5.0/docs/quick-start/examples/images/tailchat/1.png new file mode 100644 index 00000000000..3eced36954f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/10.png b/docs/5.0/docs/quick-start/examples/images/tailchat/10.png new file mode 100644 index 00000000000..599ead17397 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/11.png b/docs/5.0/docs/quick-start/examples/images/tailchat/11.png new file mode 100644 index 00000000000..2841c01c205 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/11.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/12.png b/docs/5.0/docs/quick-start/examples/images/tailchat/12.png new file mode 100644 index 00000000000..43310c129d8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/12.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/13.png b/docs/5.0/docs/quick-start/examples/images/tailchat/13.png new file mode 100644 index 00000000000..c89cc68375b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/13.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/14.png b/docs/5.0/docs/quick-start/examples/images/tailchat/14.png new file mode 100644 index 00000000000..3c637c422d9 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/14.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/15.png b/docs/5.0/docs/quick-start/examples/images/tailchat/15.png new file mode 100644 index 00000000000..3203e025d9f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/15.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/16.png b/docs/5.0/docs/quick-start/examples/images/tailchat/16.png new file mode 100644 index 00000000000..5f9b13ef61e Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/16.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/17.png b/docs/5.0/docs/quick-start/examples/images/tailchat/17.png new file mode 100644 index 00000000000..21e6091eb4b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/17.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/2.png b/docs/5.0/docs/quick-start/examples/images/tailchat/2.png new file mode 100644 index 00000000000..234358eae33 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/3.png b/docs/5.0/docs/quick-start/examples/images/tailchat/3.png new file mode 100644 index 00000000000..e8341c9130c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/4.png b/docs/5.0/docs/quick-start/examples/images/tailchat/4.png new file mode 100644 index 00000000000..8d8db3ca8bb Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/5.png b/docs/5.0/docs/quick-start/examples/images/tailchat/5.png new file mode 100644 index 00000000000..4efdc860247 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/6.png b/docs/5.0/docs/quick-start/examples/images/tailchat/6.png new file mode 100644 index 00000000000..f0dc20aee71 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/7.png b/docs/5.0/docs/quick-start/examples/images/tailchat/7.png new file mode 100644 index 00000000000..563c28b48c1 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/8.png b/docs/5.0/docs/quick-start/examples/images/tailchat/8.png new file mode 100644 index 00000000000..602a961b703 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/tailchat/9.png b/docs/5.0/docs/quick-start/examples/images/tailchat/9.png new file mode 100644 index 00000000000..06ad0d6ea76 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/tailchat/9.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-0.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-0.png new file mode 100644 index 00000000000..e2940389dae Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-1.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-1.png new file mode 100644 index 00000000000..b250072db39 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-10.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-10.png new file mode 100644 index 00000000000..6411f1d99cc Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-2.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-2.png new file mode 100644 index 00000000000..083044758d5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-3.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-3.png new file mode 100644 index 00000000000..566495613ee Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-4.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-4.png new file mode 100644 index 00000000000..ec61518674c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-5.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-5.png new file mode 100644 index 00000000000..4e5a2e13b63 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-6.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-6.png new file mode 100644 index 00000000000..cdeb8f3db36 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-7.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-7.png new file mode 100644 index 00000000000..a33d5580c9d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-8.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-8.png new file mode 100644 index 00000000000..850d72fbb99 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-9.png b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-9.png new file mode 100644 index 00000000000..2003e96b900 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/uptimekuma_img-9.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_1.png b/docs/5.0/docs/quick-start/examples/images/wordpress_1.png new file mode 100644 index 00000000000..bbfd6001594 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_1.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_10.png b/docs/5.0/docs/quick-start/examples/images/wordpress_10.png new file mode 100644 index 00000000000..d1cd7993028 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_10.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_11.png b/docs/5.0/docs/quick-start/examples/images/wordpress_11.png new file mode 100644 index 00000000000..103bf474654 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_11.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_12.png b/docs/5.0/docs/quick-start/examples/images/wordpress_12.png new file mode 100644 index 00000000000..80c69d18580 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_12.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_13.png b/docs/5.0/docs/quick-start/examples/images/wordpress_13.png new file mode 100644 index 00000000000..250114b79ef Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_13.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_14.png b/docs/5.0/docs/quick-start/examples/images/wordpress_14.png new file mode 100644 index 00000000000..d180432b02c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_14.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_15.png b/docs/5.0/docs/quick-start/examples/images/wordpress_15.png new file mode 100644 index 00000000000..87711203809 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_15.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_16.png b/docs/5.0/docs/quick-start/examples/images/wordpress_16.png new file mode 100644 index 00000000000..b490fade878 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_16.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_17.png b/docs/5.0/docs/quick-start/examples/images/wordpress_17.png new file mode 100644 index 00000000000..9d0bc039160 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_17.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_2.png b/docs/5.0/docs/quick-start/examples/images/wordpress_2.png new file mode 100644 index 00000000000..83254bdb6cd Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_2.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_3.png b/docs/5.0/docs/quick-start/examples/images/wordpress_3.png new file mode 100644 index 00000000000..1b0a1f926bb Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_3.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_4.png b/docs/5.0/docs/quick-start/examples/images/wordpress_4.png new file mode 100644 index 00000000000..86ad0a605c7 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_4.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_5.png b/docs/5.0/docs/quick-start/examples/images/wordpress_5.png new file mode 100644 index 00000000000..1a9a1566ae1 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_5.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_6.png b/docs/5.0/docs/quick-start/examples/images/wordpress_6.png new file mode 100644 index 00000000000..52b0dc908d4 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_6.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_7.png b/docs/5.0/docs/quick-start/examples/images/wordpress_7.png new file mode 100644 index 00000000000..a18bfa6d170 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_7.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_8.png b/docs/5.0/docs/quick-start/examples/images/wordpress_8.png new file mode 100644 index 00000000000..484684f79ae Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_8.png differ diff --git a/docs/5.0/docs/quick-start/examples/images/wordpress_9.png b/docs/5.0/docs/quick-start/examples/images/wordpress_9.png new file mode 100644 index 00000000000..24db5cadb90 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/images/wordpress_9.png differ diff --git a/docs/5.0/docs/quick-start/examples/low-code-platform/install-appsmith.md b/docs/5.0/docs/quick-start/examples/low-code-platform/install-appsmith.md new file mode 100644 index 00000000000..d5c450cd423 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/low-code-platform/install-appsmith.md @@ -0,0 +1,73 @@ +--- +keywords: [Appsmith, open-source platform, internal apps, Sealos, application deployment, App Launchpad, custom business apps, multi-step workflows] +description: Quick installation guide for Appsmith on Sealos. Learn how to deploy and access internal apps using this open-source platform. +--- + +# Quick installation of Appsmith + +[Appsmith](https://github.com/appsmithorg/appsmith) is an open-source platform to build, deploy, and maintain internal +apps. You can build anything from simple CRUD apps, admin panels, dashboards to custom business apps and complicated +multi-step workflows. + +## Step 1: Step 1: open the App Launchpad application in the [Sealos](https://cloud.sealos.io) desktop environment + +![](../images/appsmith-1.png) + +## Step 2: create a new application + +- In App Launchpad, click "New Application" to create a new application. + +![](../images/appsmith-2.png) + +## Step 3: application deployment + +- Basic configuration: + + - Application name (Custom): appsmith + + - Image name (default latest version): appsmith/appsmith-ce + + - CPU (recommended): 2 Core + + - Memory (recommended): 4 GB + +- deployment mode: + + - number of instances (custom): 1 + +![](../images/appsmith-3.png) + +- Network configuration: + + - Container exposure port: 80 + + - Public network access: enabled + +![](../images/appsmith-4.png) + +- Advanced configuration: + + - Customize local storage and persist Appsmith data (15 GB is recommended). + +![](../images/appsmith-5.png) + +## Step 4: deploy the application + +- Click "deploy Application" to start deploying the application. + +![](../images/appsmith-6.png) + +## Step 5: access the application + +- Click "details" to view, when the STATUS of the application has changed from Pending to Running, it indicates that the + application has been launched successfully. + +- When STATUS is Running, you can directly access the public network address. + +![](../images/appsmith-7.png) + +- The visit was successful! + +![](../images/appsmith-8.png) + + diff --git a/docs/5.0/docs/quick-start/examples/low-code-platform/install-illacloud.md b/docs/5.0/docs/quick-start/examples/low-code-platform/install-illacloud.md new file mode 100644 index 00000000000..662c3afea32 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/low-code-platform/install-illacloud.md @@ -0,0 +1,77 @@ +--- +keywords: [low-code platform, ILLA Cloud, Sealos, application deployment, internal applications, drag-and-drop components, open-source] +description: Quick installation guide for ILLA Cloud, an open-source low-code platform, using Sealos. Learn to deploy and manage internal applications effortlessly. +--- + +# Quick installation of ILLA Cloud + +[ILLA Cloud](https://www.illacloud.com) is a low-code platform that is open-source, enabling users to create, deploy, +and manage internal applications. With ILLA Cloud, you have the flexibility to build a wide range of applications, from +basic CRUD apps to more complex multi-step workflows, using intuitive drag-and-drop components for building the user +interface. + +## Step 1: open the App Launchpad application in the [Sealos](https://cloud.sealos.io) desktop environment + +![illa_home](../images/illa_home.jpg) + +## Step 2: create a new application + +- In App Launchpad, click "New Application" to create a new application. + +![illa_create_app](../images/illa_create_app.jpg) + +## Step 3: application deployment + +- Basic configuration: + + - Application name (Custom): illa-builder + + - Image name (default latest version): illasoft/illa-builder + + - CPU (recommended): 0.5 Core + + - Memory (recommended): 512 MB + +- deployment mode: + + - number of instances (custom): 1 + +- Note: the configuration here is the minimum requirement for successful running. You may use more based on your needs. + +![illa1](../images/illa1.jpg) + +- Network configuration: + + - Container exposure port: 2022 + + - Public network access: enabled + + - Note: Here we leave the custom domain blank, which does not affect running ILLA Cloud. You are welcome to put your + own domain down. + +![illa2](../images/illa2.jpg) + +- Advanced configuration: + + - Customize local database and drive (1 GB is the minimum). + +![illa3](../images/illa3.jpg) + +## Step 4: deploy the application + +- Click "deploy Application" to start deploying the application. + +![illa_deploy](../images/illa_deploy.jpg) + +## Step 5: access the application + +- Click "details" to view, when the STATUS of the application has changed from Pending to Running, it indicates that the + application has been launched successfully. + +- When STATUS is Running, you can directly access the public network address. + +![illa_run](../images/illa_run.jpg) + +- The visit was successful! + +![illa_log_in](../images/illa_log_in.jpeg) diff --git a/docs/5.0/docs/quick-start/examples/low-code-platform/install-pageplug.md b/docs/5.0/docs/quick-start/examples/low-code-platform/install-pageplug.md new file mode 100644 index 00000000000..281a7aa0ece --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/low-code-platform/install-pageplug.md @@ -0,0 +1,81 @@ +--- +keywords: [PagePlug, Appsmith, low-code platform, Sealos, application deployment] +description: Quick installation guide for PagePlug, a Chinese low-code platform based on Appsmith, optimized for performance and integrated with Formily and Echarts. +--- + +# Quick installation of PagePlug + +[PagePlug](https://github.com/cloudtogo/pageplug) is a Chinese project +of [Appsmith](https://github.com/appsmithorg/appsmith), which optimizes the overall performance and Sinicizes based on +Appsmith, and also integrates the characteristic form solution Formily component, chart solution Echarts component, low +code Mini Program development, etc. +Is an open source, declarative, visual, intuitive front-end low-code framework for research and development. + +## Step 1: Step 1: open the App Launchpad application in the [Sealos](https://cloud.sealos.io) desktop environment + +![](../images/pageplug-1.png) + +## Step 2: create a new application + +- In App Launchpad, click "New Application" to create a new application. + +![](../images/pageplug-2.png) + +## Step 3: application deployment + +- Basic configuration: + + - Application name (Custom): pageplug + + - Image name (default latest version): cloudtogouser/pageplug-ce + + - CPU (recommended): 2 Core + + - Memory (recommended): 4 GB + +- Deployment model: + + - Number of instances (custom): 1 + +![](../images/pageplug-3.png) + +- Network configuration: + + - Container exposure port: 80 + + - Public network access: enabled + +![](../images/pageplug-4.png) + +- Advanced configuration: + + - Customize local storage and persist PagePlug data. + +![](../images/pageplug-5.png) + +## Step 4: deploy the application + +- Click "deploy Application" to start deploying the application. + +![](../images/pageplug-6.png) + +## Step 5: access the application + +- Click "details" to view, when the STATUS of the application has changed from Pending to Running, it indicates that the + application has been launched successfully. + +![](../images/pageplug-7.png) + +![](../images/pageplug-8.png) + +- When STATUS is Running, you can directly access the public network address. + +![](../images/pageplug-9.png) + +- If a 503 exception occurs in the access, wait for a while and try again. + +![](../images/pageplug-10.png) + +- The visit was successful! + +![](../images/pageplug-11.png) diff --git a/docs/5.0/docs/quick-start/examples/others/install-anki.md b/docs/5.0/docs/quick-start/examples/others/install-anki.md new file mode 100644 index 00000000000..2766ca2c62b --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/others/install-anki.md @@ -0,0 +1,165 @@ +--- +keywords: [Anki sync server, custom Anki server, Anki installation, Anki self-hosted, Anki sync setup] +description: Learn how to quickly install and configure a custom Anki sync server using Sealos for seamless syncing across devices. +--- + +# Quick Installation of a Custom Anki Sync Server + +Anki is a spaced repetition flashcard program. Essentially, it is a card sorting tool that **actively tests users on +custom card content, allows users to self-grade their responses, and then uses an algorithm to reschedule cards based on +the judgments to optimize long-term retention**. + +The so-called "cards" are technically called flash cards. They are small cards with a question or prompt on one side and +the answer on the reverse side. You first read the question/prompt, try to recall the answer mentally, then flip the +card to verify against the answer provided. + +The core principle of flashcard creation is:**one knowledge point per card**. As such, Anki is well-suited for learning +languages, memorizing historical dates, formulas, etc. + +Anki's official sync server is hosted overseas and is a personal project with limited bandwidth. Syncing is very slow. +To sync learning progress and new cards across multiple clients would be extremely painful. + +To address this, we need to deploy a custom sync server and have the clients connect to it instead. + +## Deploying an Anki Sync Server + +Since the February 2023 release of Anki 2.1.57 for desktop, Anki on desktop, Android, and iOS now support custom sync +servers without needing to install plugins. Anki users no longer need to worry about sync issues. The longstanding sync +problem has finally been completely solved. + +Currently, the only project that supports the latest Anki versions +is [anki-sync-server-rs](https://github.com/ankicommunity/anki-sync-server-rs). Other sync server projects are now +mostly obsolete. This Rust project tracks progress on Anki's official sync server and also uses sqlite as the backend +data store. + +Below we will deploy anki-sync-server-rs on Sealos and configure it. + +First, enter the URL https://cloud.sealos.io/ in your browser to access the Sealos desktop. Then open "App Launchpad": + +![](../images/2023-06-26-11-54-EIVahX.jpg) + +Click "Create Application": + +![](../images/2023-06-26-11-55-NDkuEg.jpg) + +Enter the application name and image name. The exposed container port is `27701`. Enable external network access: + +![](../images/2023-06-26-11-59-FxJE12.png) + +Scroll down and expand "Advanced Configuration". Click "Edit Environment Variables": + +![](../images/2023-06-26-12-01-DKect7.png) + +Paste the following into the environment variable input box: + +``` +bash +Copy code + +ANKISYNCD_USERNAME= +ANKISYNCD_PASSWORD= +``` + +Replace `` with your username and `` with your password. + +![](../images/2023-06-26-12-05-CWczxm.png) + +Click "Add Storage Volume": + +![](../images/2023-06-26-12-06-lvv6ms.png) + +Set the mount path to `/app` and confirm: + +![](../images/2023-06-26-12-07-s8W7iu.png) + +Finally, click "Deploy Application" in the top right corner. + +After deployment, click "Details" to enter the application details screen. + +![](../images/2023-06-26-12-09-RslDGj.png) + +Here you can see the instance status. Wait until the status shows as "running" before proceeding. If it stays pending +for a while, click "Details" to check the failure reason: + +![](../images/2023-06-26-13-09-Vs9ccy.png) + +Once deployed successfully, you can monitor metrics like CPU and memory usage. Click the external URL to directly access +the sync server's web interface. + +![](../images/2023-06-26-13-09-YFHPYc.png) + +If you see the following screen, the deployment succeeded: + +![](../images/2023-06-26-13-09-FwsbfW.png) + +Viewing logs is also straightforward - click the "three dots" on the instance panel and select "Logs": + +![](../images/2023-06-26-13-09-hdHfxP.png) + +![](../images/2023-06-26-13-09-nwrxrv.png) + +## Client Configuration + +### Desktop + +To configure the desktop client (macOS/Windows/Linux): + +1. Open "Preferences" + + ![](../images/2023-06-26-12-24-QHYKZt.png) + +2. Click "Network" and look for the "self-hosted sync server" section. Enter your server's address: + + ![](../images/2023-06-26-12-26-HYOaBJ.png) + +3. Restart Anki and click "Sync": + + ![](../images/2023-06-26-12-28-ccnUOj.png) + +4. A prompt will appear asking for username and password. Enter what you configured earlier: + + ![](../images/2023-06-26-12-29-z5E9gi.png) + +5. Click OK and syncing will begin. + +### Android + +On Android, directly configure via "Settings -> Advanced -> Custom sync server": + +![](../images/2022-04-10-14-31-vrNHJU.png) + +Also enter username and password: + +> Settings -> Basic -> AnkiWeb Account + +This completes the configuration. All card decks should sync over: + +![](../images/2022-04-10-14-32-ADfk8T.png) +![](../images/2022-04-10-14-32-1iudM0.png) + +The official app version is quite old. For the latest community version, download the Beta here: + +- https://github.com/ankidroid/Anki-Android/releases + +The **arm64-v8a** version is recommended. + +After installing, the sync server can be configured under "Settings -> Sync -> Custom sync server": + +![](../images/2023-06-26-12-39-1jsF0t.jpeg) + +Also enter the username and password: + +> Settings -> Sync -> AnkiWeb Account + +### iOS + +AnkiMobile also supports syncing with a custom server. At least version Ankimobile 2.0.90(20090.2) seems to work based +on [reports in the Anki forums](https://forums.ankiweb.net/t/ankimobile-self-sync-server-failure-the-one-bundled-in-version-2-1-60-qt6/27862). + +If you encounter sync issues after configuring, try toggling "Allow Anki to access local network" off and on in iOS +settings per Anki's docs: + +> If you're using AnkiMobile and are unable to connect to a server on your local network, please go into the iOS +> settings, locate Anki near the bottom, and toggle "Allow Anki to access local network" off and on again. + +The tip above is excerpted from the [Anki tutorial](https://docs.ankiweb.net/sync-server.html#client-setup). \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Go Apps.md b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Go Apps.md new file mode 100644 index 00000000000..960e40895e0 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Go Apps.md @@ -0,0 +1,154 @@ +--- +keywords: [Go application deployment, Docker Go app, Sealos Go app, Go Docker image, Go app tutorial] +description: Learn how to quickly install and deploy Go applications using Docker and Sealos with this step-by-step guide. Perfect for beginners. +--- + +# Quick installation of Go Apps + +First, make sure you have installed the following tools: + +- Docker + +## Step 1: Write Your Go Program + +```go +package main + +import ( + "fmt" + "net/http" +) + +func main() { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello, World!") + }) + + http.ListenAndServe(":8080", nil) +} +``` + +## Step 2: Create Docker Image + +- In the same directory as `main.go`, create a file named `Dockerfile` with the following content: + +``` +FROM golang:1.17 as builder + +WORKDIR /app +COPY . . + +RUN go mod init myapp +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . + +FROM alpine:latest +RUN apk --no-cache add ca-certificates +WORKDIR /app +COPY --from=builder /app/main /app/ + +EXPOSE 8080 +ENTRYPOINT ["/app/main"] +``` + +This `Dockerfile` defines a multi-stage build process. In the first stage, we use the official `golang` image as the +base image and then compile the Go application. In the second stage, we use the lightweight `alpine` image, copy the +compiled binary file to the `/app` directory, and expose port 8080. + +- Run the following command in the directory where the `Dockerfile` is located to build a Docker image for the Go + application: + +``` +docker build -t your_image_name . +``` + +Replace `your_image_name` with your image name and tag. + +## Step 3: Push Docker Image + +- Push the created Docker image to a Docker repository, such as Docker Hub or a private repository. **Assuming you are + already logged in to the Docker repository**, use the following command to push the image: + + - First, tag the Docker image. Before pushing an image, you need to add a tag to it so that Docker knows where to + push it. Run the following command to add a tag to the image: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-image-name` with your local image name, `your-dockerhub-username` with your Docker Hub username, `your-repo-name` with the repository name you want to create on Docker Hub, and `your-tag` with the tag you set for the image (e.g., latest). + + For example: + + ``` + docker tag demo damager6666/demo:latest + ``` + + - Next, push the Docker image. Use the following command to push the image to Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-dockerhub-username`, `your-repo-name`, and `your-tag` with the actual values. For example: + + ``` + docker push damager6666/demo:latest + ``` + +## Step 4: Log in to Sealos + +- Go to the [Sealos](https://cloud.sealos.io/) official website + +![](images/java-example-0.png) + +## Step 5: Open the "App Launchpad" App + +![](images/java-example-3.png) + +## Step 6: Create a New Application + +- In "App Launchpad", click "Create New Application" to create a new application. + +![](images/java-example-4.png) + +## Step 7: Application Deployment + +- Basic Configuration: + - Application Name (custom): go-demo + - Image Name: damager6666/demo:latest + - CPU (recommended): 1 Core + - Memory (recommended): 1 G +- Deployment Mode: + - Number of Instances (custom): 1 + +![](images/java-example-5.png) + +- Network Configuration: + - Container Exposed Port: 8080 + - Internet Access: Enable + +![](images/java-example-6.png) + +## Step 8: Deploy Application + +- Click "Deploy Application" to start deploying the application. + +![](images/java-example-7.png) + +## Step 9: Access Application + +- Click "Application Management" to view. When the application's STATUS changes from Pending to Running, it means the + application has started successfully. +- When STATUS is Running, you can directly access the external network address. + +![](images/java-example-8.png) + +- In the browser, enter + +``` +https://tmgkflgdlstl.cloud.sealos.io/hello +``` + +![](images/java-example-9.png) + +- The page displays "Hello, World!", indicating that your Go application is running on Sealos. \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Java Apps.md b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Java Apps.md new file mode 100644 index 00000000000..8aaa1b0b243 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Java Apps.md @@ -0,0 +1,275 @@ +--- +keywords: [Java Spring Boot, Docker Java app, Java MySQL integration, Spring Boot Docker, deploy Java app] +description: Learn how to quickly install and deploy Java apps using Spring Boot, Docker, and MySQL. Follow our step-by-step guide for seamless integration and deployment. +--- + +# Quick installation of Java Apps + +First, make sure you have installed the following tools: + +- Docker +- Maven + +## Step 1: Write Your Java Program + +- Here, directly generate a basic Spring Boot project through [Spring Initializr](https://start.spring.io/). + +![](images/java-example-1.png) + +- Open the project's `pom.xml` file and add the following content to the `` section to include the MySQL + JDBC driver: + + ``` + + mysql + mysql-connector-java + + ``` + +- Next, add the following content to the `application.properties` file in the `src/main/resources` directory to + configure the database connection: + + ``` + spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 + spring.datasource.username=root + spring.datasource.password=your_password + spring.jpa.hibernate.ddl-auto=update + ``` + +## Step 2: Create Entity and Repository Classes + +Create a new Java class in the project, such as `Person.java`, to represent the entity in the database. Add the +following content: + +```java +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Person { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + + // Getters and setters + // ... +} +``` + +- Then create a repository interface, such as `PersonRepository.java`: + + ```java + import org.springframework.data.jpa.repository.JpaRepository; + import org.springframework.stereotype.Repository; + + @Repository + public interface PersonRepository extends JpaRepository { + } + ``` + +## Step 3: Create a Web Controller + +- In the `src/main/java` directory of the project, create a simple web controller. For example, create a file named + `PersonController.java` and add the following content: + +```java +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class PersonController { + @Autowired + private PersonRepository personRepository; + + @GetMapping("/getPersons") + public String getAllPersons() { + List persons = personRepository.findAll(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < persons.size(); i++) { + sb.append("id: " + persons.get(i).getId() + " name: " + persons.get(i).getName() + "/n"); + } + System.out.println(sb.toString()); + return sb.toString(); + } + + @PostMapping(value = "/addPerson") + public Person addPerson(@RequestBody Person person) { + return personRepository.save(person); + } + + +} +``` + +## Step 4: Build the Application + +- Build the project using Maven by running the following command: + + ``` + mvn clean install + ``` + +![](images/java-example-2.png) + +## Step 5: Create a Docker Image + +- In the root directory of the Java project, create a file named `Dockerfile`. This file will contain the instructions + required to build the Docker image. Here's a simple example Dockerfile: + + ```` + # Use the official OpenJDK image as the base image + FROM openjdk:8-jre-slim + + # Set the working directory + WORKDIR /app + + # Copy the built JAR file into the image + COPY target/demo-0.0.1-SNAPSHOT.jar /app/demo-0.0.1-SNAPSHOT.jar + + # Expose the application's port + EXPOSE 8080 + + # Set the start command + CMD ["java", "-jar", demo-0.0.1-SNAPSHOT.jar"] + ``` + ```` + +- In the project root directory, run the following command to build the Docker image: + +``` +docker build -t java-demo . +``` + +## Step 6: Push the Docker Image + +- Push the created Docker image to a Docker repository, such as Docker Hub or a private repository. **Assuming you are + already logged in to the Docker repository**, use the following command to push the image: + + - First, tag the Docker image. Before pushing an image, you need to add a tag to it so that Docker knows where to + push it. Run the following command to add a tag to the image: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-image-name` with your local image name, `your-dockerhub-username` with your Docker Hub username, + `your-repo-name` with the repository name you want to create on Docker Hub, and `your-tag` with the tag you set + for the image (e.g., `latest`). + + - Then, push the tagged image to the Docker repository: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + +## Step 7: Log in to Sealos + +- Visit the [Sealos](https://cloud.sealos.io/) official website + +![](images/java-example-0.png) + +## Step 8: Open the "Database" application + +![](images/java-example-10.png) + +## Step 9: Create a database + +- Click on "Create New Database" + +![](images/java-example-11.png) + +- Basic configuration: + - Cluster type: mysql + - Cluster name: demo-db + - CPU (recommended): 1 Core + - Memory (recommended): 1 G + - Number of instances: 1 + - Storage capacity: 1 Gi +- Click "Deploy Cluster" + +## Step 10: Configure the database + +![](images/java-example-12.png) + +- Click on "One-click Connect to Database" and execute the following statements: + + - Create the `test_db` database + + ```sql + create database test_db; + ``` + + - Create the `test` table + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - Insert data + + ```sql + insert into test values (1,'Sealos'); + ``` + +## Step 11: Open the "App Launchpad" application + +![](images/java-example-3.png) + +## Step 12: Create a new application + +- In "App Launchpad", click on "Create New Application" to create a new application. + +![](images/java-example-4.png) + +## Step 13: Deploy the application + +- Basic configuration: + - Application name (custom): java-demo + - Image name: damager6666/java-demo:v2 + - CPU (recommended): 1 Core + - Memory (recommended): 1 G +- Deployment mode: + - Number of instances (custom): 1 + +![](images/java-example-5.png) + +- Network configuration: + - Exposed container port: 8080 + - Public network access: enabled + +![](images/java-example-6.png) + +## Step 14: Deploy the application + +- Click on "Deploy Application" to start deploying the application. + +![](images/java-example-7.png) + +## Step 15: Access the application + +- Click on "Application Management" to view the application. When the application's STATUS changes from Pending to + Running, it indicates that the application has started successfully. +- When the STATUS is Running, you can directly access the public network address. + +![](images/java-example-8.png) + +- Enter the following in your browser: + +``` +https://tmgkflgdlstl.cloud.sealos.io/getPersons +``` + +![](images/java-example-13.png) + +- The page displays the data inserted into the database earlier, indicating that your Java application is now running on + Sealos. + diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md new file mode 100644 index 00000000000..be1525eec31 --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md @@ -0,0 +1,230 @@ +--- +keywords: [Node.js installation, Docker image, MySQL database, Sealos deployment, Node.js app] +description: Learn how to quickly install and deploy Node.js apps with Docker and MySQL on Sealos. Follow our step-by-step guide for seamless setup. +--- + +# Quick installation of Node.js Apps + +First, make sure you have installed the following tools: + +- Docker + +## Step 1: Write your Node.js program + +- Create a file named `app.js` in your directory and add the following code: + + ```js + const express = require('express'); + const mysql = require('mysql'); + const app = express(); + + const db = mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + }); + + db.connect((err) => { + if (err) throw err; + console.log('Connected to the database.'); + }); + + app.get('/', (req, res) => { + db.query('SELECT id, name FROM users', (err, results) => { + if (err) throw err; + res.send(JSON.stringify(results)); + }); + }); + + app.listen(8080, () => { + console.log('Server is running on port 8080'); + }); + ``` + +- Create a file named `package.json` in the root directory of your project, and include the following content: + + ~~~json + { + "name": "nodejs-web-app-mysql", + "version": "1.0.0", + "main": "app.js", + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "^4.17.1", + "mysql": "^2.18.1" + } + } + ``` + ~~~ + +## Step 2: Create a Docker image + +- In the root directory of your project, create a file named `Dockerfile`. This file will contain the instructions + needed to build the Docker image. Here is a simple example Dockerfile: + +```dockerfile +FROM node:16 + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +EXPOSE 8080 + +CMD ["npm", "start"] +``` + +## Step 3: Build the Docker image + +- Run the following command in the directory containing the `Dockerfile` to build the Docker image: + + ``` + docker build -t nodejs-demo . + ``` + +## Step 4: Push the Docker image + +- Push the created Docker image to a Docker repository, such as Docker Hub or a private repository. **Assuming you have + logged in to the Docker repository**, use the following command to push the image: + + - First, tag the Docker image. Before pushing the image, you need to add a tag to it so that Docker knows where to + push it. Run the following command to add a tag to the image: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-image-name` with the name of your local image, `your-dockerhub-username` with your Docker Hub + username, `your-repo-name` with the name of the repository you want to create on Docker Hub, and `your-tag` with + the tag you set for the image (e.g. latest). + + For example: + + ``` + docker tag nodejs-demo damager6666/nodejs-demo:v1 + ``` + + - Next, push the Docker image. Use the following command to push the image to Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-dockerhub-username`, `your-repo-name`, and `your-tag` with the actual values. For example: + + ``` + docker push damager6666/nodejs-demo:v1 + ``` + +## Step 5: Login to Sealos + +- Go to the [Sealos](https://cloud.sealos.io/) website. + +![](images/java-example-0.png) + +## Step 6: Open the "Database" application + +![](images/java-example-10.png) + +## Step 7: Create a database + +- Click on "Create a database" + +![](images/java-example-11.png) + +- Basic configuration: + - Cluster type: mysql + - Cluster name: demo-db + - CPU (recommended): 1 Core + - Memory (recommended): 1 G + - Number of instances: 1 + - Storage capacity: 1 Gi +- Click "Deploy Cluster" + +## Step 8: Configure the database + +![](images/java-example-12.png) + +- Click "Connect to the database" to execute the following statements: + + - Create a database named test_db + + ```sql + create database test_db; + ``` + + - Create a table named test + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - Insert some data + + ```sql + insert into test values (1,'Sealos'); + ``` + +## Step 9: Open the "App Launchpad" application + +![](images/java-example-3.png) + +## Step 10: Create a new application + +- In App Launchpad", click "Create New Application" to create a new application. + +![](images/java-example-4.png) + +## Step 11: Deploy the application + +- Basic configuration: + - Application name (customizable): nodejs-demo + - Image name : damager6666/nodejs-demo:v1 + - CPU (recommended): 1 core + - Memory (recommended): 1 G +- Deployment mode: + - Number of instances (customizable): 1 + +![](images/nodejs-example-0.png) + +- Network configuration: + - Exposed container port: 8080 + - External network access: enabled + +![](images/java-example-6.png) + +## Step 12: Deploy the application + +- Click "Deploy Application" to start deploying the application. + +![](images/java-example-7.png) + +## Step 13: Access the application + +- Click "App Launchpad" to view the application status. When the STATUS changes from Pending to Running, it means that + the application has been successfully launched. +- When the STATUS is Running, you can directly access the external network address. + +![](images/java-example-8.png) + +- Enter the following URL in your browser: + +``` +https://tmgkflgdlstl.cloud.sealos.io/getPersons +``` + +![](images/nodejs-example-1.png) + +- The page will display the data inserted into the database, indicating that your Node.js application is running on + Sealos. \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Python Apps.md b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Python Apps.md new file mode 100644 index 00000000000..48a1812748f --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Python Apps.md @@ -0,0 +1,248 @@ +--- +keywords: [Python app deployment, Docker image, Sealos, MySQL database, Flask application, Docker Hub, Python Dockerfile, app management, database configuration, external network access] +description: Learn how to quickly install and deploy Python apps using Docker, Sealos, and MySQL. Follow our step-by-step guide to create, configure, and access your Flask application. +--- + +# Quick installation of Python Apps + +First, make sure you have the following tools installed: + +- Docker + +## Step 1: Write your Python program + +- Create a file named `app.py` in your project directory and add the following code: + + ```python + from flask import Flask, render_template + import mysql.connector + + app = Flask(__name__) + + def get_data_from_database(): + cnx = mysql.connector.connect( + host="java-demo-db-mysql.ns-7otl3mb2.svc", + user="root", + password="l9h8f24b", + database="test_db" + ) + + cursor = cnx.cursor() + cursor.execute("SELECT * FROM test") + data = cursor.fetchall() + cursor.close() + cnx.close() + + return data + + @app.route('/') + def index(): + data = get_data_from_database() + return render_template('index.html', data=data) + + if __name__ == '__main__': + app.run(host='0.0.0.0', debug=True) + + ``` + +- Create a file named `requirements.txt` in the directory to list the dependencies required by the application. + +``` +Flask +mysql-connector-python +``` + +- Create a folder named `templates` in your project directory and create a file named `index.html` inside it. Add the + following content to `index.html`: + + ```html + + + + + Data from MySQL + + +

Data from MySQL

+ + + + + + + {% for row in data %} + + + + + + {% endfor %} +
Column1Column2Column3
{{ row[0] }}{{ row[1] }}{{ row[2] }}
+ + + + Replace `Column1`, `Column2`, and `Column3` with the actual column names you want to display. + ``` + +## Step 2: Create a Docker image + +- Create a file named `Dockerfile` in the root directory of the project. This file will contain the instructions needed + to build the Docker image. Here is a simple example Dockerfile: + + ```dockerfile + FROM python:3.8 + + WORKDIR /app + + COPY requirements.txt . + + RUN pip install --no-cache-dir -r requirements.txt + + COPY . . + + EXPOSE 5000 + + CMD ["python", "app.py"] + ``` + +## Step 3: Build the Docker image + +- Run the following command in the directory containing the `Dockerfile` to build the Docker image: + + ``` + docker build -t python-demo . + ``` + +## Step 4: Push the Docker image + +- Push the created Docker image to a Docker repository, such as Docker Hub or a private repository. **Assuming that you + have logged in to the Docker repository**, use the following command to push the image: + + - First, tag the Docker image. Before pushing the image, you need to add a tag to it so that Docker knows where to + push it. Run the following command to add a tag to the image: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-image-name` with your local image name, `your-dockerhub-username` with your Docker Hub username, + `your-repo-name` with the name of the repository you want to create on Docker Hub, and `your-tag` with the tag you + set for the image (e.g. latest). + + For example: + + ``` + docker tag python-demo damager6666/python-demo:v1 + ``` + + - Next, push the Docker image. Use the following command to push the image to Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-dockerhub-username`, `your-repo-name`, and `your-tag` with the actual values. For example: + + ``` + docker push damager6666/python-demo:v1 + ``` + +## Step 5: Log in to Sealos + +- Go to the [Sealos](https://cloud.sealos.io/) website. + +![](images/java-example-0.png) + +## Step 6: Open the "Database" application + +![](images/java-example-10.png) + +## Step 7: Create a database + +- Click "Create Database" + +![](images/java-example-11.png) + +- Basic Configuration: + - Cluster Type: mysql + - Cluster Name: demo-db + - CPU (Recommended): 1 Core + - Memory (Recommended): 1 G + - Number of Instances: 1 + - Storage Capacity: 1 Gi +- Click "Deploy Cluster" + +## Step 8: Configure the database + +![](images/java-example-12.png) + +- Click "Connect to the Database" and execute the following SQL statements: + + - Create the test_db database + + ```sql + create database test_db; + ``` + + - Create the test table + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - Insert data + + ```sql + insert into test values (1,'Sealos'); + ``` + +## Step 9: Open the "App Management" application + +![](images/java-example-3.png) + +## Step 10: Create a new app + +- In "App Management", click "New App" to create a new app. + +![](images/java-example-4.png) + +## Step 11: App deployment + +- Basic Configuration: + - Application Name (Customized): python-demo + - Image Name: damager6666/python-demo:v1 + - CPU (Recommended): 1 Core + - Memory (Recommended): 1 G +- Deployment Mode: + - Number of Instances (Customized): 1 + +![](images/python-example-0.png) + +- Network Configuration: + - Container Exposed Port: 5000 + - External Access: Enabled + +## Step 12: Deploy the app + +![](images/python-example-2.png) + +## Step 13: Access the app + +- Click "App Management" to check when the STATUS of the app changes from "Pending" to "Running", indicating that the + app has been successfully launched. +- When the STATUS is Running, you can directly access the external network address. + +![](images/python-example-3.png) + +- Enter the external network address in the browser to access the data that was just stored in MySQL, indicating that + the program has been successfully deployed on Sealos. + + ```http + https://mkqreaqfgwac.cloud.sealos.io/ + ``` + +![](images/python-example-4.png) \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Vue Apps.md b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Vue Apps.md new file mode 100644 index 00000000000..8da28e5369a --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/programming-languages/Quick installation of Vue Apps.md @@ -0,0 +1,148 @@ +--- +keywords: [Vue.js, Docker, Sealos, Vue CLI, Docker image, application deployment, cloud hosting, web development] +description: Learn how to quickly install and deploy Vue.js applications using Docker and Sealos. Follow our step-by-step guide for seamless web development and cloud hosting. +--- + +# Quick installation of Vue Apps + +First, make sure you have installed the following tools: + +- Docker +- Node.js +- npm + +## Step 1: Install Vue CLI + +```bash +npm install -g @vue/cli +``` + +## Step 2: Create a new project with Vue CLI + +```bash +vue create my-vue-app +``` + +## Step 3: Build the production version of the project with Vue CLI + +```bash +cd my-vue-app +npm run build +``` + +## Step 4: Create a Docker image + +- In the `my-vue-app` directory, create a file named `Dockerfile` with the following content: + +```dockerfile +# 使用 nginx 镜像作为基础镜像 +FROM nginx:1.21-alpine + +# 复制构建的前端文件到 nginx 容器中 +COPY dist/ /usr/share/nginx/html + +# 暴露端口 +EXPOSE 80 + +# 启动 nginx +CMD ["nginx", "-g", "daemon off;"] +``` + +- Run the following command in the directory where the `Dockerfile` is located to build a Docker image for the Vue + application: + +```bash +docker build -t my-vue-app . +``` + +## Step 5: Push Docker Image + +- Push the created Docker image to a Docker repository, such as Docker Hub or a private repository. **Assuming you are + already logged in to the Docker repository**, use the following command to push the image: + + - First, tag the Docker image. Before pushing an image, you need to add a tag to it so that Docker knows where to + push it. Run the following command to add a tag to the image: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-image-name` with your local image name, `your-dockerhub-username` with your Docker Hub username, + `your-repo-name` with the repository name you want to create on Docker Hub, and `your-tag` with the tag you set + for the image (e.g., latest). + + For example: + + ``` + docker tag my-vue-app damager6666/my-vue-app:v1 + ``` + + - Next, push the Docker image. Use the following command to push the image to Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + Replace `your-dockerhub-username`, `your-repo-name`, and `your-tag` with the actual values. For example: + + ``` + docker push damager6666/my-vue-app:v1 + ``` + +## Step 6: Log in to Sealos + +- Go to the [Sealos](https://cloud.sealos.io/) official website + +![](images/java-example-0.png) + +## Step 7: Open the "App Launchpad" App + +![](images/java-example-3.png) + +## Step 8: Create a New Application + +- In "App Launchpad", click "Create New Application" to create a new application. + +![](images/java-example-4.png) + +## Step 9: Application Deployment + +- Basic Configuration: + - Application Name (custom): my-vue-app + - Image Name: damager6666/my-vue-app:v1 + - CPU (recommended): 1 Core + - Memory (recommended): 1 G +- Deployment Mode: + - Number of Instances (custom): 1 + +![](images/vue-example-0.png) + +- Network Configuration: + - Container Exposed Port: 80 + - Internet Access: Enable + +![](images/vue-example-1.png) + +## Step 10: Deploy Application + +- Click "Deploy Application" to start deploying the application. + +![](images/vue-example-3.png) + +## Step 11: Access Application + +- Click "Application Management" to view. When the application's STATUS changes from Pending to Running, it means the + application has started successfully. +- When STATUS is Running, you can directly access the external network address. + +![](images/vue-example-2.png) + +- In the browser, enter + +``` +https://mvpztqzczudy.cloud.sealos.io +``` + +![](images/vue-example-4.png)) + +- The page displays "Hello, Vue.js!", indicating that your Vue application is running on Sealos. \ No newline at end of file diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-0.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-0.png new file mode 100644 index 00000000000..6ef487195a8 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-1.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-1.png new file mode 100644 index 00000000000..b149426e0e6 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-10.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-10.png new file mode 100644 index 00000000000..3b10465747d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-10.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-11.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-11.png new file mode 100644 index 00000000000..b1cf562ca8c Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-11.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-12.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-12.png new file mode 100644 index 00000000000..6eedee90f87 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-12.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-13.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-13.png new file mode 100644 index 00000000000..3548b505e15 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-13.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-2.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-2.png new file mode 100644 index 00000000000..179f4b85a5f Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-3.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-3.png new file mode 100644 index 00000000000..3aa6b5e891a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-4.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-4.png new file mode 100644 index 00000000000..bcb67e31220 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-5.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-5.png new file mode 100644 index 00000000000..21df65190ff Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-5.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-6.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-6.png new file mode 100644 index 00000000000..ae30ba940af Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-6.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-7.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-7.png new file mode 100644 index 00000000000..f77e89f54c5 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-7.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-8.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-8.png new file mode 100644 index 00000000000..19a4f0f3276 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-8.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-9.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-9.png new file mode 100644 index 00000000000..b5582f255cd Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/java-example-9.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-0.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-0.png new file mode 100644 index 00000000000..6e95ed74b24 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-1.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-1.png new file mode 100644 index 00000000000..ad9450487f2 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/nodejs-example-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-0.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-0.png new file mode 100644 index 00000000000..86c16c2d71d Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-1.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-1.png new file mode 100644 index 00000000000..b783a48a786 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-2.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-2.png new file mode 100644 index 00000000000..86144296b4a Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-3.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-3.png new file mode 100644 index 00000000000..54ceb5547f3 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-4.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-4.png new file mode 100644 index 00000000000..3ffbe07560b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/python-example-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-0.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-0.png new file mode 100644 index 00000000000..648276d1412 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-0.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-1.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-1.png new file mode 100644 index 00000000000..e47a1b27115 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-1.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-2.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-2.png new file mode 100644 index 00000000000..dab8d56621b Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-2.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-3.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-3.png new file mode 100644 index 00000000000..9ac654f2439 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-3.png differ diff --git a/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-4.png b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-4.png new file mode 100644 index 00000000000..b0020952109 Binary files /dev/null and b/docs/5.0/docs/quick-start/examples/programming-languages/images/vue-example-4.png differ diff --git a/docs/5.0/docs/quick-start/examples/social-communication/install-tailchat.md b/docs/5.0/docs/quick-start/examples/social-communication/install-tailchat.md new file mode 100644 index 00000000000..5f4f2f6f98e --- /dev/null +++ b/docs/5.0/docs/quick-start/examples/social-communication/install-tailchat.md @@ -0,0 +1,172 @@ +--- +keywords: [Tailchat installation, open source IM, Sealos, MongoDB, Redis, Minio, enterprise application, microservice architecture, plugin architecture] +description: Quick installation guide for Tailchat, an open source IM application with microservice and plugin architecture, using Sealos with MongoDB, Redis, and Minio. +--- + +# Quick installation of Tailchat + +[Tailchat](https://tailchat.msgbyte.com/) is an open source IM application that is pluggable and easy to expand. Plugin +architecture gives Tailchat unlimited possibilities. + +Front-end micro-kernel architecture + back-end micro-service architecture makes Tailchat to control any +customized/privatized scenarios + +Created for enterprises and private domain users, highly free group management and customized panel display allow +private domain owners to better display their works, manage users, and build their own brand and circle. + +![](../images/tailchat/0.png) + +## First, enter Sealos and open "Application Management" + +![](../images/tailchat/1.png) + +## Create a new application + +![](../images/tailchat/2.png) + +### Create dependencies + +As an enterprise-level application, `tailchat` has the minimum dependencies of `mongodb`, `redis`, and `minio`. Let's +create them one by one. + +#### MongoDB + +For convenience, we will fix one instance and bind it to local storage. The image used is `mongo:4`. Note that because +we did not set a password for the database, do not provide network services to the public network. The container exposes +port 27017, which is the default database service port. The content is as follows: + +![](../images/tailchat/3.png) + +Click "Deploy Application" to submit the deployment. Wait patiently for a while, and you can see that the application +has started up. + +![](../images/tailchat/4.png) + +> Note: that the initial allocation of 64m is too small for MongoDB, so I changed it to 128m by modifying the +> application. Resource allocation can be changed at any time, which is also a convenient feature of Sealos/Kubernetes. + +#### Minio + +Next, we will create Minio, an open-source object storage service. We can also quickly create it through Sealos's UI. +The image used is `minio/minio`. Note that we need to make some adjustments: + +- Expose port: 9000 +- Change the run command to: `minio` +- Change the command parameters to: `server /data` +- Set environment variables: + - MINIO_ROOT_USER: tailchat + - MINIO_ROOT_PASSWORD: com.msgbyte.tailchat +- Local storage: `/data` + +The final result is as follows: + +![](../images/tailchat/5.png) + +Click the "Deploy" button and you can see that the service has started up normally. + +#### Redis + +Finally, we need to deploy Redis as a content cache and message forwarding. The image used is `redis:alpine`, and the +exposed port is `6379`. The final result is as follows: + +![](../images/tailchat/6.png) + +### Create Tailchat itself + +At this point, all the dependencies required by Tailchat have been deployed, as shown below: + +![](../images/tailchat/7.png) + +Now we can deploy the Tailchat itself. The Tailchat itself will be relatively complex, but because Sealos is purely +UI-based, it will not be too complicated. + +- Use image: `moonrailgun/tailchat` +- Expose port: `11000` (remember to open external access) +- Configure environment variables as follows: + ``` + SERVICEDIR=services,plugins + TRANSPORTER=redis://redis:6379 + REDIS_URL=redis://redis:6379 + MONGO_URL=mongodb://mongo/tailchat + MINIO_URL=minio:9000 + MINIO_USER=tailchat + MINIO_PASS=com.msgbyte.tailchat + ``` + +The final effect is as follows: + +![](../images/tailchat/8.png) + +After waiting patiently for a while, you can see that the Tailchat service has started up. + +![](../images/tailchat/9.png) + +## Preview service + +First, we can check the availability of the Tailchat service by adding `/health` to the external address provided by the +service, such as `https://.cloud.sealos.io/health`. When it starts up, the Tailchat service will return +content like this: + +![](../images/tailchat/10.png) + +This JSON string contains the image version used, node name, system usage, and microservice loading status. Here we can +see that my common services, such as `user`/`chat.message`, and some services with plugin prefixes such as +`plugin.registry`, have all started up normally, indicating that our server is running normally. Now we can directly +access our external address and see that after a short loading time, the page opens normally and automatically jumps to +the login page. + +![](../images/tailchat/11.png) + +Register an account casually, and you can see that we can enter the main interface of Tailchat normally, as shown in the +following figure: + +![](../images/tailchat/12.png) + +At this point, our service has successfully landed in Sealos. + +## Scaling service + +Of course, as a distributed architecture system, Tailchat naturally supports horizontal scaling. In Sealos, scaling is +also very simple. Just modify the number of instances through the change operation: + +![](../images/tailchat/13.png) + +![](../images/tailchat/14.png) + +![](../images/tailchat/15.png) + +At this point, when we access `https://.cloud.sealos.io/health`, we can see that we can access different +nodes. + +![](../images/tailchat/16.png) + +## Add Tailchat entry to desktop + +Open Terminal, enter `vim app.yml` to create and edit a configuration file + +Enter the following content, note that the url should be replaced with the url deployed by yourself + +```yml +apiVersion: app.sealos.io/v1 +kind: App +metadata: + name: tailchat-app-entry +spec: + name: Tailchat + icon: + type: iframe + data: + url: + desc: + icon: https://tailchat.msgbyte.com/img/logo.svg + menuData: + displayType: normal +``` + +Press `esc` to exit edit mode, press `:wq` to save and exit vim + +Type `kubectl apply -f app.yml` to start the configuration. + +After refreshing the page, we can see that our entry appears on the desktop of `sealos` + +![](../images/tailchat/17.png) diff --git a/docs/5.0/docs/quick-start/images/quick-start-1.png b/docs/5.0/docs/quick-start/images/quick-start-1.png new file mode 100644 index 00000000000..b1ddba883b7 Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-1.png differ diff --git a/docs/5.0/docs/quick-start/images/quick-start-2.png b/docs/5.0/docs/quick-start/images/quick-start-2.png new file mode 100644 index 00000000000..4ed913f595c Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-2.png differ diff --git a/docs/5.0/docs/quick-start/images/quick-start-3.png b/docs/5.0/docs/quick-start/images/quick-start-3.png new file mode 100644 index 00000000000..e9bf1494a85 Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-3.png differ diff --git a/docs/5.0/docs/quick-start/images/quick-start-4.png b/docs/5.0/docs/quick-start/images/quick-start-4.png new file mode 100644 index 00000000000..056b2626b35 Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-4.png differ diff --git a/docs/5.0/docs/quick-start/images/quick-start-5.png b/docs/5.0/docs/quick-start/images/quick-start-5.png new file mode 100644 index 00000000000..7f15f20f58c Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-5.png differ diff --git a/docs/5.0/docs/quick-start/images/quick-start-6.png b/docs/5.0/docs/quick-start/images/quick-start-6.png new file mode 100644 index 00000000000..bb2731c08a9 Binary files /dev/null and b/docs/5.0/docs/quick-start/images/quick-start-6.png differ diff --git a/docs/5.0/docs/quick-start/quick-start.md b/docs/5.0/docs/quick-start/quick-start.md new file mode 100644 index 00000000000..c3fb91ce8ce --- /dev/null +++ b/docs/5.0/docs/quick-start/quick-start.md @@ -0,0 +1,36 @@ +--- +keywords: [Flarum deployment, Sealos App Store, open source forum, deploy Flarum, Sealos desktop] +description: Quickly deploy Flarum using Sealos. Follow our step-by-step guide to get your open source forum up and running in no time. +--- + +# Quick Start + +Deploy Flarum quickly with Sealos. + +> Flarum is a very simple open source forum software. It's responsive, easy to use, and has all the features you need to +> build a successful community. It's also extremely extensible, allowing for ultimate customizability. + +Open the Sealos desktop and click App Store. + +![](./images/quick-start-1.png) + +Click on the Flarum app (the search bar in the upper left corner can quickly find the app). + +![](./images/quick-start-2.png) + +Click Deploy App. + +![](./images/quick-start-3.png) + +Wait for the status of all components to change to running, which means that the components have been started (you can +re-enter the current page refresh state). + +![](./images/quick-start-4.png) + +Return to the Sealos desktop and click on the Flarum app. + +![](./images/quick-start-5.png) + +Successfully accessed Flarum. + +![](./images/quick-start-6.png) diff --git a/docs/5.0/docs/user-guide/app-launchpad/add-domain.md b/docs/5.0/docs/user-guide/app-launchpad/add-domain.md new file mode 100644 index 00000000000..6a3c61bfc27 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/add-domain.md @@ -0,0 +1,35 @@ +--- +sidebar_position: 2 +keywords: [custom domain, Sealos, app deployment, domain provider, public access] +description: Learn how to assign a custom domain to your project using Sealos for a tailored brand experience. Follow our step-by-step guide for seamless app deployment. +--- + +# Add a domain + +Assigning a custom domain to your project guarantees that visitors to your application will have a tailored experience +that aligns with your brand. + +## When Deploying + +Just enable "Public Access" when you're deploying, and [Sealos](https://cloud.sealos.io) will sorts you out with a +domain. + +![](images/app-launchpad-domain.png) + +Now, on your domain provider's end, link the 'CNAME' to the one Sealos provided. + +Once it's active, jump back to Sealos, click on "Custom Domain" to the side: + +![](images/app-launchpad-domain2.png) + +Enter your custom domain in the pop-up box and click confirm. + +![](images/app-launchpad-domain3.png) + +To wrap up, click the "Deploy" button. Once your app's live, click on the external address to access the app via the +custom domain. + +## Post Deployment + +For the apps you've deployed, just click "Update" top-right on the app details page. Then, follow the earlier steps to +integrate your custom domain. \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/app-launchpad/app-launchpad.md b/docs/5.0/docs/user-guide/app-launchpad/app-launchpad.md new file mode 100644 index 00000000000..e821ec28cd6 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/app-launchpad.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 0 +keywords: [App Launchpad, Sealos, application deployment, private images, horizontal pod autoscaling] +description: App Launchpad in Sealos simplifies application deployment with features like private images, HPA, custom domains, and real-time monitoring. +--- + +# App Launchpad + +**App Launchpad** is a feature within Sealos that serves as a single-image deployment tool. Its main goal is to +streamline and expedite the process of deploying applications, allowing you to launch your application in as little as 5 +minutes. + +The tool currently boasts a range of functionalities: + +- Capability to deploy applications using private images. +- Flexibility to tailor CPU and memory resources according to the specific needs of the application. +- Support for deploying multiple replicas. +- Horizontal Pod Autoscaling (HPA) for dynamic scaling. +- Provision of external URLs for easy access from the public network. +- Option to assign custom domain to applications, enhancing both brand visibility and the user experience. +- Utilization of ConfigMap for configuration file management. +- Persistent storage solutions for application data, ensuring both its security and continuity. +- Real-time monitoring features for applications and Pods to facilitate prompt issue detection and resolution. +- Comprehensive logging of application activities, aiding in troubleshooting and performance optimization. +- Analysis of system events (Events) to extract critical insights for enhancing application performance. +- A convenient one-click feature to access the container terminal, simplifying management and debugging tasks. +- Ability to expose several ports of an application to the external network. + +## [Quick Start](./use-app-launchpad.md) + +For quick and easy installation of commonly utilized applications. + +## [Update Application](./update-app.md) + +Guidance on modifying application configurations after initial deployment. + +## [Add a domain](./add-domain.md) + +Instructions for integrating a custom domain with your application. + +## [Exposing Multiple Ports](./expose-multi-ports.md) + +Details on how to make multiple ports of an application accessible externally. + +## [Environment](./environment.md) + +Directions for configuring applications through the use of environment variables. + +## [ConfigMap](./configmap.md) + +Guidelines for setting up application configurations via configuration files. + +## [Autoscaling](./autoscale.md) + +Strategy for autoscaling the number of application instances in response to varying workloads. + +## [Persistent Volume](./persistent-volume.md) + +Utilizing persistent storage for the long-term preservation of data. diff --git a/docs/5.0/docs/user-guide/app-launchpad/autoscale.md b/docs/5.0/docs/user-guide/app-launchpad/autoscale.md new file mode 100644 index 00000000000..d0a25500c18 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/autoscale.md @@ -0,0 +1,35 @@ +--- +sidebar_position: 6 +keywords: [Sealos, Autoscaling, Horizontal Pod Autoscaler, HPA, application scaling, CPU usage, memory usage, cloud scaling, Sealos controller, performance monitoring] +description: Learn how Sealos' Autoscaling feature dynamically adjusts application instances based on CPU and memory usage, ensuring optimal performance and resource utilization. +--- + +# Autoscaling + +In [Sealos](https://cloud.sealos.io), the "[App Launchpad](/guides/applaunchpad/applaunchpad.md)" feature enables the +automatic adjustment of application instance numbers to effectively respond to varying load conditions. This +functionality is known as "**Autoscaling**," or more technically, the Horizontal Pod Autoscaler (HPA). + +Autoscaling operates by dynamically altering the count of application instances based on specific metrics like CPU and +memory usage. This ensures that the applications run efficiently and resources are optimally utilized. + +> Key Point: In Autoscaling, "usage" typically refers to the average use across all instances of an application. For +> example, if an app runs on two instances, its average CPU usage is calculated as the mean of the usage of these two +> instances. + +The workings of Autoscaling are as follows: + +1. **Monitoring**: It continuously monitors crucial performance indicators like CPU and memory usage. +2. **Decision Making**: Based on predefined thresholds (e.g., maintaining CPU usage below 50%), it calculates the + required adjustments in the instance count. +3. **Adjustment**: Following this, Autoscaling automatically instructs the Sealos controller to modify the number of + instances, ensuring the usage stays within the desired range. + +For instance, if we set up an application with specific Autoscaling rules such as a maximum CPU usage of 50% and the +ability for instance numbers to vary between 1 and 5, Autoscaling will: + +- Increase the number of instances when the average CPU usage exceeds 50%, up to a maximum of 5. +- Decrease the number of instances when the average CPU usage drops below 50%, but always maintain at least one instance + in operation. + +![](images/autoscale.png) diff --git a/docs/5.0/docs/user-guide/app-launchpad/configmap.md b/docs/5.0/docs/user-guide/app-launchpad/configmap.md new file mode 100644 index 00000000000..28c71f00915 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/configmap.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 5 +keywords: [Sealos, configuration files, Nginx container, environment variables, application settings] +description: Learn how to effectively manage application settings in Sealos using configuration files, including Nginx container setup and environment variables. +--- + +# ConfgMap + +In [Sealos](https://cloud.sealos.io), the implementation of configuration files plays a vital role, particularly when +the application deals with numerous or complex configurations. Differing from environment variables, configuration files +are a more versatile and dependable means for managing settings. Environment variables are more apt for simple, +small-scale configuration tasks. + +The primary strength of configuration files is their capability to hold and control elaborate configuration data, +including aspects like configuration files, command-line arguments, and environment variables. These pieces of data can +be incorporated into the container upon the launch of the application container, facilitating adjustments to the +application's functionalities without the necessity of recompiling the image. + +Take, for example, the Nginx container. The utilization of configuration files in this context can be described as +follows: + +- **Filename**: This pertains to a file within the Nginx container, for which references can be drawn from the + instructions provided by the image supplier. +- **File Value**: This is the content corresponding to the file. In cases where the content is elaborate, it's + recommended to complete editing it offline and then paste it into the specified location. +- **Key Points**: The approach involves mounting an individual file, not an entire directory. It is imperative to + precisely identify the file to be mounted, rather than just a directory path. + +![](images/applaunchpad13.png) \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/app-launchpad/environment.md b/docs/5.0/docs/user-guide/app-launchpad/environment.md new file mode 100644 index 00000000000..0d7408b4b95 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/environment.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 4 +keywords: [Sealos, environment variables, container applications, configuration management, App Launchpad] +description: Learn how to manage configuration data for container applications in Sealos using environment variables for better maintainability and scalability. +--- + +# Environment + +In [Sealos](https://cloud.sealos.io), environment variables are pivotal in managing the configuration data for container +applications. These variables enable the provision of essential configuration information to applications without +necessitating changes to the application's code or image, thus bolstering their maintainability and scalability. + +The process of defining environment variables in the "[App Launchpad](/guides/applaunchpad/applaunchpad.md)" interface +is streamlined through a bulk input method. Users can define multiple variables by entering them line by line. Each +variable comprises a key and a value, separated by either an equal sign (=) or a colon (:). The interface is designed to +automatically eliminate any invalid characters from the key, ensuring the accuracy and validity of the environment +variables. + +![](images/applaunchpad12.png) + +**Environment Variable Formats That Are Correctly Interpreted:** + +```shell +host=127.0.0.1 +port:3000 +name: sealos +- username=123 +- password:123 +# Comments like this line are ignored, as they don't include an equal sign (=) or a colon (:), which are the key markers. +``` + +**Environment Variable Formats That Cannot Be Interpreted:** + +```shell +host=127.0.0.1 # This line is interpreted because it contains an equal sign (=) or a colon (:). The comment here is also considered part of the variable due to the preceding equal sign (=). +``` \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/app-launchpad/expose-multi-ports.md b/docs/5.0/docs/user-guide/app-launchpad/expose-multi-ports.md new file mode 100644 index 00000000000..e24a7d637cc --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/expose-multi-ports.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 3 +keywords: [multi-port application, expose multiple ports, Sealos platform, app launchpad, network configuration] +description: Learn how to expose multiple ports for complex applications using Sealos App Launchpad. Simplify network configuration and enhance accessibility. +--- + +# Exposing Multiple Ports + +In complex application environments, it's common for services to expose multiple ports simultaneously to cater to +diverse needs. These requirements can emerge from various scenarios: + ++ **Multi-protocol support**: For example, an application might support both HTTP and HTTPS, necessitating the exposure + of both ports 80 and 443. ++ **Multi-functional application**: An application might have a web service and an admin service, both of which listen + on different ports. ++ **Compatibility considerations**: To remain compatible with older versions or other services, you might need to expose + ports for both the new and old interfaces. ++ **Combined Database + App**: For instance, if you have an application and a database within the same Pod, you might + need to expose ports for both the application and the database. ++ **Prometheus Monitoring and App Service**: If your application has a business port and another port for Prometheus + monitoring via `/metrics`, you might need to expose both. ++ **Coexistence of GRPC and RESTful services**: If your application offers both GRPC and RESTful services, you might + need to expose separate ports for each type of service. + +When deploying applications using "[App Launchpad](/guides/applaunchpad/applaunchpad.md)" +on [Sealos](https://cloud.sealos.io), you can easily choose to expose multiple ports. During the deployment process, +users simply click on the "Network" option and then select "Add Port" to configure multiple ports. + +![](images/multi-ports1.png) + +Furthermore, the Sealos platform offers external access to these ports. Once exposed to the public network, each port +will be assigned a unique sub-domain, facilitating easier remote access and management. \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain.png new file mode 100644 index 00000000000..013dfd23003 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain2.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain2.png new file mode 100644 index 00000000000..840e42c1e95 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain2.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain3.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain3.png new file mode 100644 index 00000000000..7ff6bfd47d4 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad-domain3.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad.jpg b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad.jpg new file mode 100644 index 00000000000..1a64b79192e Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad.jpg differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad10.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad10.png new file mode 100644 index 00000000000..2a88dbdda28 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad10.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad11.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad11.png new file mode 100644 index 00000000000..acc586c337d Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad11.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad12.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad12.png new file mode 100644 index 00000000000..d8490adeccc Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad12.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad3.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad3.png new file mode 100644 index 00000000000..e64eadecb89 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad3.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad4.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad4.png new file mode 100644 index 00000000000..01c66a4b184 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad4.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad6.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad6.png new file mode 100644 index 00000000000..6019b61ca10 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad6.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad7.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad7.png new file mode 100644 index 00000000000..57114556318 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad7.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad8.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad8.png new file mode 100644 index 00000000000..b72c79adb57 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad8.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad9.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad9.png new file mode 100644 index 00000000000..8a111d8424a Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-launchpad9.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/app-list.png b/docs/5.0/docs/user-guide/app-launchpad/images/app-list.png new file mode 100644 index 00000000000..a9461aae6b7 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/app-list.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad12.png b/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad12.png new file mode 100644 index 00000000000..b92744e027a Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad12.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad13.png b/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad13.png new file mode 100644 index 00000000000..5e0307ba334 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/applaunchpad13.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/autoscale.png b/docs/5.0/docs/user-guide/app-launchpad/images/autoscale.png new file mode 100644 index 00000000000..0c59a5f3bfb Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/autoscale.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/multi-ports1.png b/docs/5.0/docs/user-guide/app-launchpad/images/multi-ports1.png new file mode 100644 index 00000000000..74e5bd569bf Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/multi-ports1.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/persistent-volume.png b/docs/5.0/docs/user-guide/app-launchpad/images/persistent-volume.png new file mode 100644 index 00000000000..af83504c71c Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/persistent-volume.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/set-cert1.png b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert1.png new file mode 100644 index 00000000000..a4ba0152400 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert1.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/set-cert2.png b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert2.png new file mode 100644 index 00000000000..b7ea59eed18 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert2.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/set-cert3.png b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert3.png new file mode 100644 index 00000000000..0fddf457489 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert3.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/set-cert4.png b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert4.png new file mode 100644 index 00000000000..aa4fc627bc1 Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/set-cert4.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-1.png b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-1.png new file mode 100644 index 00000000000..4dd8663d7dd Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-1.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-2.png b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-2.png new file mode 100644 index 00000000000..3d3819f431d Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-2.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-3.png b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-3.png new file mode 100644 index 00000000000..79a1815c53e Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-3.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-4.png b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-4.png new file mode 100644 index 00000000000..834cb08f40d Binary files /dev/null and b/docs/5.0/docs/user-guide/app-launchpad/images/use-app-launchpad-4.png differ diff --git a/docs/5.0/docs/user-guide/app-launchpad/persistent-volume.md b/docs/5.0/docs/user-guide/app-launchpad/persistent-volume.md new file mode 100644 index 00000000000..2c99ea7a789 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/persistent-volume.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 7 +keywords: [persistent storage, data persistence, container storage, Sealos, external storage, container deployment, data retention, Nextcloud, application container] +description: Ensure data persistence in Sealos with external storage solutions, maintaining data continuity even through container restarts or redeployments. +--- + +# Persistent Volume + +[Sealos](https://cloud.sealos.io) offers a flexible environment where containers can be effortlessly created and +destroyed. This flexibility is advantageous for application deployment and management, but it also raises the issue of +maintaining data persistence. In scenarios where data is stored within an application container, its destruction leads +to the loss of all stored data. + +To counter this problem, the use of persistent storage is essential. Persistent storage ensures that data is stored +externally, thereby preserving it even through container restarts or redeployments. This is particularly vital for +applications requiring data retention, like databases, file storage systems, or any services involving user data. + +For instance, in deploying Nextcloud, all data associated with its container is located in the `/var/www/html` +directory. To maintain data continuity, it's necessary to use external storage solutions for persisting data in this +directory. + +![](images/persistent-volume.png) \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/app-launchpad/set-cert.md b/docs/5.0/docs/user-guide/app-launchpad/set-cert.md new file mode 100644 index 00000000000..ee7aa3c8804 --- /dev/null +++ b/docs/5.0/docs/user-guide/app-launchpad/set-cert.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 8 +keywords: [custom domain certificate, cert-manager, Kubernetes secret, ingress patch, App Launchpad] +description: Learn how to manually set up a custom domain certificate in App Launchpad using Kubernetes secrets and ingress patching. +--- + +# Set a Custom Domain Certificate + +Successfully set up a custom domain in "App Launchpad" but cannot access the domain, and it shows the certificate is not +secure. This is because cert-manager did not successfully issue the certificate. To resolve this issue, we can manually +set up the certificate. + +First, make sure you have successfully set up CNAME in your cloud provider and have downloaded the certificate +corresponding to your domain. + +Open "App Launchpad", set a custom domain. + +![](images/set-cert1.png) + +Open the "Terminal", and execute the following commands in sequence. + +```bash +# Create tls.crt using the certificate file information (replace xxxx with the actual certificate file information). +cat > tls.crt < tls.key <established with the database simultaneously. | +| max_wal_size | Sets the maximum size of WAL (Write-Ahead Logging) files. | +| min_wal_size | Sets the minimum size of WAL files. | +| max_worker_processes | Sets the maximum number of background processes that
PostgreSQL can start. | +| shared_buffers | The size of memory used for data caching. | + +**Common MySQL Parameters**: + +| Parameter Name | Description | +|-------------------------|-------------------------------------------------------| +| innodb_buffer_pool_size | Sets the size of the InnoDB buffer pool. | +| max_connections | The maximum number of concurrent connections allowed. | +| query_cache_size | The size of the query cache. | +| thread_cache_size | The size of the thread cache. | +| max_allowed_packet | The maximum packet size. | +| innodb_log_file_size | The size of the InnoDB log file. | + +**Common MongoDB Parameters**: + +| Parameter Name | Description | +|-------------------------|-----------------------------------------------------------| +| storage.dbPath | The path for storing data files. | +| storage.journal.enabled | Sets the maximum size of WAL (Write-Ahead Logging) files. | +| min_wal_size | Enables logging. | +| net.port | The server port. | +| net.bindIp | The bound IP address. | + +**Common Redis Parameters**: + +| Parameter Name | Description | +|------------------|-------------------------------------------| +| maxclients | The maximum number of client connections. | +| maxmemory | The maximum amount of memory usage. | +| maxmemory-policy | The memory eviction policy. | +| appendonly | Switch for AOF persistence. | +| appendfsync | The frequency of AOF file flushing. | + +4. **Apply pg-config.yaml**: + +```bash +$ kubectl apply -f pg-config.yaml +``` +![config_4](./imgs/config_4.png) + +5. **Check whether pg-config.yaml is successfully applied**: +```bash +# If the status of OpsRequest is Succeed and the status of pod is Running, the application is successfully configured +$ kubectl get OpsRequest +$ kubectl get pod +``` +![config_5](./imgs/config_5.png) + +6. **Access the database to check whether the configuration takes effect**: +```bash +$ show max_connections; +``` +![config_6](./imgs/config_6.png) +![config_7](./imgs/config_7.png) + diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_1.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_1.png new file mode 100644 index 00000000000..d8c8c62be3a Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_1.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_2.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_2.png new file mode 100644 index 00000000000..4bd234485bf Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_2.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_3.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_3.png new file mode 100644 index 00000000000..1f6d2ff3383 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_3.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_4.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_4.png new file mode 100644 index 00000000000..02f9a61eddd Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_4.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_5.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_5.png new file mode 100644 index 00000000000..412e0bbe7fc Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_5.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_6.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_6.png new file mode 100644 index 00000000000..5f49dd84f12 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_6.png differ diff --git a/docs/5.0/docs/user-guide/database/config-docs/imgs/config_7.png b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_7.png new file mode 100644 index 00000000000..88f930a876f Binary files /dev/null and b/docs/5.0/docs/user-guide/database/config-docs/imgs/config_7.png differ diff --git a/docs/5.0/docs/user-guide/database/database.md b/docs/5.0/docs/user-guide/database/database.md new file mode 100644 index 00000000000..51e68d30e8c --- /dev/null +++ b/docs/5.0/docs/user-guide/database/database.md @@ -0,0 +1,217 @@ +--- +sidebar_position: 0 +keywords: [database cluster deployment, Sealos database management, MySQL PostgreSQL MongoDB, database backup, database migration] +description: Learn how to deploy and manage database clusters with Sealos. Supports MySQL, PostgreSQL, MongoDB, and more. Features include elastic expansion, backup, and migration. +--- + +# Database + +Database is the core component of an application, Sealos provides a database cluster deployment management tool, +can help you quickly deploy database clusters. It supports MySQL, PostgreSQL, MongoDB, Redis, Kafka, and more. Currently +the database supports the following features. + ++ Elastic expansion ++ Support multi-version and multi-type databases ++ Database connection: one-click connection, external network access ++ Database connection: manual backup, automatic backup ++ Database monitoring: resource, status, and performance monitoring ++ Database migration: public network migration and file migration ++ Database high availability: Supports multiple database instances ++ Visual database management: Create, delete, update, pause, restart the database + +## Quick start + +Deploy and access a PostgreSQL database in just 6 steps. + +1、Open Sealos desktop and click Database. + +![start_1](./imgs/start_1.png) + +2、Click on the creation of a new cluster. + +![start_2](./imgs/start_2.png) + +3、Select the corresponding database and parameters. + +![start_3](./imgs/start_3.png) + +4、Click on deployment. + +![start_4](./imgs/start_4.png) + +5、Enter DB to view details. + +![start_5](./imgs/start_5.png) + +6、Database details. + +![start_6](./imgs/start_6.png) + +![start_7](./imgs/start_7.png) + +![start_8](./imgs/start_8.png) + +![start_9](./imgs/start_9.png) + +![start_10](./imgs/start_10.png) + +![start_11](./imgs/start_11.png) + +![start_12](./imgs/start_12.png) + +## Database connection + +### One-click connection + +1、Enter database, click Connect. + +![connect_1](./imgs/connect_1.png) + +2、Manipulate the database at the terminal. + +![connect_2](./imgs/connect_2.png) + +### Extranet access + +1、Enter database, click Connect. + +![connect_3](./imgs/connect_3.png) + +2、Confirm open database. + +![connect_4](./imgs/connect_4.png) + +3、Copy the database connection information. + +![connect_5](./imgs/connect_5.png) + +4、Connect to the database in the Database Connection tool. + +![connect_6](./imgs/connect_6.png) + +![connect_7](./imgs/connect_7.png) + +## Database backup + +### Manual backup + +1、Enter the database backup page, click Backup. + +![backup_1](./imgs/backup_1.png) + +2、Enter the backup information to start the backup. + +![backup_2](./imgs/backup_2.png) + +3、Check Backup status. + +![backup_3](./imgs/backup_3.png) + +![backup_4](./imgs/backup_4.png) + +### Automatic backup + +1、Enter the database backup page, click Backup. + +![backup_5](./imgs/backup_5.png) + +2、Enable automatic backup and enter backup information. + +![backup_6](./imgs/backup_6.png) + +## Database migration + +This section uses the MySQL database as an example to describe how to migrate a database. + +### Public network migration + +Public network migration involves two databases: the source database and the target database. The source database is the +data source for migration, and the target database is the data destination for migration. The following introduction +demonstrates the local database as the source database. + +1、Enter the target database and connect to the target database. + +![migration_1](./imgs/migration_1.png) + +2、Create the corresponding database in the terminal interface. (skip this step if the corresponding database already +exists) + +![migration_2](./imgs/migration_2.png) + +```bash +# Example of creating a database sql statement: +$ create database testmysql; +``` + +3、Enter the public network migration page of the target database, click the Migrate button. + +![migration_3](./imgs/migration_3.png) + +4、View migration configuration information. + +![migration_4](./imgs/migration_4.png) + +Copy the migration configuration information as follows. + +```bash +# Example of an sql statement for setting configuration information: +$ set global binlog_format=ROW; +$ set binlog_row_image ='FULL'; +``` + +5、Set the configuration information in the source database (MySQL and Postgres require manual configuration +information, Mongo does not require configuration). + +```bash +# xample of an sql statement for setting configuration information: +$ set global binlog_format=ROW; +$ set binlog_row_image ='FULL'; +``` +![migration_5](./imgs/migration_5.png) + +6、Enter the target database, fill in the migration information of the source database, which tables to migrate, and +fill in which database in the target database to migrate. + +![migration_6](./imgs/migration_6.png) + +If you need to continuously migrate data from the source database, enable continuous migration in the advanced +configuration as follows. + +![migration_7](./imgs/migration_7.png) + +7、View migration task information. + +![migration_8](./imgs/migration_8.png) + +8、Enter the target database, connect to the target database, and check whether the migration data is complete. + +![migration_9](./imgs/migration_9.png) + +### File migration + +1、Enter the target database and connect to the target database. + +![migration_10](./imgs/migration_10.png) + +2、Create the corresponding database in the terminal interface. (skip this step if the corresponding database already +exists) + +```bash +# Example of creating a database sql statement: +$ create database testmysql; +``` +![migration_11](./imgs/migration_11.png) + +3、Upload the migration file, enter the database name, and start the migration. + +![migration_12](./imgs/migration_12.png) + +4、File migrating, Wait for the migration result. + +![migration_13](./imgs/migration_13.png) + +![migration_14](./imgs/migration_14.png) + +5、Connect to the database to check whether the migrated data is complete. + +![migration_15](./imgs/migration_15.png) \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_1.png b/docs/5.0/docs/user-guide/database/imgs/backup_1.png new file mode 100644 index 00000000000..1755f5622f1 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_1.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_2.png b/docs/5.0/docs/user-guide/database/imgs/backup_2.png new file mode 100644 index 00000000000..44917f8d0a6 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_2.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_3.png b/docs/5.0/docs/user-guide/database/imgs/backup_3.png new file mode 100644 index 00000000000..0ddf8b9aa42 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_3.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_4.png b/docs/5.0/docs/user-guide/database/imgs/backup_4.png new file mode 100644 index 00000000000..ef9cbf5e982 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_4.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_5.png b/docs/5.0/docs/user-guide/database/imgs/backup_5.png new file mode 100644 index 00000000000..297b3965f89 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_5.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/backup_6.png b/docs/5.0/docs/user-guide/database/imgs/backup_6.png new file mode 100644 index 00000000000..aff13dcc9b0 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/backup_6.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_1.png b/docs/5.0/docs/user-guide/database/imgs/connect_1.png new file mode 100644 index 00000000000..7d7152c94a1 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_1.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_2.png b/docs/5.0/docs/user-guide/database/imgs/connect_2.png new file mode 100644 index 00000000000..46f35589f72 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_2.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_3.png b/docs/5.0/docs/user-guide/database/imgs/connect_3.png new file mode 100644 index 00000000000..3b1c76fe602 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_3.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_4.png b/docs/5.0/docs/user-guide/database/imgs/connect_4.png new file mode 100644 index 00000000000..eb861ab4b7f Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_4.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_5.png b/docs/5.0/docs/user-guide/database/imgs/connect_5.png new file mode 100644 index 00000000000..408532d632b Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_5.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_6.png b/docs/5.0/docs/user-guide/database/imgs/connect_6.png new file mode 100644 index 00000000000..92f075af1fb Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_6.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/connect_7.png b/docs/5.0/docs/user-guide/database/imgs/connect_7.png new file mode 100644 index 00000000000..c4555350415 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/connect_7.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_1.png b/docs/5.0/docs/user-guide/database/imgs/migration_1.png new file mode 100644 index 00000000000..fc27c6626da Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_1.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_10.png b/docs/5.0/docs/user-guide/database/imgs/migration_10.png new file mode 100644 index 00000000000..fc27c6626da Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_10.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_11.png b/docs/5.0/docs/user-guide/database/imgs/migration_11.png new file mode 100644 index 00000000000..9ddbee46346 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_11.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_12.png b/docs/5.0/docs/user-guide/database/imgs/migration_12.png new file mode 100644 index 00000000000..3f814eee38e Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_12.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_13.png b/docs/5.0/docs/user-guide/database/imgs/migration_13.png new file mode 100644 index 00000000000..137e4ea3d8d Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_13.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_14.png b/docs/5.0/docs/user-guide/database/imgs/migration_14.png new file mode 100644 index 00000000000..b7a2267dd5e Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_14.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_15.png b/docs/5.0/docs/user-guide/database/imgs/migration_15.png new file mode 100644 index 00000000000..3f814eee38e Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_15.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_2.png b/docs/5.0/docs/user-guide/database/imgs/migration_2.png new file mode 100644 index 00000000000..9b2b39d5df8 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_2.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_3.png b/docs/5.0/docs/user-guide/database/imgs/migration_3.png new file mode 100644 index 00000000000..c7f7411bd67 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_3.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_4.png b/docs/5.0/docs/user-guide/database/imgs/migration_4.png new file mode 100644 index 00000000000..214e9f5477c Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_4.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_5.png b/docs/5.0/docs/user-guide/database/imgs/migration_5.png new file mode 100644 index 00000000000..f86eeb99def Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_5.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_6.png b/docs/5.0/docs/user-guide/database/imgs/migration_6.png new file mode 100644 index 00000000000..8c0949d5da9 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_6.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_7.png b/docs/5.0/docs/user-guide/database/imgs/migration_7.png new file mode 100644 index 00000000000..0f2814956c6 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_7.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_8.png b/docs/5.0/docs/user-guide/database/imgs/migration_8.png new file mode 100644 index 00000000000..d15a9d1ba45 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_8.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/migration_9.png b/docs/5.0/docs/user-guide/database/imgs/migration_9.png new file mode 100644 index 00000000000..3f814eee38e Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/migration_9.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_1.png b/docs/5.0/docs/user-guide/database/imgs/start_1.png new file mode 100644 index 00000000000..c060483b38a Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_1.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_10.png b/docs/5.0/docs/user-guide/database/imgs/start_10.png new file mode 100644 index 00000000000..544b065a2be Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_10.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_11.png b/docs/5.0/docs/user-guide/database/imgs/start_11.png new file mode 100644 index 00000000000..2ef27b4ecb4 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_11.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_12.png b/docs/5.0/docs/user-guide/database/imgs/start_12.png new file mode 100644 index 00000000000..c1519b2d62f Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_12.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_2.png b/docs/5.0/docs/user-guide/database/imgs/start_2.png new file mode 100644 index 00000000000..f83990d4edb Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_2.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_3.png b/docs/5.0/docs/user-guide/database/imgs/start_3.png new file mode 100644 index 00000000000..971e368049b Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_3.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_4.png b/docs/5.0/docs/user-guide/database/imgs/start_4.png new file mode 100644 index 00000000000..058b3932703 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_4.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_5.png b/docs/5.0/docs/user-guide/database/imgs/start_5.png new file mode 100644 index 00000000000..333ffbed2bb Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_5.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_6.png b/docs/5.0/docs/user-guide/database/imgs/start_6.png new file mode 100644 index 00000000000..42acc0ad91f Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_6.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_7.png b/docs/5.0/docs/user-guide/database/imgs/start_7.png new file mode 100644 index 00000000000..63f79d1ac78 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_7.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_8.png b/docs/5.0/docs/user-guide/database/imgs/start_8.png new file mode 100644 index 00000000000..b3ab09bf8c2 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_8.png differ diff --git a/docs/5.0/docs/user-guide/database/imgs/start_9.png b/docs/5.0/docs/user-guide/database/imgs/start_9.png new file mode 100644 index 00000000000..40b2a7308f1 Binary files /dev/null and b/docs/5.0/docs/user-guide/database/imgs/start_9.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-1.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-1.png new file mode 100644 index 00000000000..e1cb4ea789d Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-1.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-2.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-2.png new file mode 100644 index 00000000000..fd26d149699 Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-2.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-3.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-3.png new file mode 100644 index 00000000000..bf6d3a713e1 Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-3.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-4.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-4.png new file mode 100644 index 00000000000..1d051c97977 Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-4.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-5.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-5.png new file mode 100644 index 00000000000..2c090d3eb5c Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-5.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-6.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-6.png new file mode 100644 index 00000000000..80f11b12ecc Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-6.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-7.png b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-7.png new file mode 100644 index 00000000000..f3446edd301 Binary files /dev/null and b/docs/5.0/docs/user-guide/kubepanel/images/kubepanel-7.png differ diff --git a/docs/5.0/docs/user-guide/kubepanel/kubepanel.md b/docs/5.0/docs/user-guide/kubepanel/kubepanel.md new file mode 100644 index 00000000000..3f01581432c --- /dev/null +++ b/docs/5.0/docs/user-guide/kubepanel/kubepanel.md @@ -0,0 +1,44 @@ +--- +keywords: [Kubernetes IDE, Kubernetes management, Kubepanel features, Kubernetes monitoring, Kubernetes resource visualization] +description: Kubepanel is a user-friendly Kubernetes IDE offering real-time monitoring, resource visualization, and easy management of Kubernetes clusters. +--- + +# Kubepanel + +Kubepanel is a Kubernetes IDE (Integrated Development Environment). It provides a user-friendly graphical interface for +managing Kubernetes clusters, offering features such as real-time monitoring and resource visualization. It aims to make +Kubernetes more accessible and manageable, even for those who are not very familiar with Kubernetes command-line tools. + +## Quick Start + +Open the Sealos desktop and click on Kubepanel. + +![](images/kubepanel-1.png) + +### Viewing Resources + +In Kubepanel, you can view Workload, Config, Network, and Storage resources. + +![](images/kubepanel-2.png) + +### Deploying Resources + +Click on the plus sign. + +![](images/kubepanel-3.png) + +You need to select a template before you can write the resource YAML. + +![](images/kubepanel-4.png) + +Here, the Deployment template is selected. Click Create to create the Deployment resource. + +![](images/kubepanel-5.png) + +After creation, you can see the Deployment resource under Workload/Deployments. + +![](images/kubepanel-6.png) + +Kubepanel also supports deleting or updating resources. + +![](images/kubepanel-7.png) diff --git a/docs/5.0/docs/user-guide/objectstorage/images/1.png b/docs/5.0/docs/user-guide/objectstorage/images/1.png new file mode 100644 index 00000000000..f959ae40c22 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/1.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/10.png b/docs/5.0/docs/user-guide/objectstorage/images/10.png new file mode 100644 index 00000000000..e636144a8ee Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/10.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/11.png b/docs/5.0/docs/user-guide/objectstorage/images/11.png new file mode 100644 index 00000000000..771f415a78f Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/11.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/12.png b/docs/5.0/docs/user-guide/objectstorage/images/12.png new file mode 100644 index 00000000000..76c1487cf46 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/12.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/13.png b/docs/5.0/docs/user-guide/objectstorage/images/13.png new file mode 100644 index 00000000000..5abeca82fce Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/13.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/14.png b/docs/5.0/docs/user-guide/objectstorage/images/14.png new file mode 100644 index 00000000000..0c4f82ee237 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/14.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/15.png b/docs/5.0/docs/user-guide/objectstorage/images/15.png new file mode 100644 index 00000000000..7884c768e0d Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/15.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/16.png b/docs/5.0/docs/user-guide/objectstorage/images/16.png new file mode 100644 index 00000000000..3f76223396a Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/16.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/17.png b/docs/5.0/docs/user-guide/objectstorage/images/17.png new file mode 100644 index 00000000000..21c2d258ae6 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/17.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/2.png b/docs/5.0/docs/user-guide/objectstorage/images/2.png new file mode 100644 index 00000000000..25d649f88c7 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/2.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/3.png b/docs/5.0/docs/user-guide/objectstorage/images/3.png new file mode 100644 index 00000000000..176138f21cc Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/3.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/4.png b/docs/5.0/docs/user-guide/objectstorage/images/4.png new file mode 100644 index 00000000000..acbf8f0358b Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/4.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/5.png b/docs/5.0/docs/user-guide/objectstorage/images/5.png new file mode 100644 index 00000000000..52bb97ac553 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/5.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/6.png b/docs/5.0/docs/user-guide/objectstorage/images/6.png new file mode 100644 index 00000000000..d9f63a24dd9 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/6.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/7.png b/docs/5.0/docs/user-guide/objectstorage/images/7.png new file mode 100644 index 00000000000..b5a7d5ea362 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/7.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/8.png b/docs/5.0/docs/user-guide/objectstorage/images/8.png new file mode 100644 index 00000000000..e0bb62a7b74 Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/8.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/images/9.png b/docs/5.0/docs/user-guide/objectstorage/images/9.png new file mode 100644 index 00000000000..f2284d0f79b Binary files /dev/null and b/docs/5.0/docs/user-guide/objectstorage/images/9.png differ diff --git a/docs/5.0/docs/user-guide/objectstorage/objectstorage.md b/docs/5.0/docs/user-guide/objectstorage/objectstorage.md new file mode 100644 index 00000000000..4344f21ec85 --- /dev/null +++ b/docs/5.0/docs/user-guide/objectstorage/objectstorage.md @@ -0,0 +1,213 @@ +--- +keywords: [Object Storage, Sealos, unstructured data, bucket permissions, SDK access] +description: Learn how to use Sealos Object Storage to manage unstructured data, set bucket permissions, and access via SDKs. Quick start guide included. +--- + +# Object Storage + +**Object Storage** is Sealos' built-in object storage service, which is primarily used to store and manage unstructured +data. + +Currently, **Object Storage** has the following features: + +- Upload files to bucket. +- Download files from bucket. +- Expose the access permission of the bucket. +- Use SDK to access bucket. +- Monitors bucket resource metrics. +- Static host. + +## Quick start + +### Upload files to bucket + +Open the Sealos desktop and click on Object Storage. + +![](./images/1.png) + +Create a bucket. + +![](./images/2.png) + +Set bucket name to test and permission to private. + +Bucket Permissions Explanation: + +- private: Private bucket, no public access. +- publicRead: Shared bucket with public read access. +- publicReadwrite: Shared bucket with public read and write access. + +![](./images/3.png) + +Bucket is created successfully. + +![](./images/4.png) + +Upload file. + +![](./images/5.png) + +File uploaded successfully. + +![](./images/6.png) + +### Expose the access permission of the bucket + +Click the Edit button. + +![](./images/7.png) + +Set Bucket Permission to publicRead and click the Application button. + +![](./images/8.png) + +Copy file link. + +![](./images/9.png) + +Paste to browser address bar to access files. + +![](./images/10.png) + +### View the access key configuration + +An Object Storage user consists of a unique access key (username) and corresponding secret key (password). Internal is +the internal access address of Object Storage, and External is the external access address of Object Storage. + +![](./images/11.png) + +### Use SDK to access bucket + +The SDK requires three parameters to access bucket: AccessKey, SecretKey, and Endpoint (Internal or External). If the +Region parameter is required, us-east-1 is used by default. + +#### Go Client SDK + +Detailed documentation reference: https://min.io/docs/minio/linux/developers/go/API.html + +Example: Use the Go Client SDK to upload the style.css file to the sv3dd7u4-test bucket, and set the endpoint to the +external address. If the service is deployed in the K8s cluster, you can change the endpoint to the internal address. + +```go +package main + +import ( + "context" + "fmt" + "log" + "os" +) +import "github.com/minio/minio-go/v7" +import "github.com/minio/minio-go/v7/pkg/credentials" + +func main() { + endpoint := "objectstorageapi.xxx.xxx.xxx" + accessKey := "xxxxxxxx" + secretKey := "xxxxxxxxxxxxxxxx" + // init minio client + minioClient, err := minio.New(endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKey, secretKey, ""), + }) + if err != nil { + log.Fatalln(err) + } + // get local file + file, err := os.Open("./style.css") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + fileStat, err := file.Stat() + if err != nil { + fmt.Println(err) + return + } + // put object + uploadInfo, err := minioClient.PutObject(context.Background(), "sv3dd7u4-test", "style.css", file, fileStat.Size(), minio.PutObjectOptions{ContentType: "text/css"}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Successfully uploaded bytes: ", uploadInfo) +} +``` + +File uploaded successfully. + +![](./images/12.png) + +#### Java Client SDK + +Detailed documentation reference: https://min.io/docs/minio/linux/developers/java/API.html + +Example: Use the Java Client SDK to upload the style1.css file to the sv3dd7u4-test bucket, and set the endpoint to the +external address. If the service is deployed in the K8s cluster, you can change the endpoint to the internal address. + +```xml + + + io.minio + minio + 8.5.9 + +``` + +```javascript +package org.example; + +import io.minio.MinioClient; +import io.minio.UploadObjectArgs; + +public class FileUploader { + public static void main(String[] args) throws Exception { + + MinioClient minioClient = + MinioClient.builder() + .endpoint("https://objectstorageapi.xxx.xxx.xxx") + .credentials("xxxxxxxx", "xxxxxxxxxxxxxxxx") + .build(); + + + minioClient.uploadObject( + UploadObjectArgs.builder() + .bucket("sv3dd7u4-test") + .object("style1.css") + .filename("src/main/java/org/example/style1.css") + .build()); + + System.out.println("Successfully uploaded bytes."); + } +} +``` + +File uploaded successfully. + +![](./images/13.png) + +#### Omit other language SDK + +Detailed documentation reference: https://min.io/docs/minio/linux/developers/minio-drivers.html + +### Static host + +Create a permission for publicRead/publicReadwrite bucket, click Enable Hosting. + +![](./images/14.png) + +Click on the address to jump to access. + +![](./images/15.png) + +Click Custom Domain. + +![](./images/16.png) + +In the Update area of App Launchpad, you can customize the domain. + +![](./images/17.png) + + + + diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/cost-center.md b/docs/5.0/docs/user-guide/system-function/cost-center/cost-center.md new file mode 100644 index 00000000000..860654e6129 --- /dev/null +++ b/docs/5.0/docs/user-guide/system-function/cost-center/cost-center.md @@ -0,0 +1,52 @@ +--- +sidebar_position: 1 +keywords: [Cost Center, Billing Details, Resource Analysis, Pricing Information, Invoice Generation] +description: Discover Sealos Cost Center with modules for cost overview, billing details, resource analysis, pricing information, and invoice generation. +--- + +# Cost Center + +The Cost Center consists of five modules: Cost Overview, Billing Details, Resource Analysis, Standard, and Create +Invoice. + +Cost Overview and Billing Details display the overall income and expenditure of the account and the expenses of various +applications, Resource Analysis shows the expenditure distribution of each resource, Standard explains pricing +information, and the Create Invoice module supports generating invoices for recharges. + +## Quick Start + +Open the Sealos desktop and click on the Cost Center. + +![](./images/cost-center-1.png) + +### Home Page + +Displays cost trend charts for all available zones and annual income and expenditure charts. + +![](./images/cost-center-2.png) + +### Cost Overview and Billing Details + +Supports quick bill lookup and filtering by setting time range, available zones, workspaces, application types, and +application names. + +![](./images/cost-center-3.png) + +### Resource Analysis + +Shows resource quota and cost distribution charts, with filtering options by setting time range, available zones, +workspaces, application types, and application names. + +![](./images/cost-center-4.png) + +### Standard + +Displays resource pricing and supports filtering by setting available zones. + +![](./images/cost-center-5.png) + +### Create invoice + +Invoice Generation. + +![](./images/cost-center-6.png) \ No newline at end of file diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-1.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-1.png new file mode 100644 index 00000000000..1b5c7185831 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-1.png differ diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-2.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-2.png new file mode 100644 index 00000000000..ba3484d5ba8 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-2.png differ diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-3.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-3.png new file mode 100644 index 00000000000..861d2d689f2 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-3.png differ diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-4.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-4.png new file mode 100644 index 00000000000..3d65e3543e3 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-4.png differ diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-5.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-5.png new file mode 100644 index 00000000000..769290de9ac Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-5.png differ diff --git a/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-6.png b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-6.png new file mode 100644 index 00000000000..6d325929ee5 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/cost-center/images/cost-center-6.png differ diff --git a/docs/5.0/docs/user-guide/system-function/system-function.md b/docs/5.0/docs/user-guide/system-function/system-function.md new file mode 100644 index 00000000000..920cc943eec --- /dev/null +++ b/docs/5.0/docs/user-guide/system-function/system-function.md @@ -0,0 +1,15 @@ +--- +sidebar_position: 0 +keywords: [Sealos, system functions, cost center, workspace, work order, team collaboration] +description: Sealos offers system functions like cost center, workspace, and work order to enhance team collaboration and manage billing efficiently. +--- + +# Overview + +Sealos offers system functions such as cost center, workspace, and work order. + +- Cost Center: View bills, pricing standards, and issue invoices. + +- Workspace: Facilitate team collaboration and isolation through different workspaces. + +- Work order: Submit issue feedback. diff --git a/docs/5.0/docs/user-guide/system-function/work-order/images/order-1.png b/docs/5.0/docs/user-guide/system-function/work-order/images/order-1.png new file mode 100644 index 00000000000..17c998b9077 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/work-order/images/order-1.png differ diff --git a/docs/5.0/docs/user-guide/system-function/work-order/images/order-2.png b/docs/5.0/docs/user-guide/system-function/work-order/images/order-2.png new file mode 100644 index 00000000000..4a67c1e36ba Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/work-order/images/order-2.png differ diff --git a/docs/5.0/docs/user-guide/system-function/work-order/images/order-3.png b/docs/5.0/docs/user-guide/system-function/work-order/images/order-3.png new file mode 100644 index 00000000000..bda58e0da42 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/work-order/images/order-3.png differ diff --git a/docs/5.0/docs/user-guide/system-function/work-order/images/order-4.png b/docs/5.0/docs/user-guide/system-function/work-order/images/order-4.png new file mode 100644 index 00000000000..73d6f1e86aa Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/work-order/images/order-4.png differ diff --git a/docs/5.0/docs/user-guide/system-function/work-order/images/order-5.png b/docs/5.0/docs/user-guide/system-function/work-order/images/order-5.png new file mode 100644 index 00000000000..d0c30fb6c3b Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/work-order/images/order-5.png differ diff --git a/docs/5.0/docs/user-guide/system-function/work-order/work-order.md b/docs/5.0/docs/user-guide/system-function/work-order/work-order.md new file mode 100644 index 00000000000..396538c339a --- /dev/null +++ b/docs/5.0/docs/user-guide/system-function/work-order/work-order.md @@ -0,0 +1,35 @@ +--- +sidebar_position: 3 +keywords: [Sealos, Work Order, Sealos desktop, issue submission, customer support] +description: Learn how to use Sealos Work Order to submit issues and get support quickly. Follow our step-by-step guide for a seamless experience. +--- + +# Work Order + +If you encounter any issues while using Sealos, you can use the Work Order to submit your questions and feedback. We +will address them as soon as possible. + +## Quick Start + +Open the Sealos desktop and click on Work Order. + +![](./images/order-1.png) + +Click on New Order. + +![](./images/order-2.png) + +Select the type of issue, upload relevant appendix, describe the details of the issue, and then click Submit Order. + +![](./images/order-3.png) + +After submitting the order, a 🤖 chatbot will respond to your queries. If you find that the chatbot’s response does not +resolve the issue, you can click Switch to Manual to connect with a human agent. + +![](./images/order-4.png) + +Click on the Order details to re-enter the chat interface. If the issue is resolved, you can click Close to close the +order. + +![](./images/order-5.png) + diff --git a/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-1.png b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-1.png new file mode 100644 index 00000000000..7619f27cace Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-1.png differ diff --git a/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-2.png b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-2.png new file mode 100644 index 00000000000..557cbd219f7 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-2.png differ diff --git a/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-3.png b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-3.png new file mode 100644 index 00000000000..a3a2ccac9a3 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-3.png differ diff --git a/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-4.png b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-4.png new file mode 100644 index 00000000000..4f7af080174 Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-4.png differ diff --git a/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-5.png b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-5.png new file mode 100644 index 00000000000..6cc985fa8ff Binary files /dev/null and b/docs/5.0/docs/user-guide/system-function/workspace/images/workspace-5.png differ diff --git a/docs/5.0/docs/user-guide/system-function/workspace/workspace.md b/docs/5.0/docs/user-guide/system-function/workspace/workspace.md new file mode 100644 index 00000000000..5e8e7d858c6 --- /dev/null +++ b/docs/5.0/docs/user-guide/system-function/workspace/workspace.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 2 +keywords: [workspace management, multi-tenant resource isolation, Sealos desktop, invite users, workspace roles] +description: Learn how to manage workspaces in Sealos, including creating, switching, and inviting users with different roles and permissions. +--- + +# Workspace + +A workspace is a multi-tenant resource isolation mechanism that divides a cluster into multiple independent workspaces, +each with its own resource quotas and permissions. This mechanism supports team collaboration and resource allocation. + +A personal workspace is a special form of a workspace where each user has a personal space with the same name as their +username. Although the resource quotas and permissions for a personal space are the same as those of a regular +workspace, it cannot be deleted or have other users added. + +## Quick Start + +### Creating a Workspace + +Open the Sealos desktop, click on the Personal Workspace, and then click on Manage Workspace. + +![](./images/workspace-1.png) + +Click on Create Workspace. + +![](./images/workspace-2.png) + +### Switching Workspaces + +Return to the Sealos desktop, click on the Personal Workspace, and select the hello workspace to switch to it. + +![](./images/workspace-3.png) + +### Inviting Users + +In the Manage Workspaces section, click on Invite Member, select the members' roles and permissions, click on Generate +Invitation Link, and then send the link to other users. + +There are three different roles for users within a workspace, with the following descriptions of roles and permissions: + +- Owner: The owner has full permissions for the workspace, including deleting the workspace, viewing/creating/modifying + all resources within the workspace, and inviting users to join the workspace as managers or developers. + +- Manager: The manager has administrative permissions for the workspace, including viewing/creating/modifying all + resources within the workspace and inviting users to join the workspace as developers. + +- Developer: The developer has development permissions, including viewing the status of resources within the workspace. + +![](./images/workspace-4.png) + +### Accepting an Invitation + +When a user receives an invitation link, they should visit the link and click on Accept Invitation to join the +workspace. + +![](./images/workspace-5.png) diff --git a/docs/5.0/docs/user-guide/terminal/images/database-terminal-1.png b/docs/5.0/docs/user-guide/terminal/images/database-terminal-1.png new file mode 100644 index 00000000000..f1fcc577c7f Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/database-terminal-1.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/database-terminal.png b/docs/5.0/docs/user-guide/terminal/images/database-terminal.png new file mode 100644 index 00000000000..ac1a69448ca Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/database-terminal.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/nginx-terminal-1.png b/docs/5.0/docs/user-guide/terminal/images/nginx-terminal-1.png new file mode 100644 index 00000000000..a94f8582d11 Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/nginx-terminal-1.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/nginx-terminal.png b/docs/5.0/docs/user-guide/terminal/images/nginx-terminal.png new file mode 100644 index 00000000000..44fad2374a0 Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/nginx-terminal.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/terminal-1.png b/docs/5.0/docs/user-guide/terminal/images/terminal-1.png new file mode 100644 index 00000000000..78ce7eb3f24 Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/terminal-1.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/terminal-pod.png b/docs/5.0/docs/user-guide/terminal/images/terminal-pod.png new file mode 100644 index 00000000000..bc47999cf4f Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/terminal-pod.png differ diff --git a/docs/5.0/docs/user-guide/terminal/images/terminal.webp b/docs/5.0/docs/user-guide/terminal/images/terminal.webp new file mode 100644 index 00000000000..151254f046c Binary files /dev/null and b/docs/5.0/docs/user-guide/terminal/images/terminal.webp differ diff --git a/docs/5.0/docs/user-guide/terminal/terminal.md b/docs/5.0/docs/user-guide/terminal/terminal.md new file mode 100644 index 00000000000..efc44a56a2a --- /dev/null +++ b/docs/5.0/docs/user-guide/terminal/terminal.md @@ -0,0 +1,99 @@ +--- +keywords: [Sealos Terminal, Kubernetes Pod, Kubernetes Terminal, Application Container Terminal, Direct Database Connection] +description: Discover the powerful Sealos Terminal for direct interaction with Kubernetes Pods, application containers, and databases, enhancing efficiency and control. +--- + +# Terminal + +Integrated within the [Sealos](https://cloud.sealos.io) Cloud Operating System is the Terminal, an application of +profound potency. Mirroring the terminal in standalone operating systems, it facilitates users to interact directly with +the operating system, executing various operations via command entry. + +![](images/terminal.webp) + +The value of the Terminal rests in its efficiency, flexibility, and powerful capabilities. For a plethora of tasks, +employing the Terminal proves swifter and more concise than utilizing a Graphical User Interface (GUI). It is an +indispensable instrument for developers, permitting users to gain a profound understanding and control of the Sealos +Cloud Operating System. + +**Every user's Terminal is in fact operating within a Pod of Kubernetes**, which can be observed in the Terminal using +the following command: + +![](images/terminal-pod.png) + +## Accessing the Terminal of an Application Container + +One may directly access the Terminal of any application container via the Terminal App. Suppose you have deployed an +application such as Nginx via application management, one can navigate directly to the Nginx application's detail page, +click on the three dots on the right side of the details, and then click on 'Terminal' to access the Terminal of the +Nginx application. + +![](images/nginx-terminal.png) + +![](images/nginx-terminal-1.png) + +## 终端一键直连数据库 + +It is also possible to establish a direct connection to the database created in +the[Database App](../dbprovider/dbprovider.md) with a single click via the Terminal. + +Navigate to the database details page and click on '一键连接' on the left: + +![](images/database-terminal.png) + +This will take you directly to the Terminal App and connect to the database: + +![](images/database-terminal-1.png) + +## Direct Manipulation of Kubernetes Resources via Terminal + +:::danger + +The following operations necessitate foundational knowledge of Kubernetes and container-related concepts, avoid casual +execution without this understanding. + +::: + +Veteran Kubernetes users can utilize the Terminal to manipulate Kubernetes resources directly, affording many advantages +for such seasoned users: + ++ Enables batch operations and automation ++ Offers high flexibility ++ Allows in-depth troubleshooting + +Below are examples of common operations with Kubernetes resources within the Terminal: + ++ View the list of user's Pods + +```bash +kubectl get pods +``` + ++ Create and manage resource + +```bash +# Create resources using YAML or JSON files +$ kubectl create -f + +# Create or update resources using YAML or JSON files +$ kubectl apply -f + +# Delete specified resource type and name +$ kubectl delete + +# View the status of a specified Deployment's rolling update +$ kubectl rollout status deployment/ +``` + ++ Troubleshooting + +```bash +# Obtain detailed information about a specific resource, including events and status +$ kubectl describe + +# Obtain logs of a specific container in a specific Pod +$ kubectl logs -c + +# Open a terminal in a specific Pod for debugging purposes +$ kubectl exec -it +``` \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/Intro.md b/docs/5.0/i18n/zh-Hans/Intro.md new file mode 100644 index 00000000000..0d617755300 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/Intro.md @@ -0,0 +1,58 @@ +--- +description: Sealos是基于Kubernetes的云操作系统,简化云原生部署。它支持公私云环境,提供应用和数据库管理,实现高效经济的云计算体验。探索Sealos,开启简单云计算之旅。 +keywords: [Sealos, 云操作系统, Kubernetes, 云原生, 公有云, 私有云, 分布式应用, 应用管理, 数据库管理, 云计算] +--- + +import Highlight from '@site/src/components/Highlight' + +# 什么是 Sealos? + + + +云原生生态之庞大与复杂,无疑让许多企业感到手足无措,这个生态依然缺乏好用的、开箱即用的发行版。在云原生市场还急需一款云操作系统以进一步降低云原生门槛与成本。 + +Sealos 的问世为企业开启了一扇新窗。它为企业与开发者提供了一种全新的选择,无论在公有云还是私有云中,都只需安装一个云操作系统。它能让各类应用在操作系统上稳定安全地运行,一并解决了应用所需的各种依赖问题。 + +Sealos 坚守的理念是:**云可以像 Linux 一样简单**。你可以像使用 Linux 一样安装后立即投入使用,使用过程无需过多纠结。唯一的差别仅在于,Linux 是安装在单一服务器上,而 Sealos 则是安装在整个数据中心。 + +在 Sealos 的架构中,**公有云与私有云并无本质上的差异**,他们应是同一套代码的不同实例,唯一的区别仅在于配置与所安装应用的差异。在内网安装即是私有云,而在公网对外提供服务则成为公有云。 + +我们坚信,随着 Sealos 的不断发展与进步,未来的云将更加开放,更加简单。云计算的美好将属于所有算力的提供者,云的价值将由所有云计算的参与者共享。**他们将能够在多元化的市场环境中,以更经济的方式享受云计算所带来的种种便利。** + +## 概述 + +Sealos 是一款以 Kubernetes 为内核的**云操作系统发行版**。它以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,使企业能够**像使用个人电脑一样**简单地使用云。 + +用户将可以像使用个人电脑一样在 Kubernetes 上一键安装任意高可用分布式应用,几乎不需要任何专业的交付和运维成本。同时,利用独特的集群镜像能力,用户可将任意分布式应用打包成 OCI 镜像,自由组合各种分布式应用,轻松订制所需的云。通过强大且灵活的应用商店功能,可满足各类用户的多样化需求。 + +![](./images/sealos-desktop-zh.webp) + +## 适用场景 & 优势 + +Sealos 是一款强大的业务运行平台,它能完美支持 Java、Go、Python、PHP 等各类应用,不受编程语言限制。该平台为应用提供稳定的运行环境,并解决后端依赖问题,例如数据库、对象存储和消息队列等。更进一步,它还能灵活处理应用配置管理、服务发现、公网暴露,以及自动伸缩等问题。 + +### 公有云 + +如果您的业务需要运行在公有云环境中,那么您可以直接使用 [Sealos 提供的公有云服务](https://cloud.sealos.io)。 + +#### Sealos 的能力 + +- 🚀 **应用管理**:在应用商店中轻松管理并快速发布可公网访问的分布式应用。 +- 🗄️ **数据库管理**:秒级创建高可用数据库,支持 MySQL、PostgreSQL、MongoDB 和 Redis。 +- 🌥️ **公私一致**:即是公有云也是私有云,支持传统应用无缝迁移到云环境。 + +#### Sealos 的优势 + +- 💰 **高效 & 经济**:仅需为容器付费,自动伸缩杜绝资源浪费,大幅度节省成本。 +- 🌐 **通用性强,无心智负担**:专注于业务本身,无需担心复杂性,几乎没有学习成本。 +- 🛡️ **灵活 & 安全**:多租户共享机制在确保安全的同时,实现资源隔离与高效协作。 + +### 私有云 + +Sealos 云操作系统 **100% 开源**,您可在 [GitHub](https://github.com/labring/sealos) 上找到所有源代码,因此 **Sealos 公有云**的全部功能也可以部署在私有云环境中,以满足您更多样化的业务需求。 + +### 强大的应用交付能力 + +- Sealos 具备优秀的 Kubernetes 生命周期管理能力,还可以自由定制 Kubernetes 环境。 +- Sealos 可以将整个集群打包,并一键交付到客户环境中。所有服务和业务都可以整体交付。 +- 不同于 Docker 主要关注单机镜像,Sealos 更进一步,可以将**整个集群**或者某个分布式应用进行打包。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/community.md b/docs/5.0/i18n/zh-Hans/community.md new file mode 100644 index 00000000000..a7f0dd161af --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/community.md @@ -0,0 +1,16 @@ +--- +keywords: [Sealos社区, 开源项目, 微信交流群, Discord服务器, GitHub Issue, 技术支持, 用户交流, 问题反馈] +description: 探索Sealos开源社区:加入微信群、Discord服务器与开发者交流,关注Twitter获取最新动态,通过GitHub反馈问题。我们致力于为您提供全方位支持。 +--- + +# 社区 + +Sealos 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。 + ++ 📱 扫码加入社区微信交流群👇 + +![](https://oss.laf.run/htr4n1-images/sealos-qr-code.jpg) + ++ 💬 加入我们的 [Discord 服务器](https://discord.gg/qzBmGGZGk7),与 Sealos 开发者和终端用户进行交流。 ++ 🐦 在 [Twitter](https://twitter.com/sealosio) 上关注我们。 ++ 🐞 请将任何 Sealos 的 Bug、问题和需求提交到 [GitHub Issue](https://github.com/labring/sealos/issues/new/choose)。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/QA.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/QA.md new file mode 100644 index 00000000000..26d1329224c --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/QA.md @@ -0,0 +1,226 @@ +--- +sidebar_position: 1 +keywords: [Sealos, 镜像构建, Kubernetes运行时, 版本兼容性, 文件目录位置] +description: 了解Sealos常见问题及解决方案,包括镜像构建、Kubernetes运行时选择、版本兼容性和文件目录位置调整。 +--- + +# 常见问题 + +使用Sealos时,您可能会遇到一些问题。以下是一些常见问题的答案和解决方法。 + +## 镜像构建问题 + +### Q1: 在构建阶段如何设置代理服务? + +在执行构建命令时,可以通过设置HTTP_PROXY环境变量来配置代理服务。 + +```shell +HTTP_PROXY=socket5://127.0.0.1:7890 sealos build xxxxx +``` + +### Q2:如何启用buildah的调试日志? + +若需要查看buildah的调试日志,可以通过设定`BUILDAH_LOG_LEVEL`环境变量实现。 + +```shell +BUILDAH_LOG_LEVEL=debug sealos images +``` + +### Q3:如何在Pod中执行Sealos构建? + +若在Pod中执行Sealos构建,请按以下步骤操作: + +1. 在Pod中构建镜像,可用以下YAML配置创建Deployment。 + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: sealoscli + name: sealoscli +spec: + replicas: 1 + selector: + matchLabels: + app: sealoscli + strategy: {} + template: + metadata: + labels: + app: sealoscli + spec: + containers: + - image: #用你的sealos镜像替换 + name: sealoscli + stdin: true + stdinOnce: true + securityContext: + privileged: true +``` + +2. 创建Dockerfile。以下是一个例子,根据需要进行修改。 + +```dockerfile +FROM bitnami/minideb:buster + +ARG TARGETOS +ARG TARGETARCH + +LABEL from=bitnami/minideb:buster platform=rootcloud team=oam tag=buster name=base + +RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list && sed -i "s@http://security.debian.org@http://mirrors.aliyun.com/debian-security@g" /etc/apt/sources.list +RUN install_packages curl iputils-ping net-tools telnet procps vim wget jq + +ENV LANG=C.UTF-8 +ENV LANGUAGE=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ENV TZ=Asia/Shanghai +``` + +3. 在Pod中执行构建命令。 + +```shell +sealos build --arch arm64 --build-arg TARGETOS=linux --build-arg TARGETARCH=arm64 -t test -f Dockerfile . +``` + +### Q4:如何使用其他构建工具构建集群镜像? + +如果您想使用 Docker 或 Podman 等其他容器工具来构建集群镜像,您可以借助 [sreg](https://github.com/labring/sreg) 来缓存镜像。 + +以下是操作步骤: + +1. 安装 sreg: + ```shell + wget https://github.com/labring/sreg/releases/download/v0.1.1/sreg_0.1.1_linux_amd64.tar.gz + tar -xzf sreg_0.1.1_linux_amd64.tar.gz sreg + mv sreg /usr/bin/ + ``` +2. 缓存镜像: + ```shell + sreg save --registry-dir=registry . + ``` +3. 构建集群镜像: + ```shell + docker build -t xxxx -f Sealfile . + ``` + +### Q5:执行Sealos构建时遇到“lgetxattr /var/lib/containers/storage/overlay/0c2afe770ec7870ad4639f18a1b50b3a84718f95c8907f3d54e14dbf0a01d50d/merged/dev/ptmx: no such device”错误? + +这个问题可能与`fuse-overlayfs`的版本有关。建议您从[这里](https://github.com/containers/fuse-overlayfs/releases)下载最新版本下载并替换`/bin/fuse-overlayfs`。 + +## 运行时选择问题 + +### Q1:如何选择Kubernetes运行时? + +Sealos会根据您选择的镜像决定使用哪种运行时。如果选择了kubernetes-docker镜像,Sealos将使用Docker作为运行时;如果选择了kubernetes-crio镜像,Sealos将使用CRI-O作为运行时。 + +## 版本兼容性问题 + +### Q1:报错:"Applied to cluster error: failed to init exec auth.sh failed exit status 127"? + +此问题常因您使用的sealos版本和镜像版本不匹配造成。请确认您的镜像版本和sealos的版本是匹配的。 +例如,若您正使用形如kubernetes:v1.xx.x的版本,可能需要升级sealos,特别是在使用较老版本的sealos,而sealos集群镜像则使用了最新版时。 +另一种解决方法是选择对应版本的sealos镜像。比如,如果您的sealos版本是4.1.3,那么集群镜像应选择形如kuberntes:v1.24.0-4.1.3的版本。 +确保镜像版本和sealos版本的匹配,可以帮助避免此类问题。 + +### Q2: 如果您在集群中新增了其他域名,或者修改了 service 的 CIDR,并且在添加 master 时出现了错误 + +为了解决这个问题,Sealos 团队在 4.2.0 版本进行了相应的修复。具体的修复内容和讨论可以在这个 pull request 中查看:https://github.com/labring/sealos/pull/2943 。 + +所以,如果您遇到了这个问题,我们建议您升级到 Sealos 4.2.0 版本。更新后的版本应该能够正确处理这些变更,并且在添加 master 时不会出现错误。 + +## 文件和目录位置问题 + +### Q1:如何修改`/root/.sealos`默认目录的存储位置? + +若需修改默认的存储位置,可以设置SEALOS_RUNTIME_ROOT环境变量,然后运行sealos命令。建议您将这个环境变量设置为全局的,这样在其他命令或场景中也可以方便使用。 + +```shell +export SEALOS_RUNTIME_ROOT=/data/.sealos +sealos run labring/kubernetes:v1.24.0 +``` + +### Q2:如何修改`/var/lib/sealos`默认目录的存储位置? + +若需修改默认的存储位置,可以设置SEALOS_DATA_ROOT环境变量,然后运行sealos命令。同样,建议您将这个环境变量设置为全局的。 + +```shell +export SEALOS_DATA_ROOT=/data/sealos +sealos run labring/kubernetes:v1.24.0 +``` + +### Q3: 如何修改 Sealos 镜像数据和状态的存储路径? + +> 在使用 Sealos 集群时,可能需要改变默认的镜像数据存储路径和状态数据的存储路径。默认情况下,这些数据被存储在 `/etc/containers/storage.conf` 文件定义的位置。 + +1. **查看当前存储配置** + 首先,我们可以使用下面的命令来查看当前的镜像存储配置: + ``` + sealos images --debug + ``` + 这个命令会打印出包含当前存储配置的文件,例如: + ``` + 2023-06-07T16:27:02 debug using file /etc/containers/storage.conf as container storage config + REPOSITORY TAG IMAGE ID CREATED SIZE + ``` +2. **修改镜像数据存储路径** + 如果你希望更改镜像数据的存储路径,你可以编辑 `/etc/containers/storage.conf` 文件。在这个文件中,找到并修改 `graphroot` 字段设置为新的路径。例如: + ``` + vim /etc/containers/storage.conf + ``` + 在编辑器中,将 `graphroot` 字段的值修改为你希望的新路径。 +3. **修改状态数据存储路径** + 参考 Buildah 的设计,Sealos 同样提供了状态数据存储路径的设置。在同样的配置文件 `/etc/containers/storage.conf` 中,找到并修改 `runroot` 字段为新的路径。 + +通过以上步骤,你可以将 Sealos 集群的镜像数据和状态数据保存到新的地址。每次运行 Sealos 命令时,它都将使用你在 `graphroot` 和 `runroot` 中设置的新路径来分别存储镜像数据和状态数据。 + +### Q4:ssh传输文件时,如何禁止检查文件的md5? + +在网络环境良好时,禁用md5检查可以极大提升传输速度。若不想在ssh传输文件时检查文件的md5,可将SEALOS_SCP_CHECKSUM环境变量设置为false以禁用此功能。建议将此环境变量设为全局,以便在多场景下使用。 + +```shell +export SEALOS_SCP_CHECKSUM=false +sealos run labring/kubernetes:v1.24.0 +``` + + +## 其他问题 + +### Q1:image-cri-shim导致端口大量占用,耗尽服务器socket资源? + +出现此问题时,可通过以下命令解决: + +```shell +wget https://github.com/labring/sealos/releases/download/v4.2.0/sealos_4.2.0_linux_amd64.tar.gz && tar xvf sealos_4.2.0_linux_amd64.tar.gz image-cri-shim +sealos exec -r master,node "systemctl stop image-cri-shim" +sealos scp "./image-cri-shim" "/usr/bin/image-cri-shim" +sealos exec -r master,node "systemctl start image-cri-shim" +sealos exec -r master,node "image-cri-shim -v" +``` + +### Q2:报错"[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists" + +此问题可通过升级至Sealos 4.1.7+来解决。 + +### Q3:报错:"function "semverCompare" not defined" + +此问题可通过升级至Sealos 4.1.4+来解决。 + +我们希望这些解答能帮助您解决在使用Sealos过程中遇到的问题。如果还有其他问题,欢迎随时提问。 + +## 使用技巧 + +### Q1: 如何清理 Sealos 集群的缓存文件 + +> 在使用 Sealos 集群时,安装过程中可能会在本地存储一些缓存文件,这些文件会重复占用磁盘空间。那么,如何清理这些缓存文件以释放磁盘空间呢? + +我们提供了一个非常简单的解决方案,只需要执行以下命令: + +```shell +sealos unmount --all && sealos rm --all +``` +这个命令的作用是移除所有缓存的 Sealos 集群镜像文件,以及所有的相关挂载点。--all 选项表示处理所有相关文件和挂载点。 +执行这个命令后,所有 Sealos 集群的缓存文件就会被清理掉,从而释放出被它们占用的磁盘空间。 +这是一个非常有用的技巧,特别是对于在磁盘空间有限的环境中运行 Sealos 集群的用户来说。在你感觉磁盘空间被占用过多时,不妨尝试执行这个命令来释放一些空间。 +请注意,这个命令只会删除缓存文件,不会影响已经运行的集群。也就是说,执行这个命令后,你的集群仍然可以正常运行。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md new file mode 100644 index 00000000000..b00e901c2d3 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/build-image-using-registry-sync.md @@ -0,0 +1,88 @@ +--- +sidebar_position: 2 +keywords: [Sealos镜像构建, 镜像缓存, registry-proxy, skopeo copy, 镜像仓库同步] +description: 了解Sealos镜像构建的改进指南,提升构建效率,使用registry-proxy和skopeo copy实现镜像仓库同步,优化镜像管理。 +--- +--- + +# 镜像构建改进指南 + +## 深入理解Sealos镜像构建 + +为了了解Sealos镜像构建的背后所做的工作,我们将首先揭示它在底层究竟进行了哪些操作。以下是一个直观的架构图: + +![](images/build.png) + +Sealos在构建镜像过程中涵盖了以下几个核心步骤: + +- **缓存镜像**:解析构建执行时的工作目录(在这里我们称之为"context"目录),将缓存镜像保存到registry结构并存储在./registry目录下。 +- **构建镜像**:在context目录中进行镜像构建,生成新的镜像。(请注意,构建镜像时需要将./registry目录进行复制。) + +## 提升镜像构建效率 + +当前项目中,我们借用了`github.com/distribution/distribution`的源代码,在执行缓存镜像的过程中直接调用了registry的sdk并启动了registry-proxy功能。借助于镜像仓库的缓存能力,我们将镜像缓存并存入context/registry目录。 + +这个过程的关键就在于调用了distribution仓库的方法进行保存镜像: + +- 启动 registry-proxy 功能。 +- 保存镜像摘要及索引相关数据(通过调用saveManifestAndGetDigest方法)。 +- 保存镜像文件数据(通过调用saveBlobs方法)。 + +这种方法确实具有一些显著的优点: + +- 轻量化:无需依赖其他组件即可保存镜像。 +- 自由控制:可以自由控制保存逻辑,无需依赖第三方组件。 + +然而,我们也注意到了一些潜在的问题: + +- 对新手来说,代码理解难度较高,不易清晰了解这里的逻辑。 +- 无法缓存使用token认证的方式。 +- 需要依赖一些临时存储空间,对空间有要求。 + +考虑到这些问题,我们决定尝试一种新的模式:在本地启动一个轻量的registry,使用`skopeo copy`的sdk进行代码复用。这一改变直接解决了之前所有的问题。 + +![](images/registry-build.png) + +**所以,新的构建方式 ✨镜像仓库同步✨ 优雅登场 🎉🎉** + +官方仓库中的[#3154](https://github.com/labring/sealos/pull/3154)这个PR已经完成了这个功能的实现。目前,Sealos支持这两种方式进行镜像构建。接下来,我会介绍如何启动新功能(如果新功能表现稳定,我们可能会废弃旧的构建方式)。 + +## 如何启动新功能 + +> Sealos v4.3.0 以上版本默认支持此功能。 + +启动新功能非常简单,只需在你构建镜像之前添加一个环境变量即可。这个功能同时支持build和merge两个命令。 + +```shell +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t test . +``` + +以下是执行上述命令后的预期输出: + +```tex +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t test . +Getting image source signatures +Copying blob fee740108510 done +Copying config f92f3ea6e4 done +Writing manifest to image destination +Storing signatures +Getting image source signatures +Copying blob 08409d417260 done +Copying config 44dd6f2230 done +Writing manifest to image destination +Storing signatures +2023-06-01T13:16:07 info saving images busybox, alpine +STEP 1/2: FROM scratch +STEP 2/2: COPY registry ./registry +COMMIT test +Getting image source signatures +Copying blob 13ab73c881c8 done +Copying config 4e22d16b36 done +Writing manifest to image destination +Storing signatures +--> 4e22d16b366 +Successfully tagged localhost/test:latest +4e22d16b366e9fec25641522a74cbd73a7db67dc0516b8f8e00200c4d0551592 +``` + +希望以上内容可以帮助您更好地理解并使用Sealos的新镜像构建方式。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md new file mode 100644 index 00000000000..8d048f8a984 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/dual-stack-cluster.md @@ -0,0 +1,793 @@ +--- +sidebar_position: 5 +keywords: [双栈集群, calico安装, sealos, Kubernetes, IPv6配置, Clusterfile, k8s双栈, 网络配置, Kubernetes集群, Calico双栈] +description: 使用calico安装双栈集群,详细步骤包括生成和编辑Clusterfile,添加IPv6的pod和svc的CIDR范围,确保Kubernetes集群的双栈网络配置。 +--- + +# 使用calico安装双栈集群 + +1. 前置条件 + - sealos 版本 >=4.3.0 + - 每个主机都有一个IPv4主机和IPv6地址,并且可以互通通过IPv4和IPv6地址 + - calico采用vxlan模式, 内核版本必须大于 3.12。 可以参考[官方文档](https://github.com/cyclinder/kubespray/blob/042c960c6617f8a360a8281464ff63f99ee2471c/docs/calico.md) +2. 运行 `sealos gen` 生成一个 Clusterfile,例如: + +```shell +$ sealos gen labring/kubernetes:v1.26.1 labring/helm:v3.10.3 labring/calico:v3.25.0 --masters 192.168.0.10 --nodes 192.168.0.11 --passwd "xxx" >Clusterfile +``` + +注意:labring/helm 应当在 labring/calico 之前。 + +生成的 Clusterfile 如下: + +
+Clusterfile + + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.10:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.11:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.26.1 + - labring/helm:v3.10.3 + - labring/calico:v3.25.0 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 +status: {} + +--- +BootstrapTokens: null +CertificateKey: "" +LocalAPIEndpoint: + AdvertiseAddress: 192.168.0.10 + BindPort: 6443 +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: InitConfiguration + +--- +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + ExtraArgs: + audit-log-format: json + audit-log-maxage: "7" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/kubernetes/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yml + enable-aggregator-routing: "true" + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + TimeoutForControlPlane: null +CIImageRepository: "" +CIKubernetesVersion: "" +CertificatesDir: "" +ClusterName: "" +ComponentConfigs: null +ControlPlaneEndpoint: apiserver.cluster.local:6443 +ControllerManager: + ExtraArgs: + bind-address: 0.0.0.0 + cluster-signing-duration: 876000h + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +DNS: + ImageRepository: "" + ImageTag: "" + Type: "" +Etcd: + External: null + Local: + DataDir: "" + ExtraArgs: + listen-metrics-urls: http://0.0.0.0:2381 + ImageRepository: "" + ImageTag: "" + PeerCertSANs: null + ServerCertSANs: null +FeatureGates: null +ImageRepository: "" +KubernetesVersion: v1.26.1 +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10 + ServiceSubnet: 10.96.0.0/22 +Scheduler: + ExtraArgs: + bind-address: 0.0.0.0 + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration + +--- +CACertPath: /etc/kubernetes/pki/ca.crt +ControlPlane: + CertificateKey: "" + LocalAPIEndpoint: + AdvertiseAddress: "" + BindPort: 6443 +Discovery: + BootstrapToken: null + File: null + TLSBootstrapToken: "" + Timeout: 5m0s +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: JoinConfiguration + +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +bindAddress: 0.0.0.0 +bindAddressHardFail: false +clientConnection: + acceptContentTypes: "" + burst: 10 + contentType: application/vnd.kubernetes.protobuf + kubeconfig: "" + qps: 5 +clusterCIDR: "" +configSyncPeriod: 15m0s +conntrack: + maxPerCore: 32768 + min: 131072 + tcpCloseWaitTimeout: 1h0m0s + tcpEstablishedTimeout: 24h0m0s +detectLocal: + bridgeInterface: "" + interfaceNamePrefix: "" +detectLocalMode: "" +enableProfiling: false +healthzBindAddress: 0.0.0.0:10256 +hostnameOverride: "" +iptables: + masqueradeAll: false + masqueradeBit: 14 + minSyncPeriod: 1s + syncPeriod: 30s +ipvs: + excludeCIDRs: + - 10.103.97.2/32 + minSyncPeriod: 0s + scheduler: "" + strictARP: false + syncPeriod: 30s + tcpFinTimeout: 0s + tcpTimeout: 0s + udpTimeout: 0s +kind: KubeProxyConfiguration +metricsBindAddress: 0.0.0.0:10249 +mode: ipvs +nodePortAddresses: null +oomScoreAdj: -999 +portRange: "" +showHiddenMetricsForVersion: "" +udpIdleTimeout: 250ms +winkernel: + enableDSR: false + forwardHealthCheckVip: false + networkName: "" + rootHnsEndpointName: "" + sourceVip: "" + +--- +address: 0.0.0.0 +apiVersion: kubelet.config.k8s.io/v1beta1 +authentication: + anonymous: + enabled: false + webhook: + cacheTTL: 2m0s + enabled: true + x509: + clientCAFile: /etc/kubernetes/pki/ca.crt +authorization: + mode: Webhook + webhook: + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s +cgroupDriver: cgroupfs +cgroupsPerQOS: true +clusterDomain: cluster.local +configMapAndSecretChangeDetectionStrategy: Watch +containerLogMaxFiles: 5 +containerLogMaxSize: 10Mi +contentType: application/vnd.kubernetes.protobuf +cpuCFSQuota: true +cpuCFSQuotaPeriod: 100ms +cpuManagerPolicy: none +cpuManagerReconcilePeriod: 10s +enableControllerAttachDetach: true +enableDebugFlagsHandler: true +enableDebuggingHandlers: true +enableProfilingHandler: true +enableServer: true +enableSystemLogHandler: true +enforceNodeAllocatable: +- pods +- pods +eventBurst: 10 +eventRecordQPS: 5 +evictionHard: + imagefs.available: 15% + memory.available: 100Mi + nodefs.available: 10% + nodefs.inodesFree: 5% +evictionPressureTransitionPeriod: 5m0s +failSwapOn: true +fileCheckFrequency: 20s +hairpinMode: promiscuous-bridge +healthzBindAddress: 0.0.0.0 +healthzPort: 10248 +httpCheckFrequency: 20s +imageGCHighThresholdPercent: 85 +imageGCLowThresholdPercent: 80 +imageMinimumGCAge: 2m0s +iptablesDropBit: 15 +iptablesMasqueradeBit: 14 +kind: KubeletConfiguration +kubeAPIBurst: 10 +kubeAPIQPS: 5 +localStorageCapacityIsolation: true +logging: + flushFrequency: 5000000000 + format: text + options: + json: + infoBufferSize: "0" + verbosity: 0 +makeIPTablesUtilChains: true +maxOpenFiles: 1000000 +maxPods: 110 +memoryManagerPolicy: None +memorySwap: {} +memoryThrottlingFactor: 0.8 +nodeLeaseDurationSeconds: 40 +nodeStatusMaxImages: 50 +nodeStatusReportFrequency: 10s +nodeStatusUpdateFrequency: 10s +oomScoreAdj: -999 +podPidsLimit: -1 +port: 10250 +registerNode: true +registryBurst: 10 +registryPullQPS: 5 +rotateCertificates: true +runtimeRequestTimeout: 2m0s +seccompDefault: false +serializeImagePulls: true +shutdownGracePeriod: 0s +shutdownGracePeriodCriticalPods: 0s +staticPodPath: /etc/kubernetes/manifests +streamingConnectionIdleTimeout: 4h0m0s +syncFrequency: 1m0s +topologyManagerPolicy: none +topologyManagerScope: container +volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ +volumeStatsAggPeriod: 1m0s +``` + +
+ +3. 生成 Clusterfile 后,编辑Clusterfile,然后添加IPv6 的 pod 和svc 的 CIDR 范围。这里使用fd85:ee78:d8a6:8607::1:0000/112、fd85:ee78:d8a6:8607::1000/116作为参考示例。主要修改以下信息。 + +
+Clusterfile + + +```yaml +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112 #增加pod IPv6地址段 + ServiceSubnet: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 #增加svc IPv6地址段 +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + - 2001:db8::f816:3eff:fe8c:910a #增加控制节点的ipv6地址,如果你需要使用此IP访问apiserver + ExtraArgs: + service-cluster-ip-range: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 #增加svc IPv6地址段 +ControllerManager: + ExtraArgs: + node-cidr-mask-size-ipv6: 120 #默认为64 + node-cidr-mask-size-ipv4: 24 #默认为24 +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +kind: KubeProxyConfiguration +clusterCIDR: "100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112" #增加pod IPv6地址段 +--- +# 添加Calico双栈配置 +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + bgp: Disabled + ipPools: + - blockSize: 22 + cidr: 100.64.0.0/10 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + - blockSize: 122 + cidr: fd85:ee78:d8a6:8607::1:0000/112 #增加pod IPv6地址段 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*|em.*" + nodeAddressAutodetectionV6: + interface: "eth.*|en.*|em.*" +``` + +
+ +最终的Clusterfile会是这样。 + +
+Clusterfile + + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.10:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.11:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.26.1 + - labring/helm:v3.10.3 + - labring/calico:v3.25.0 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 +status: {} + +--- +BootstrapTokens: null +CertificateKey: "" +LocalAPIEndpoint: + AdvertiseAddress: 192.168.0.10 + BindPort: 6443 +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: InitConfiguration + +--- +APIServer: + CertSANs: + - 127.0.0.1 + - apiserver.cluster.local + - 10.103.97.2 + - 192.168.0.10 + - 2001:db8::f816:3eff:fe8c:910a + ExtraArgs: + service-cluster-ip-range: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 + audit-log-format: json + audit-log-maxage: "7" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/kubernetes/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yml + enable-aggregator-routing: "true" + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/kubernetes + MountPath: /etc/kubernetes + Name: audit + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /var/log/kubernetes + MountPath: /var/log/kubernetes + Name: audit-log + PathType: DirectoryOrCreate + ReadOnly: false + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + TimeoutForControlPlane: null +CIImageRepository: "" +CIKubernetesVersion: "" +CertificatesDir: "" +ClusterName: "" +ComponentConfigs: null +ControlPlaneEndpoint: apiserver.cluster.local:6443 +ControllerManager: + ExtraArgs: + node-cidr-mask-size-ipv6: 120 + node-cidr-mask-size-ipv4: 24 + bind-address: 0.0.0.0 + cluster-signing-duration: 876000h + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +DNS: + ImageRepository: "" + ImageTag: "" + Type: "" +Etcd: + External: null + Local: + DataDir: "" + ExtraArgs: + listen-metrics-urls: http://0.0.0.0:2381 + ImageRepository: "" + ImageTag: "" + PeerCertSANs: null + ServerCertSANs: null +FeatureGates: null +ImageRepository: "" +KubernetesVersion: v1.26.1 +Networking: + DNSDomain: "" + PodSubnet: 100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112 + ServiceSubnet: 10.96.0.0/22,fd85:ee78:d8a6:8607::1000/116 +Scheduler: + ExtraArgs: + bind-address: 0.0.0.0 + feature-gates: "" + ExtraVolumes: + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true + - HostPath: /etc/localtime + MountPath: /etc/localtime + Name: localtime + PathType: File + ReadOnly: true +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration + +--- +CACertPath: /etc/kubernetes/pki/ca.crt +ControlPlane: + CertificateKey: "" + LocalAPIEndpoint: + AdvertiseAddress: "" + BindPort: 6443 +Discovery: + BootstrapToken: null + File: null + TLSBootstrapToken: "" + Timeout: 5m0s +NodeRegistration: + CRISocket: /run/containerd/containerd.sock + IgnorePreflightErrors: null + KubeletExtraArgs: null + Name: "" + Taints: null +Patches: null +SkipPhases: null +apiVersion: kubeadm.k8s.io/v1beta3 +kind: JoinConfiguration + +--- +apiVersion: kubeproxy.config.k8s.io/v1alpha1 +bindAddress: 0.0.0.0 +bindAddressHardFail: false +clientConnection: + acceptContentTypes: "" + burst: 10 + contentType: application/vnd.kubernetes.protobuf + kubeconfig: "" + qps: 5 +clusterCIDR: "" +configSyncPeriod: 15m0s +conntrack: + maxPerCore: 32768 + min: 131072 + tcpCloseWaitTimeout: 1h0m0s + tcpEstablishedTimeout: 24h0m0s +detectLocal: + bridgeInterface: "" + interfaceNamePrefix: "" +detectLocalMode: "" +enableProfiling: false +healthzBindAddress: 0.0.0.0:10256 +hostnameOverride: "" +iptables: + masqueradeAll: false + masqueradeBit: 14 + minSyncPeriod: 1s + syncPeriod: 30s +ipvs: + excludeCIDRs: + - 10.103.97.2/32 + minSyncPeriod: 0s + scheduler: "" + strictARP: false + syncPeriod: 30s + tcpFinTimeout: 0s + tcpTimeout: 0s + udpTimeout: 0s +kind: KubeProxyConfiguration +clusterCIDR: "100.64.0.0/10,fd85:ee78:d8a6:8607::1:0000/112" +metricsBindAddress: 0.0.0.0:10249 +mode: ipvs +nodePortAddresses: null +oomScoreAdj: -999 +portRange: "" +showHiddenMetricsForVersion: "" +udpIdleTimeout: 250ms +winkernel: + enableDSR: false + forwardHealthCheckVip: false + networkName: "" + rootHnsEndpointName: "" + sourceVip: "" + +--- +address: 0.0.0.0 +apiVersion: kubelet.config.k8s.io/v1beta1 +authentication: + anonymous: + enabled: false + webhook: + cacheTTL: 2m0s + enabled: true + x509: + clientCAFile: /etc/kubernetes/pki/ca.crt +authorization: + mode: Webhook + webhook: + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s +cgroupDriver: cgroupfs +cgroupsPerQOS: true +clusterDomain: cluster.local +configMapAndSecretChangeDetectionStrategy: Watch +containerLogMaxFiles: 5 +containerLogMaxSize: 10Mi +contentType: application/vnd.kubernetes.protobuf +cpuCFSQuota: true +cpuCFSQuotaPeriod: 100ms +cpuManagerPolicy: none +cpuManagerReconcilePeriod: 10s +enableControllerAttachDetach: true +enableDebugFlagsHandler: true +enableDebuggingHandlers: true +enableProfilingHandler: true +enableServer: true +enableSystemLogHandler: true +enforceNodeAllocatable: +- pods +- pods +eventBurst: 10 +eventRecordQPS: 5 +evictionHard: + imagefs.available: 15% + memory.available: 100Mi + nodefs.available: 10% + nodefs.inodesFree: 5% +evictionPressureTransitionPeriod: 5m0s +failSwapOn: true +fileCheckFrequency: 20s +hairpinMode: promiscuous-bridge +healthzBindAddress: 0.0.0.0 +healthzPort: 10248 +httpCheckFrequency: 20s +imageGCHighThresholdPercent: 85 +imageGCLowThresholdPercent: 80 +imageMinimumGCAge: 2m0s +iptablesDropBit: 15 +iptablesMasqueradeBit: 14 +kind: KubeletConfiguration +kubeAPIBurst: 10 +kubeAPIQPS: 5 +localStorageCapacityIsolation: true +logging: + flushFrequency: 5000000000 + format: text + options: + json: + infoBufferSize: "0" + verbosity: 0 +makeIPTablesUtilChains: true +maxOpenFiles: 1000000 +maxPods: 110 +memoryManagerPolicy: None +memorySwap: {} +memoryThrottlingFactor: 0.8 +nodeLeaseDurationSeconds: 40 +nodeStatusMaxImages: 50 +nodeStatusReportFrequency: 10s +nodeStatusUpdateFrequency: 10s +oomScoreAdj: -999 +podPidsLimit: -1 +port: 10250 +registerNode: true +registryBurst: 10 +registryPullQPS: 5 +rotateCertificates: true +runtimeRequestTimeout: 2m0s +seccompDefault: false +serializeImagePulls: true +shutdownGracePeriod: 0s +shutdownGracePeriodCriticalPods: 0s +staticPodPath: /etc/kubernetes/manifests +streamingConnectionIdleTimeout: 4h0m0s +syncFrequency: 1m0s +topologyManagerPolicy: none +topologyManagerScope: container +volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ +volumeStatsAggPeriod: 1m0s +--- +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + bgp: Disabled + ipPools: + - blockSize: 22 + cidr: 100.64.0.0/10 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + - blockSize: 122 + cidr: fd85:ee78:d8a6:8607::1:0000/112 + encapsulation: VXLAN + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*|em.*" + nodeAddressAutodetectionV6: + interface: "eth.*|en.*|em.*" +``` + +
+ +4. 运行 `sealos apply -f Clusterfile` 部署集群。 + +5. 更多参考[Calico官网](https://docs.tigera.io/calico/latest/networking/ipam/ipv6) 和 [k8s官方文档](https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/dual-stack-support/) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md new file mode 100644 index 00000000000..3d4d919f4ce --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/image-build-standardized.md @@ -0,0 +1,108 @@ +--- +sidebar_position: 1 +keywords: [Sealos镜像构建, Kubernetes部署, 目录结构标准化, Kubefile参数, 容器镜像管理, 集群初始化, 应用配置, Helm chart, 环境变量设置, 镜像仓库配置] +description: 学习Sealos镜像构建的标准化目录配置,掌握Kubefile参数使用,优化Kubernetes部署流程。本指南助您规范化构建过程,提高效率,降低错误率。 +--- + +# 镜像构建与标准化目录配置 + +在开展 Sealos 镜像构建任务前,我们建议先构建一个符合规范的目录结构。这样能够使构建过程更加规范,易于管理,同时也能降低出错率。这篇文章将详细指导你如何创建这样一个目录结构,并解释每个目录的用途。 + +## 目录结构示例 + +一个完整的、符合规范的目录结构示例如下: + +```shell +. +├── charts +│   └── nginx +│   ├── Chart.lock +│   ├── charts +│   ├── Chart.yaml +│   ├── README.md +│   ├── templates +│   ├── values.schema.json +│   └── values.yaml +├── images +│   └── shim +│   └── nginxImages +├── init.sh +├── Kubefile +├── manifests +│   └── nginx +│   ├── deployment.yaml +│   ├── ingress.yaml +│   └── service.yaml +├── opt +│   └── helm +└── registry +``` + +## 目录描述 + +每个目录在构建过程中都扮演着特定的角色,以下是他们的详细描述: + +- `Kubefile` (必需):这个文件类似于 Dockerfile,是构建镜像的核心文件。它定义了构建过程中的各个步骤,如基础镜像选择、环境变量设置、文件复制等。 +- `manifests`:这个目录用于存放 Kubernetes 的 yaml 文件,这些文件描述了你的应用的配置信息,如 Pod、Service、Deployment 的配置。 +- `charts`:这个目录用于存放 Helm chart 文件,Helm chart 是 Kubernetes 的一个包管理工具,可以简化 Kubernetes 应用的部署和管理。 +- `images/shim`:这个目录用于存放无法从 yaml 文件或 Helm chart 中自动提取的镜像。在构建过程中,sealos 将自动拉取这些镜像。 +- `opt`:二进制文件存储在这里。 +- `registry`:这个目录用于存放构建过程中拉取到本地的镜像。在构建过程中,该目录将自动生成,无需手动创建。 +- `init.sh`:这个脚本在构建过程中由 GitHub Action 自动运行,你可以在这个脚本中编写一些自动化的工作,如初始化环境、预处理数据等。([cluster-image](https://github.com/labring-actions/cluster-image)的规则) + +## Kubefile 参数 + +`Kubefile` 文件是镜像构建的核心,它支持多种参数,以下是这些参数的详细解析: + +```shell +FROM labring/kubernetes:v1.24.0 +ENV version v1.1.0 +COPY manifests ./manifests +COPY registry ./registry +ENTRYPOINT ["kubectl apply -f manifests/tigera-operator.yaml"] +CMD ["kubectl apply -f manifests/custom-resources.yaml"] +``` + +各个参数的描述: + +- `FROM`:这个指令用于设置构建的基础镜像,所有的构建步骤都基于这个镜像进行。 +- `LABEL`: `LABEL`定义一些sealos集群镜像的内部配置。 + + - `check` 集群镜像运行前的一些检查脚本操作 + - `clean` 集群reset或者节点删除的清理脚本 + - `clean-registry` 集群reset时候的清理镜像仓库的脚本 + - `image` 集群的lvscare镜像地址(sealos的IPVS镜像) + - `init` 集群初始化的脚本 + - `init-registry` 集群初始化时启动容器镜像仓库的脚本 + - `sealos.io.type` 集群镜像类型,目前主要是rootfs、application和patch。 + - rootfs 是运行集群的基础镜像,比如kubernetes、kubernetes-docker这种包含镜像、二进制等集群所需的。(**每个节点都需要存在**) + - application 是应用镜像,比如calico、helm、istio等应用服务的镜像。(**只存储到master0节点**) + - patch是在rootfs镜像后需要调整的,是另一种修改rootfs镜像的方式(**还有一种方式是Config方式**),它会覆盖默认的集群运行的第一个镜像。 + + - `sealos.io.version` 镜像的版本号,目前开启的是v1beta1 + - `version` 集群的版本号,当前是kubernetes的版本号 + - `vip` 是VIP的地址,为修改IPVS的虚IP使用 + +- `ENV`:`ENV`指令将环境变量``设置为值``。(rootfs中默认会有一些默认的环境变量,可以修改rootfs中一些默认参数,比如镜像仓库的账号密码、docker、containerd的存储目录等等) + + 具体的集群镜像需要具体查看,`sealos inspect`镜像看一下对应的环境变量,不同版本的镜像略有不同。 + + - SEALOS_SYS_CRI_ENDPOINT: 当前集群镜像的criSocket (不同类型集群镜像可能不同) + - criData: cri的数据目录 + - defaultVIP: 默认的VIP地址 + - disableApparmor: 是否禁用apparmor (containerd有这个问题) + - registryConfig: 容器镜像仓库的配置目录 + - registryData: 容器镜像仓库的数据目录(因为是目录进行了挂载,其实这个配置没有实际意义,它实际还是存储在/var/lib/sealos下面) + - registryDomain: 默认镜像仓库的域名 + - registryPassword: 默认镜像仓库的密码 + - registryPort: 默认镜像仓库的密码 + - registryUsername: 默认镜像仓库的账户 + - sandboxImage: 默认cri启动的sandbox_image。(无需写repo只需要写镜像名称,eg: pasue:3.7) +- `COPY`:`COPY`指令从``复制新的文件或目录,并将它们添加到容器的文件系统路径``上。(**注意,需要把registry目录进行拷贝,否则集群没有容器镜像**) +- `ENTRYPOINT`:这个指令用于设置镜像的启动命令,当镜像启动时,这条命令会被执行。 +- `CMD`:这个指令也用于设置镜像的启动命令,但它与 ENTRYPOINT 指令的区别在于,如果用户在运行镜像时(`sealos run --cmd`)提供了启动命令,CMD 指令中的命令将会被覆盖。 + +在构建过程中,Sealos 还会自动设置一些内置的环境变量,包括(前缀为'SEALOS_SYS'的环境变量无法被修改): + +- SEALOS_SYS_KUBE_VERSION:Kubernetes的版本号,例如 v1.26.0 +- SEALOS_SYS_SEALOS_VERSION:Sealos的版本号,例如 4.1.3 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/build.png b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/build.png new file mode 100644 index 00000000000..d1ae7d6aead Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/build.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png new file mode 100644 index 00000000000..485b531d28f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/registry-build.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png new file mode 100644 index 00000000000..70ef65ffa13 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/images/sealos-run.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/sealos-run.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/sealos-run.md new file mode 100644 index 00000000000..fa011d475d2 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/sealos-run.md @@ -0,0 +1,138 @@ +--- +sidebar_position: 2 +keywords: [Sealos Run, Kubernetes集群部署, 容器编排, 节点管理, 镜像分发, 集群初始化, 证书管理, IPVS规则, Kubeadm配置, Clusterfile] +description: 深入解析Sealos Run命令的工作原理,包括节点检查、镜像分发、集群初始化等九大步骤,助您轻松部署和管理Kubernetes集群。 +--- + +# Sealos Run 的工作原理 + +以下是 `sealos run` 命令的详细工作原理。为了帮助您更好地理解,我们将其分解为九个主要步骤。 + +## 1. 执行命令 + +首先,用户通过执行以下命令启动 Sealos: + +```bash +sealos run kubernetes:v1.23.8 +``` + +## 2. 执行 Pipeline + +命令执行后,Sealos 开始执行一系列相关的操作步骤,我们称之为 "Pipeline"。这个过程包括以下几个子步骤: + +### 2.1 节点检查 + +Sealos 会对所有节点进行检查,以确保它们都是可用的。例如,检查是否存在重复的主机名,以及所有节点的时间是否已经同步。 + +### 2.2 拉取镜像 + +接着,Sealos 从远程仓库拉取 Kubernetes 的镜像,并将其加载到本地存储。 + +### 2.3 渲染配置 + +然后,Sealos 会对拉取到的镜像的 rootfs(文件系统)进行配置渲染,这是为了准备后续的节点分发。 + +### 2.4 分发镜像文件 + +配置渲染完成后,Sealos 会将渲染后的 rootfs 文件分发到各个节点。 + +### 2.5 分发 Registry 目录 + +此外,Sealos 也会将镜像中的 registry 目录分发到对应的 registry 角色节点。Sealos 支持两种模式: + +- **scp模式**:直接通过 scp 将目录复制到每个节点,这种方式会占用大量的网络带宽。 +- **镜像同步模式**:使用 skopeo sdk 的镜像同步机制,能够实现增量镜像同步,从而节省网络带宽。该功能可通过环境变量 `SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true` 来开启。 + +### 2.6 执行 Bootstrap + +Bootstrap 是关键步骤,包括以下操作: + +#### 2.6.1 添加 Host 解析 + +Sealos 会在每个节点上添加 registry 的 host 解析。 + +#### 2.6.2 执行 Registry-Init 脚本 + +在添加完 host 解析后,Sealos 会执行 registry-init 脚本。 + +#### 2.6.3 执行 Init 脚本 + +最后,Sealos 会执行 init 脚本,启动 Kubernetes 服务。 + +## 3. 执行 InitMaster0 + +Pipeline 执行完成后,Sealos 进入 InitMaster0 阶段。在此阶段,Sealos 会执行以下操作: + +### 3.1 生成 Kubeadm 配置 + +首先,Sealos 生成 Kubeadm 的初始化配置文件。 + +### 3.2 生成并分发证书文件 + +然后,Sealos 生成集群的所有 + +证书文件,并将它们分发到各个节点。 + +### 3.3 初始化 Master0 + +最后,Sealos 执行`kubeadm init`初始化 Master0 节点。 + +## 4. 执行 JoinMaster + +初始化完 Master0 节点后,Sealos 进入 JoinMaster 阶段。在此阶段,Sealos 会执行以下操作: + +### 4.1 同步 Kubeconfig + +首先,Sealos 将 Kubeconfig 文件同步到各个节点。 + +### 4.2 同步证书文件 + +接下来,Sealos 同步证书文件到各个节点。 + +### 4.3 生成 Join 配置 + +然后,Sealos 生成 JoinMaster 配置文件。 + +### 4.4 生成 Join 令牌 + +接着,Sealos 生成 Join 令牌。 + +### 4.5 执行 Join Master 流程 + +最后,Sealos 执行`kubeadm join`流程,让其他 Master 节点加入集群。 + +## 5. 执行 JoinNode + +所有 Master 节点加入集群后,Sealos 进入 JoinNode 阶段,执行以下操作: + +### 5.1 生成 Join 令牌 + +首先,Sealos 再次生成 Join 令牌。 + +### 5.2 生成 IPVS 规则 + +然后,Sealos 生成 IPVS 规则。 + +### 5.3 生成 Join 配置 + +接下来,Sealos 再次生成 JoinNode 配置。 + +### 5.4 执行 Join Node 流程 + +最后,Sealos 执行 Join Node 流程,让 Worker 节点加入集群。 + +## 6. 同步 IPVS + +所有节点加入集群后,Sealos 将 Master 的 IPVS 规则同步到所有节点。这里主要是通过 lvscare 的静态 pod,根据 Master 节点的数量同步静态 pod 的配置。 + +## 7. 执行 Guest 阶段 + +IPVS 规则同步完成后,Sealos 执行 Guest 阶段。这是执行集群镜像命令的阶段。 + +## 8. 写入 Clusterfile + +最后,Sealos 将最终的执行结果写入 Clusterfile。 + +这就是 `sealos run` 命令的工作原理。希望通过这篇文章,您能对 `sealos run` 命令有更深入的理解。以下是我们提到的全景图,以帮助您更好地理解整个流程。 + +![](images/sealos-run.png) diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/template-function.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/template-function.md new file mode 100644 index 00000000000..da869ef50bf --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/advanced-guide/template-function.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 9 +keywords: [Sealos模板渲染, 集群镜像构建, 模板函数增强, Kubernetes配置管理, 动态生成资源清单, semverCompare, 多版本Kubernetes支持, 镜像构建灵活性] +description: 探索Sealos的模板渲染功能,了解如何在集群镜像构建中动态生成配置、脚本和Kubernetes资源清单,以及如何使用增强的模板函数实现多版本Kubernetes支持。 +--- + +# 模板引入与函数增强 + +在 Sealos 的镜像构建过程中,"tmpl" 后缀的文件在 "etc"、"scripts" 和 "manifests" 这三个目录下的文件会被特殊处理。 + +1. "etc" 目录:这个目录通常用于存放配置文件。在构建过程中,Sealos 会对该目录下的 "tmpl" 后缀的文件进行模板渲染,渲染完成后的文件将被拷贝到集群镜像的相应目录下。 + +2. "scripts" 目录:这个目录通常用于存放执行脚本。Sealos 会对该目录下的 "tmpl" 后缀的文件进行模板渲染,生成的脚本将在集群镜像构建过程中被执行。 + +3. "manifests" 目录:这个目录通常用于存放 Kubernetes 资源清单文件。Sealos 会对该目录下的 "tmpl" 后缀的文件进行模板渲染,生成的清单文件将在集群镜像构建过程中被应用到 Kubernetes 集群中。 + +总的来说,这三个目录下的 "tmpl" 后缀文件在 Sealos 的镜像构建过程中都会被视为模板文件进行处理。这种处理方式提供了更多的灵活性,让我们可以在构建过程中动态生成配置、脚本或者 Kubernetes 资源清单。 + +在构建镜像时,我们支持 `template` 来让维护者完全控制生成的配置文件(模块渲染)。例如: + +```yaml +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +``` + +请参考 Golang 的 [text/template](https://pkg.go.dev/text/template) 了解基础介绍和更多细节。 + +## 模板函数增强 + +此外,我们支持 `templateFunc` 来增强模板函数。例如: + +```yaml +shim: /var/run/image-cri-shim.sock +cri: /run/containerd/containerd.sock +address: http://{{ .registryDomain }}:{{ .registryPort }} +force: true +debug: false +image: /var/lib/image-cri-shim +{{ if and (ne .SEALOS_SYS_KUBE_VERSION "") (semverCompare "^1.26.0" .SEALOS_SYS_KUBE_VERSION) }}version: v1{{ else }}version: v1alpha2{{ end }} +timeout: 15m +auth: {{ .registryUsername }}:{{ .registryPassword }} +``` + +在这里我们使用 `semverCompare` 来检查用户是否运行在 k8s 版本 v1.26.0 或以上,如果是,生成 `version: v1`,否则生成 `version: v1alpha2`。 +有了这个支持,我们可以很轻松地用一个集群镜像文件管理多版本的 Kubernetes 支持。 + +### 一些最常用的模板函数 + +* [semverCompare](http://masterminds.github.io/sprig/semver.html) 比较语义版本,而不是字符串比较。 +* [default](http://masterminds.github.io/sprig/defaults.html) default 可以在值为空或未定义时提供一个默认值。 +* [toYaml](https://github.com/labring/sealos/blob/main/pkg/template/funcmap.go#L66) 将当前值(对象,映射,数组)显示为 yaml 格式的字符串。 + +完整的支持函数列表,请[点击这里](http://masterminds.github.io/sprig/)。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/images/sealos.webp b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/images/sealos.webp new file mode 100644 index 00000000000..0cc05e478e9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/images/sealos.webp differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/lifecycle-management.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/lifecycle-management.md new file mode 100644 index 00000000000..c5d05e571b2 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/lifecycle-management.md @@ -0,0 +1,95 @@ +--- +sidebar_position: 0 +keywords: [Kubernetes集群, Sealos工具, 集群生命周期管理, 分布式应用, Kubernetes安装] +description: 使用Sealos工具轻松管理Kubernetes集群生命周期,支持分布式应用和自定义集群镜像,提供高可用性和离线安装功能。 +--- + +# K8s 集群生命周期管理 + +Sealos 提供一套强大的工具,使得用户可以便利地管理整个集群的生命周期。 + +## 功能介绍 + +使用 Sealos,您可以安装一个不包含任何组件的裸 Kubernetes 集群。此外,Sealos 还可以在 Kubernetes 之上,通过集群镜像能力组装各种上层分布式应用,如数据库、消息队列等。 + +Sealos 不仅可以安装一个单节点的 Kubernetes 开发环境,还能构建数千节点的生产高可用集群。 + +Sealos 具有自由伸缩集群、备份恢复、释放集群等功能,即使在离线环境中,Sealos 也能提供出色的 Kubernetes 运行体验。 + +## 主要特性 + +- 支持 ARM,v1.20 以上版本离线包支持 containerd 与 docker 集成 +- 提供 99 年证书,支持集群备份,升级 +- 不依赖 ansible、haproxy、keepalived,一个二进制工具,零依赖 +- 提供离线安装,不同 Kubernetes 版本只需使用不同的集群镜像 +- 高可用性由 ipvs 实现的 localLB 提供,占用资源少,稳定可靠,类似 kube-proxy 的实现 +- 使用 image-cri-shim 自动识别镜像名称,使离线交付更方便 +- 几乎兼容所有支持 systemd 的 x86_64 架构的环境 +- 轻松实现集群节点的增加/删除 +- 已有数万用户在线上环境使用 Sealos,稳定可靠 +- 支持集群镜像,自由组合定制你需要的集群,如 openebs 存储+数据库+minio 对象存储 +- 使用 buildah 的 sdk 实现对镜像标准统一,完全兼容 OCI 的标准 + +## 使用 Sealos 运行 Kubernetes 集群 + +使用 Sealos 运行一个 Kubernetes 集群非常简单,只需以下步骤: + +```bash +$ curl -sfL https://raw.githubusercontent.com/labring/sealos/v4.3.0/scripts/install.sh \ + | sh -s v4.3.0 labring/sealos +# 创建一个集群 +$ sealos run labring/kubernetes:v1.25.0-4.2.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \ + --masters 192.168.64.2,192.168.64.22,192.168.64.20 \ + --nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd] +``` + +[![asciicast](https://asciinema.org/a/519263.svg)](https://asciinema.org/a/519263?speed=3) + +## 在集群上运行分布式应用 + +通过 `sealos run` 命令,您可以在集群上运行各种分布式应用,如数据库、消息队列、AI 能力,甚至企业级 SaaS 软件。例如: + +```shell +# MySQL 集群 +$ sealos run labring/mysql-operator:8.0.23-14.1 + +# Clickhouse 集群 +$ sealos run labring/clickhouse:0.18.4 + +# Redis 集群 +$ sealos run labring/redis-operator:3.1.4 +``` + +## 自定义集群 + +对于 Sealos 生态没有的集群镜像,用户可以方便地自己构建和定制属于自己的集群镜像。例如: + +[构建一个 ingress 集群镜像](/self-hosting/lifecycle-management/quick-start/build-ingress-cluster-image.md) + +您还可以定制一个完全属于自己的 Kubernetes: + +Sealfile: + +```shell +FROM kubernetes:v1.25.0 +COPY flannel-chart . +COPY mysql-chart . +CMD ["helm install flannel flannel-chart", "helm install mysql mysql-chart"] +``` + +```shell +sealos build -t my-kuberentes:v1.25.0 . +sealos run my-kuberentes:v1.25.0 ... +``` + +## 常见问题 + +**Sealos 是 Kubernetes 安装工具吗?** + +安装部署只是 Sealos 的一个基本功能,如同单机操作系统有 Boot 模块一样,Sealos 的 Boot 模块可以很好地管理 Kubernetes 在任何场景下的生命周期。 + +**Sealos 和 Rancher、KubeSphere 有什么区别?** + +Sealos 的设计理念是 "化整为零,自由组装,大道至简"。Sealos 利用 Kubernetes 的能力,以简单的方式提供给用户真正需要的东西。用户需要的不一定是 Kubernetes,用户需要的是具体的能力。 + +Sealos 是极其灵活的,不会给用户带来额外负担。它的形态取决于用户的需求和安装的应用。Sealos 的核心是分布式应用,所有应用都是一等公民。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md new file mode 100644 index 00000000000..926f58549b5 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-binary.md @@ -0,0 +1,90 @@ +--- +sidebar_position: 4 +keywords: [集群镜像构建, 二进制文件打包, sealos工具, helm安装, 镜像推送] +description: 学习如何使用sealos工具将二进制文件(如helm)打包为集群镜像,并通过主节点部署实现安装。包含详细步骤和命令示例。 +--- + +# 构建基于二进制文件的集群镜像 + +此文档主要介绍了如何使用 `sealos` 工具将单一二进制文件(例如 `helm` 或 `kustomize`)打包为集群镜像,并将它们通过在主节点上部署集群镜像进行安装。以 `helm` 为例,我们将详细介绍如何将二进制文件打包成集群镜像。 + +## 创建构建工作空间 + +首先,创建一个基础目录作为构建工作空间: + +```shell +$ mkdir ~/cluster-images +``` + +在工作空间中,创建一个 `opt` 目录用于存储二进制文件: + +```shell +$ cd cluster-images +$ mkdir opt/ +``` + +## 准备二进制文件 + +接下来,我们准备 `helm` 二进制文件。在此,我们从 [github release](https://github.com/helm/helm/releases) 中下载: + +```shell +wget https://get.helm.sh/helm-v3.10.1-linux-amd64.tar.gz +tar -zxvf helm-v3.10.1-linux-amd64.tar.gz +chmod a+x linux-amd64/helm +mv linux-amd64/helm opt/ +``` + +## 创建构建镜像所需的 `Sealfile` 文件 + +创建一个名为 `Sealfile` 的文件,内容如下: + +```shell +FROM scratch +COPY opt ./opt +CMD ["cp opt/helm /usr/bin/"] +``` + +目前的目录结构如下: + +``` +. +├── Sealfile +└── opt + └── helm +``` + +## 构建集群镜像 + +现在,一切准备就绪,你可以开始构建集群镜像了: + +```shell +sealos build -t labring/helm:v3.10.1 . +``` + +**注意:** 首先你需要在本地主机上安装 `sealos` 命令。 + +你可以查看构建日志来了解构建过程。 + +```shell +root@ubuntu:~/cluster-images# sealos build -t labring/helm:v3.10.1 . +... +``` + +查看构建的镜像,现在所有依赖的二进制文件都已经构建进集群镜像中: + +```shell +root@ubuntu:~/cluster-images# sealos images +labring/helm v3.10.1 19ed4a24f0fe 3 minutes ago 45.1 MB +``` + +## 推送镜像 + +你可以将镜像推送至任何 Docker 镜像仓库,下面的命令将镜像推送到 dockerhub: + +```shell +sealos push labring/helm:v3.10.1 +``` + +**注意:** 请使用 `sealos` 命令来操作集群镜像,不支持 Docker 命令。 + +如果你使用的是私有镜像仓库,可以使用 `sealos login` 命令登录你的镜像仓库,然后再推送或者拉取镜像 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md new file mode 100644 index 00000000000..4dd260d385c --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-go_template.md @@ -0,0 +1,108 @@ +--- +sidebar_position: 5 +keywords: [集群镜像构建, go-template, Kubefile, 环境变量, sealos, yaml模板, 服务类型自定义, 镜像运行, kubectl, helm] +description: 学习如何使用go-template构建集群镜像,通过Kubefile和yaml模板利用环境变量自定义服务配置,掌握sealos运行镜像的高级技巧。 +--- + +# 构建基于 go-template 的集群镜像 + +在构建集群镜像的过程中,我们可以使用 `--env` 选项通过sealos命令行传递一些变量。这些环境变量可以被Kubefile的 `CMD` 命令或者yaml文件模板所使用。 + +## 在 Kubefile 中使用环境变量 + +这个示例定义了一个 `SERVICE_TYPE` 变量,它允许用户在安装应用程序时自定义服务暴露类型,并将参数传递给CMD中的helm命令。 + +Kubefile 示例: + +```shell +FROM scratch +ENV SERVICE_TYPE "NodePort" +COPY charts charts +COPY registry registry +CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=$(SERVICE_TYPE)"] +``` + +运行集群应用并设置一个自定义的 `SERVICE_TYPE=LoadBalancer`,如果不设置,它将默认为 NodePort。 + +```shell +sealos run labring/nginx:v1.23.1 --env SERVICE_TYPE=LoadBalancer +``` + +## 在Yaml文件中使用环境变量 + +准备一个简单的nginx服务的yaml文件,这个文件必须是 `*.tmpl` 扩展名,以便在运行 `sealos run --env` 命令时渲染。 + +```shell +$ cat manifests/service.yaml.tmpl +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + name: nginx +spec: + type: {{ .serviceType }} + ports: + - port: 80 + nodePort: {{ .http_NodePort }} + name: http + - port: 443 + nodePort: {{ .https_NodePort }} + name: https + selector: + name: nginx +``` + +下面是一个Kubefile样例,你可以在这里设置默认的环境变量。 + +```shell +FROM scratch +ENV serviceType NodePort +ENV http_NodePort 30080 +ENV https_NodePort 30443 + +COPY manifests manifests +COPY registry registry +CMD ["kubectl apply -f manifests/service.yaml"] +``` + +当你构建镜像时,什么都不会发生,只有在运行应用程序时,它才会渲染。如果没有设置 `--env`,它将使用 Kubefile 的默认 ENV。 + +```shell +sealos run labring/nginx:1.23.1 --env serviceType=LoadBalancer --env http_NodePort=30080 --env https_NodePort=30443 +``` + +你会发现 sealos 会在主节点的本地路径上基于 `service.yaml.tmpl` 渲染一个新的yaml文件 `service.yaml`。 + +**注意** 新版本的应用的rootfs放到了`/var/lib/sealos/data/default/applications`目录,每个应用都有独立的目录。 + +```shell +root@node1:~# ls /var/lib/sealos/data/default/rootfs/manifests |grep service +service.yaml +service.yaml.tmpl +``` + +检查 yaml 内容: + +```shell +root@node1:~# cat /var/lib/sealos/data/default/rootfs/manifests/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + name: nginx +spec: + type: NodePort + ports: + - port: 80 + nodePort: 30080 + name: http + - port: 443 + nodePort: 30443 + name: https + selector: + name: nginx +``` + +**注意:**所有类型的文件都支持这个特性(文件名后缀是.tmpl且构建目录在etc、scripts和manifests),你可以自己尝试一下。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md new file mode 100644 index 00000000000..1c1a20cffd5 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-helm_charts.md @@ -0,0 +1,237 @@ +--- +sidebar_position: 3 +keywords: [Helm Charts, 集群镜像, Sealos, Kubernetes, nginx, 镜像构建, 容器化, 云原生, DevOps, CI/CD] +description: 学习如何使用Sealos和Helm Charts构建基于nginx的Kubernetes集群镜像。本教程涵盖准备工作、Charts配置、Kubefile创建、镜像构建和安装等步骤。 +--- + +# 构建基于 Helm Charts 的集群镜像 + +让我们以最简单的 nginx 应用程序为例,介绍如何基于 Helm Charts 构建一个基于 nginx 的集群镜像。 + +## 一、准备工作 + +创建一个用于构建工作的基础目录。 + +```shell +$ mkdir ~/cloud-images +``` + +创建一个 `charts` 目录来存储 Kubernetes nginx Helm Charts 文件。 + +```shell +$ cd cloud-images +$ mkdir charts +``` + +## 二、准备Helm Charts + +准备 nginx Helm Charts,这里我们使用 [bitnami 官方的 nginx Helm Charts](https://bitnami.com/stack/nginx),让我们将 Helm Chart 文件拉取到本地并解压到 `charts` 目录中。 + +```shell +helm repo add bitnami https://charts.bitnami.com/bitnami +helm search repo bitnami/nginx +helm pull bitnami/nginx --version=13.2.13 -d charts/ --untar +``` + +**注意:** 首先你应该安装 Helm 命令工具到本地主机。 + +现在,charts 目录的结构如下所示。 + +``` +charts/ +└── nginx + ├── Chart.lock + ├── charts + ├── Chart.yaml + ├── README.md + ├── templates + ├── values.schema.json + └── values.yaml +``` + +## 三、创建Kubefile + +创建一个名为 `Kubefile` 的文件用于镜像构建: + +```shell +$ cat Kubefile +FROM scratch +COPY charts charts +COPY registry registry +CMD ["helm install nginx charts/nginx --namespace=nginx --create-namespace"] +``` + +建议使用 `helm upgrade --install` 而不是 `helm install`,这样可以在以后更新应用程序时重复运行相同的命令。 + +你可以根据需要添加其他选项,例如通过 NodePort 暴露服务。 + +```shell +FROM scratch +COPY charts charts +COPY registry registry +CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=NodePort"] +``` + +## 四、构建集群镜像 + +现在一切准备就绪,你可以开始构建集群镜像。 + +```shell +sealos build -t labring/nginx:v1.23.2 . +``` + +**注意:** 你应该首先将 sealos 命令安装到本地主机。 + +你可以查看构建日志。 + +```shell +root@ubuntu:~/cloud-images# sealos build -t labring/nginx:v1.23.2 . +2022-11-06T15:58:33 info lookup in path charts +2022-11-06T15:58:33 info sub chart is nginx +2022-11-06T15:58:33 warn if you access private registry,you must be 'sealos login' or 'buildah login' +2022-11-06T15:58:33 info pull images [docker.io/bitnami/nginx:1.23.2-debian-11-r29] for platform is linux/amd64 +Pulling image: docker.io/bitnami/nginx:1.23.2-debian-11-r29 +1d8866550bdd: Download complete +cbbfe6232a5b: Download complete +ed342369e859: Download complete +Status: images save success +2022-11-06T15:58:43 info output images [docker.io/bitnami/nginx:1.23.2-debian-11-r29] for platform is linux/amd64 +STEP 1/3: FROM scratch +STEP 2/3: COPY . . +STEP 3/3: CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=NodePort"] +COMMIT labring/nginx:v1.23.2 +Getting image source signatures +Copying blob 9f5a861e0f8d done +Copying config 1b89695273 done +Writing manifest to image destination +Storing signatures +--> 1b896952734 +Successfully tagged localhost/labring/nginx:v1.23.2 +1b8969527343939d60859469708e5420758f7419a421304f81b5132669982de7 +2022-11-06T15:58:44 info + ___ ___ ___ ___ ___ ___ + /\ \ /\ \ /\ \ /\__\ /\ \ /\ \ + /::\ \ /::\ \ /::\ \ /:/ / /::\ \ /::\ \ + /:/\ \ \ /:/\:\ \ /:/\:\ \ /:/ / /:/\:\ \ /:/\ \ \ + _\:\~\ \ \ /::\~\:\ \ /::\~\:\ \ /:/ / /:/ \:\ \ _\:\~\ \ \ + /\ \:\ \ \__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /:/__/ /:/__/ \:\__\ /\ \:\ \ \__\ + \:\ \:\ \/__/ \:\~\:\ \/__/ \/__\:\/:/ / \:\ \ \:\ \ /:/ / \:\ \:\ \/__/ + \:\ \:\__\ \:\ \:\__\ \::/ / \:\ \ \:\ /:/ / \:\ \:\__\ + \:\/:/ / \:\ \/__/ /:/ / \:\ \ \:\/:/ / \:\/:/ / + \::/ / \:\__\ /:/ / \:\__\ \::/ / \::/ / + \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ + + Website :https://www.sealos.io/ + Address :github.com/labring/sealos +``` + +sealos 将自动从 charts 目录中提取镜像,将其拉取到本地并存储在 registry 目录中。 + +现在的目录结构如下所示: + +```shell +. +├── charts +│ └── nginx +│ ├── Chart.lock +│ ├── charts +│ ├── Chart.yaml +│ ├── README.md +│ ├── templates +│ ├── values.schema.json +│ └── values.yaml +├── Kubefile +└── registry + └── docker + └── registry +``` + +在本地查看构建的镜像,现在所有依赖的部署清单和镜像缓存都构建到了集群镜像中。 + +```shell +root@ubuntu:~/cloud-images# + + sealos images +labring/nginx v1.23.2 521c85942ee4 4 minutes ago 56.8 MB +``` + +你可以将镜像推送到任何 Docker 镜像仓库,下面的命令将其推送到 Docker Hub。 + +```shell +sealos push labring/nginx:v1.23.2 +``` + +**注意:** 请使用 sealos 命令操作集群镜像,不支持 Docker 命令。 + +如果你使用私有镜像仓库,只需在拉取或推送镜像之前使用 `sealos login` 命令登录到注册表。 + +```shell +sealos login docker.io -u xxx -p xxx + +sealos login registry.cn-hangzhou.aliyuncs.com -u xxx -p xxx +``` + +## 五、安装集群镜像 + +然后你可以在你的集群中运行集群镜像。 + +```shell +sealos run labring/nginx:v1.23.2 +``` + +helm 二进制命令将安装到你的 Kubernetes 集群的主节点上。 + +```shell +root@ubuntu:~# helm -n nginx ls +``` + +## 六、说明 + +默认情况下,在构建镜像时,sealos 只解析默认的 values.yml 文件,但是你也可以为 sealos 提供自定义的 values.yaml 文件。 + +**自定义 values 文件必须放在与你的 Chart 相同的目录中,并且必须以 `.values.yaml` 的形式命名,例如 `loki-stack.values.yaml`。** + +```shell +. +├── charts +│ ├── loki-stack +│ │ ├── charts +│ │ ├── Chart.yaml +│ │ ├── README.md +│ │ ├── requirements.lock +│ │ ├── requirements.yaml +│ │ ├── templates +│ │ └── values.yaml +│ └── loki-stack.values.yaml +├── init.sh +├── Kubefile +``` + +`loki-stack.values.yaml` 文件内容如下: + +```shell +$ cat charts/loki-stack.values.yaml +promtail: + enabled: false +fluent-bit: + enabled: true +grafana: + enabled: true +``` + +不同的 values 文件可能会输出不同的镜像列表,以使 sealos 能够在 `sealos build` 过程中自动解析镜像。 + +```shell +$ helm template charts/loki-stack/ -f charts/loki-stack/values.yaml|grep image: + image: "grafana/promtail:2.0.0" + image: "grafana/loki:2.0.0" + image: "bats/bats:v1.1.0" + +$ helm template charts/loki-stack/ -f charts/loki-stack.values.yaml|grep image: + image: "grafana/fluent-bit-plugin-loki:1.6.0-amd64" + image: "kiwigrid/k8s-sidecar:0.1.209" + image: "grafana/grafana:6.7.0" + image: "grafana/loki:2.0.0" + image: "bats/bats:v1.1.0" + image: bats/bats:v1.1.0 +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md new file mode 100644 index 00000000000..095a373b745 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-image-list.md @@ -0,0 +1,81 @@ +--- +sidebar_position: 1 +keywords: [集群镜像构建, 镜像列表, Kubefile, 容器镜像, kubectl apply, Calico, 镜像tar包, docker-archive, oci-archive, Sealos] +description: 学习如何使用镜像列表或docker存储的tar包构建Sealos集群镜像。本指南涵盖了Kubefile配置、镜像列表格式和tar包构建方法,助您轻松管理容器化应用。 +--- + +# 构建基于镜像清单的集群镜像 + +本文将指导你如何使用镜像列表构建集群镜像,或使用现有的docker存储的tar包进行构建应用镜像。 + +## 镜像列表 构建 + +``` +. +├── Kubefile +├── cni +│   ├── custom-resources.yaml +│   └── tigera-operator.yaml +├── images +│   └── shim +│   └── CalicoImageList +└── registry + └── docker + └── registry +``` + +```dockerfile +FROM labring/kubernetes:v1.24.0 +COPY cni ./cni +COPY images ./images +COPY registry ./registry +CMD ["kubectl apply -f cni/tigera-operator.yaml","kubectl apply -f cni/custom-resources.yaml"] +``` + +说明: + +CalicoImageList 中的镜像列表将被拉取到本地,然后使用 `kubectl apply -f` 命令将其应用到集群中。 + +镜像列表目前支持: +- docker.io/calico/cni:v3.20.0 这种远程的镜像 +- containers-storage:docker.io/labring/coredns:v0.0.1 这种本地的OCI容器镜像 +- docker-daemon:docker.io/library/nginx:latest 这种本地的docker容器镜像 + + +## 镜像tar包 构建 + +``` +. +├── Kubefile +├── cni +│   ├── custom-resources.yaml +│   └── tigera-operator.yaml +├── images +│   └── skopeo +│   ├── calico.tar +│   └── tar.txt +└── registry + └── docker + └── registry +``` + +```dockerfile +FROM scratch +COPY cni ./cni +COPY images ./images +COPY registry ./registry +CMD ["kubectl apply -f cni/tigera-operator.yaml","kubectl apply -f cni/custom-resources.yaml"] +``` + +说明: + +tar.txt 中的配置会被拉取到本地并重定向镜像列表,然后使用 `kubectl apply -f` 命令将其应用到集群中。 +配置文件格式: + +``` +docker-archive:calico.tar@calico/cni:v3.20.0 +``` + +镜像列表目前支持: +- docker-archive 这种docker存储的镜像,仅支持单个镜像 +- oci-archive 这种oci存储的镜像,仅支持单个镜像 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md new file mode 100644 index 00000000000..35a2c79868f --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-manifests.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 2 +keywords: [集群镜像构建, Sealos, Kubernetes, 部署清单, Kubefile, Docker镜像, nginx应用, 镜像推送, 私有镜像仓库] +description: 学习如何使用Sealos构建基于部署清单的Kubernetes集群镜像。本教程涵盖从准备工作到镜像推送的完整流程,包括创建Kubefile和验证镜像等关键步骤。 +--- + +# 构建基于部署清单的集群镜像 + +本文档将详细介绍如何构建基于部署清单(Deployment Manifest)的集群镜像。我们将以一个简单的nginx应用为例来进行说明。 + +## 一、准备工作 + +1. 首先,创建一个基础目录作为构建工作区。 + +```shell +$ mkdir ~/cloud-images +``` + +2. 创建一个名为 `manifests` 的目录来存储 kubernetes nginx 部署 yaml 文件。 + +```shell +$ cd cloud-images +$ mkdir manifests +``` + +## 二、准备清单文件 + +在这个阶段,我们将准备一个简单的nginx kubernetes yaml文件。 + +```shell +$ cat manifests/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 2 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.23.1 + ports: + - containerPort: 80 +``` + +## 三、创建Kubefile + +在这个阶段,我们需要创建一个Kubefile文件,该文件将用于构建镜像。 + +```shell +FROM scratch +COPY manifests manifests +COPY registry registry +CMD ["kubectl apply -f manifests/deployment.yaml"] +``` + +## 四、构建集群镜像 + +在准备好所有必需的文件和目录后,我们可以开始构建集群镜像。 + +```shell +sealos build -t labring/nginx:v1.23.1 . +``` + +**注意:** 在开始构建前,您需要先在本地主机上安装 sealos 命令。 + +构建过程中,您可以查看构建日志。 + +## 五、验证镜像 + +在构建完毕后,可以通过下列命令查看构建的镜像: + +```shell +root@ubuntu:~/cloud-images# sealos images +labring/nginx v1.23.1 521c85942ee4 4 minutes ago 56.8 MB +``` + +## 六、推送镜像 + +最后,我们可以将构建好的镜像推送至任何Docker镜像仓库,以下命令将其推送至DockerHub。 + +```shell +sealos push labring/nginx:v1.23.1 +``` + +**注意:** 请使用 sealos 命令来操作集群镜像,Docker 命令不受支持。 + +如果你使用的是私有镜像仓库,只需要在拉取或推送镜像前使用 `sealos login` 登录仓库即可。 + +```shell +sealos login docker.io -u xxx -p xxx + +sealos login registry.cn-hangzhou.aliyuncs.com -u xxx -p xxx +``` + +至此,基于部署清单的集群镜像已经构建完成。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md new file mode 100644 index 00000000000..0018b0505c0 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/build-image/build-image-scp_exec.md @@ -0,0 +1,129 @@ +--- +sidebar_position: 6 +keywords: [sealos构建集群镜像, sealos exec, sealos scp, 集群镜像构建, Kubefile, openebs mayastor, flannel部署] +description: 学习如何使用sealos exec和scp命令构建自定义集群镜像。本文详细介绍了openebs mayastor和flannel的部署过程,帮助开发者轻松创建高效的Kubernetes集群。 +--- + +# 使用 exec 和 scp 命令构建集群镜像 + +默认情况下,`sealos run xx` 只会在第一个主节点上运行命令和复制文件。当你希望在特定节点或所有节点上运行命令或复制文件时,你可以在构建集群镜像时使用 `sealos exec` 或 `sealos scp` 命令。 + +- sealos exec: 连接到一个或多个节点并运行任何 shell 命令; +- sealos scp: 连接到一个或多个节点并将本地文件复制到远程节点。 + +虽然你可以直接在宿主机上使用这些命令,但本文主要描述的是在使用 sealos build 构建集群镜像时如何使用这两个命令。 + +## sealos exec 示例 + +以下是构建一个 openebs 集群镜像的示例。在安装 openebs maystor 之前,需要在节点上执行一些初始化操作,你可以使用 sealos exec 来实现这一点。 + +首先,创建一个用于构建工作的基础目录。 + +```shell +$ mkdir ~/cloud-images +``` + +创建一个 `charts` 目录,用来存储 kubernetes nginx helm charts 文件。 + +```shell +$ cd cloud-images +``` + +创建一个名为 `Kubefile` 的文件,用于镜像构建: + +```shell +$ cat Kubefile +FROM scratch +COPY manifests manifests +COPY registry registry +COPY opt opt +COPY mayastor.sh mayastor.sh +CMD ["bash mayastor.sh"] +``` + +创建一个名为 `mayastor.sh` 的脚本文件,sealos exec 后面的 shell 命令将在所有节点上执行(在所有节点上创建 hugepage、加载内核模块),但其他命令只会在主节点上运行。 + +```shell +$ cat mayastor.sh +#!/usr/bin/env bash +set -e + +sealos exec " +echo vm.nr_hugepages = 1024 | sudo tee -a /etc/sysctl.d/mayastor.conf +sysctl -p +sudo modprobe -- nbd +sudo modprobe -- nvmet +sudo modprobe -- nvmet_rdma +sudo modprobe -- nvme_fabrics +sudo modprobe -- nvme_tcp +sudo modprobe -- nvme_rdma +sudo modprobe -- nvme_loop +cat < /tmp/buildimage/kubeadm.yml < /tmp/buildimage/Kubefile < +Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.24.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +status: {} +``` + + + +2. 生成 Clusterfile 后,然后更新集群配置。例如,要修改 pods 的 CIDR 范围,就可以修改 `networking.podSubnet` 和 `spec.data.spec.calicoNetwork.ipPools.cidr` 字段。最终的 Clusterfile 会像是这样: + +
+Clusterfile + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + creationTimestamp: null + name: default +spec: + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.25.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +status: {} +--- +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +networking: + podSubnet: 10.160.0.0/12 +--- +apiVersion: apps.sealos.io/v1beta1 +kind: Config +metadata: + name: calico +spec: + path: charts/calico/values.yaml + strategy: merge + data: | + installation: + enabled: true + kubernetesProvider: "" + calicoNetwork: + ipPools: + - blockSize: 26 + cidr: 10.160.0.0/12 + encapsulation: IPIP + natOutgoing: Enabled + nodeSelector: all() + nodeAddressAutodetectionV4: + interface: "eth.*|en.*" +``` + +
+ +3. 运行 `sealos apply -f Clusterfile` 启动集群。集群运行成功后会把 Clusterfile 保存到 `.sealos/default/Clusterfile` 文件中,可以修改其中字段来重新 apply 对集群进行变更。 + +**注意:** + +- 可以参考[官方文档](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-config/)或运行 `kubeadm config print init-defaults` 命令来打印 kubeadm 配置。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md new file mode 100644 index 00000000000..34917a878b4 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/run-cluster.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 0 +keywords: [Sealos集群, 集群初始化, 节点管理, 服务管理, 实战示例] +description: 了解如何有效运行和管理Sealos集群,包括集群初始化、节点管理、服务管理和实战示例的详细教程和资源。 +--- + +# Sealos 集群镜像运行 + +在这个目录中,我们提供了一系列详细的教程和资源,帮助您有效地运行和管理 Sealos 集群。以下是每个文件或子目录的简短概述: + +1. **集群初始化**:这部分提供了所有必需的步骤,以启动并初始化一个新的 Sealos 集群。它包括如何配置 Sealos,以及如何运行初始化命令等信息。 +2. **节点管理**:这个部分包括如何添加和移除集群节点,以及如何维护和管理集群节点的详细信息。 +3. **服务管理**:这部分包含了如何在 Sealos 集群上部署和管理各种服务的指南。它包括如何使用 Sealos 的命令行工具来管理服务,以及如何配置服务以满足你的特定需求。 +4. **实战示例**:这部分包含了各种实战示例,包括如何运行和管理各种应用,以及如何处理特定的运维问题。 + +我们希望这个目录可以为您在运行和管理 Sealos 集群时提供全方位的帮助。如果有任何问题或建议,欢迎随时联系我们。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md new file mode 100644 index 00000000000..77ec0154b68 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/template-apply-cluster.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 2 +keywords: [Go模板语法, Clusterfile, Kubernetes集群部署, sealos, 自定义values文件] +description: 了解如何使用Go模板语法编写Clusterfile并通过sealos部署Kubernetes集群,包含自定义values文件示例和详细步骤。 +--- + +# 模板配置安装 + +我们也可以使用 Go 模版语法来编写 Clusterfile(就像 [Helm](https://helm.sh/) 一样,但暂不支持部分模版函数,如 `include`/`tpl`/`require`/`lookup`)。 例如,创建 `Clusterfile.yaml` 如下: + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + name: {{ .Values.clusterName }} +spec: + hosts: + - ips: {{ .Values.masters | toYaml | nindent 8 }} + roles: ["master", "amd64"] + {{- with .Values.nodes }} + - ips: {{ . | toYaml | nindent 8 }} + roles: ["node", "amd64"] + {{- end }} + image: {{ .Values.images | toYaml | nindent 4 }} + ssh: + passwd: {{ env "SSH_PASSWORD" .Values.ssh.passwd }} + pk: {{ default "~/.ssh/id_rsa" .Values.ssh.pk }} + port: {{ default 22 .Values.ssh.port | int }} + user: {{ default "root" .Values.ssh.user }} +--- +apiVersion: kubeadm.k8s.io/v1beta3 +kind: ClusterConfiguration +networking: + dnsDomain: {{ default "cluster.local" .Values.networking.dnsDomain }} + serviceSubnet: {{ default "10.96.0.0/18" .Values.networking.serviceSubnet }} + podSubnet: {{ default "100.64.0.0/17" .Values.networking.podSubnet }} +``` + +随后,创建一个自定义的 values 文件 `example.values.yaml`: + +```yaml +clusterName: default +images: + - dockerhub.tencentcloudcr.com/labring/kubernetes:v1.23.8 + - dockerhub.tencentcloudcr.com/labring/calico:v3.24.1 +masters: + - 10.74.16.27:22 + - 10.74.16.140:22 + - 10.74.16.101:22 +nodes: [] +ssh: + # passwd: notSetYet + pk: /path/to/private/key/file + port: 22 + user: root +networking: + dnsDomain: cluster.local + serviceSubnet: 10.96.0.0/18 + podSubnet: 100.64.0.0/17 +``` + +然后就可以像这样部署集群了: + +```shell +$ sealos apply -f Clusterfile.yaml --values example.values.yaml --set clusterName=testlocal --env SSH_PASSWORD=s3cret +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md new file mode 100644 index 00000000000..878caae46bb --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/operations/run-cluster/upgrade-cluster.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 3 +keywords: [Kubernetes升级, sealos, 集群管理, Kubernetes版本, Kubernetes集群] +description: 了解如何使用sealos命令轻松升级Kubernetes集群,确保集群稳定运行并保持最新版本。 +--- + +# 如何升级集群 + +如果你想要升级你的 Kubernetes 集群,你只需要运行以下命令: + +```sh +sealos run labring/kubernetes:<新版本号> +``` + +确保你已经建立了集群。 + +## 实例说明 + +1. 假设你已经运行过以下命令: + +```sh +sealos run labring/kubernetes:v1.24.0 labring/calico:v3.22.1 --masters 192.168.64.8 --nodes 192.168.64.7 +``` + +2. 现在你想要升级集群到 v1.25.0,你可以这样操作: + +```sh +sealos run labring/kubernetes:v1.25.0 +``` + +在运行到 'kubeadm upgrade v1.25.0' 的时候,你将看到: + +```txt +[upgrade/version] You have chosen to change the cluster version to "v1.25.0" +[upgrade/versions] Cluster version: v1.24.0 +[upgrade/versions] kubeadm version: v1.25.0 +[upgrade] Are you sure you want to proceed? [y/N]: +``` + +输入 'y' 来继续升级。 + +如果**出现错误**,你可以再次运行命令 'sealos run labring/kubernetes:v1.25.0'。即使失败,它也能保证得到相同的结果。 + +## 注意事项 + +1. **升级不能跨过次版本号**。比如从 'v1.23.0' 升级到 'v1.25.0' 是不允许的。如果你确实需要从 'v1.23.0' 升级到 'v1.25.0',你可以分成两步来操作,比如先从 'v1.23.0' 升级到 'v1.24.0',然后再从 'v1.24.0' 升级到 'v1.25.0'。 + +2. 一旦升级成功,集群挂载的旧版本镜像就会被替换。添加主节点或工作节点将会应用新版本。 + +这就是升级 Kubernetes 集群的整个过程。如果你在升级过程中遇到任何问题,不要犹豫,尽快查阅相关文档或者寻求帮助。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md new file mode 100644 index 00000000000..fc3f1066a6b --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/build-ingress-cluster-image.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 3 +keywords: [Ingress集群镜像, sealos, helm, nginx-ingress, 镜像缓存代理, Dockerfile, 集群镜像构建, 镜像列表, 镜像registry] +description: 学习如何使用sealos和helm构建Ingress集群镜像,包括下载chart、添加镜像列表、编写Dockerfile、构建和推送镜像,以及运行集群镜像的完整流程。 +--- + +# 构建一个 Ingress 集群镜像 + +这里展示了如何用 helm 构建一个 nginx-ingress 集群镜像。 + +## 下载 helm chart + +```shell +$ mkdir ingress-nginx && cd ingress-nginx +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm pull ingress-nginx/ingress-nginx +``` + +随后就能找到下载的 chart: + +```shell +$ ls +ingress-nginx-4.1.0.tgz +``` + +## 添加镜像列表 + +sealos 会下载镜像列表中的镜像并缓存到 registry 目录。 + +目录必须形如 `images/shim/[your image list filename]`: + +```shell +$ cat images/shim/nginxImages +k8s.gcr.io/ingress-nginx/controller:v1.2.0 +k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 +``` + +## 编写 Dockerfile + +```Dockerfile +FROM scratch +COPY ../examples . +CMD ["helm install ingress-nginx ingress-nginx-4.1.0.tgz --namespace ingress-nginx --create-namespace"] +``` + +## 构建集群镜像 + +```shell +$ sealos build -f Dockerfile -t docker.io/fanux/ingress-nginx:v1.2.0 . +``` + +sealos 在构建的时候会自动添加镜像列表中的镜像依赖到集群镜像中,通过神奇的方式保存了里面依赖的 Docker 镜像。 +并且在到别的环境中运行的时候更神奇的自动检测集群中是否有 Docker 镜像,有的话自动下载,没有的话才会去 k8s.gcr.io 下载。 +用户无需修改 helm chart 中的 docker 镜像地址,这里用到了镜像缓存代理的黑科技。 + +## 推送到镜像 registry + +```shell +$ sealos login docker.io +$ sealos push docker.io/fanux/ingress-nginx:v1.2.0 +``` + +## 运行集群镜像 + +```shell +$ sealos run docker.io/fanux/ingress-nginx:v1.2.0 +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md new file mode 100644 index 00000000000..7d75fb25586 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/deploy-kubernetes.md @@ -0,0 +1,193 @@ +--- +sidebar_position: 2 +keywords: [Kubernetes安装, Sealos, K8s集群部署, 离线安装K8s, Containerd, 集群镜像, 高可用K8s, 节点管理] +description: 使用Sealos快速部署Kubernetes集群,支持在线和离线安装,适用于amd64和arm64架构。轻松管理节点,安装分布式应用,支持Containerd和Docker运行时。 +--- + +# 安装 K8s 集群 + +Sealos 支持安装 `amd64` 和 `arm64` 架构的 K8s 集群。 + +## 先决条件 + +首先需要[下载 Sealos 命令行工具](/self-hosting/lifecycle-management/quick-start/install-cli.md),sealos 是一个简单的 Golang 二进制文件,可以安装在大多数 Linux 操作系统中。 + +以下是一些基本的安装要求: + ++ 每个集群节点应该有不同的主机名。主机名不要带下划线。 ++ 所有节点的时间需要同步。 ++ 需要在 K8s 集群的**第一个 master 节点**上运行 `sealos run` 命令,目前**集群外的节点不支持集群安装**。 ++ 建议使用干净的操作系统来创建集群。**不要自己装 Docker!** ++ 支持大多数 Linux 发行版,例如:Ubuntu、CentOS、Rocky linux。 ++ 支持 [Docker Hub](https://hub.docker.com/r/labring/kubernetes/tags) 中的所有 Kubernetes 版本。 ++ 支持使用 Containerd 作为容器运行时。 ++ 在公有云上安装请使用**私有 IP**。 + +## 查看集群镜像 + +Sealos 所有的集群镜像都可以在 [cluster-image-docs](https://github.com/labring-actions/cluster-image-docs) 仓库里找到。除了推送到 Docker Hub 之外,这些镜像还被同步到了阿里云的镜像仓库。 + +Docker Hub 上可以通过以下链接查看 Sealos 所有的集群镜像:[https://hub.docker.com/u/labring](https://hub.docker.com/u/labring). + +使用 [Registry Explorer](https://explore.ggcr.dev/) 可以查看 K8s 集群镜像的所有版本,直接输入 `registry.cn-shanghai.aliyuncs.com/labring/kubernetes`,然后点击 “Submit Query”: + +![](images/registry-explorer.png) + +就会看到这个集群镜像的所有 tag。 + +Docker Hub 同理,输入 `docker.io/labring/kubernetes` 即可查看所有 tag。 + +:::info注意 + +K8s 的小版本号越高,集群越稳定。例如 v1.28.x,其中的 x 就是小版本号。建议使用小版本号比较高的 K8s 版本。到本文截止时间为止,v1.27 最高的版本号是 v1.27.7,而 v1.28 最高的版本号是 v1.28.3,所以**建议使用 v1.27.7**。你需要根据实际情况来选择最佳的 K8s 版本 + +::: + +## 安装 K8s 单机版 + +```shell +# sealos version must >= v4.1.0 +$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 --single +``` + +## 安装 K8s 集群 + +```shell +$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \ + --masters 192.168.64.2,192.168.64.22,192.168.64.20 \ + --nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd] +``` + +注意:labring/helm 应当在 labring/cilium 之前。 + +参数说明: + +| 参数名 | 参数值示例 | 参数说明 | +| --- | --- | --- | +| --masters | 192.168.0.2 | K8s master 节点地址列表 | +| --nodes | 192.168.0.3 | K8s node 节点地址列表 | +| --ssh-passwd | [your-ssh-passwd] | ssh 登录密码 | +|kubernetes | labring/kubernetes:v1.25.0 | K8s 集群镜像 | + +在干净的服务器上直接执行上面命令,不要做任何多余操作即可安装一个高可用 K8s 集群。 + +## 安装各种分布式应用 + +```shell +sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 # install helm +sealos run registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0 # install openebs +sealos run registry.cn-shanghai.aliyuncs.com/labring/minio-operator:v4.5.5 registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:4.1.0 +``` + +这样高可用的 Minio 等应用都有了,不用关心所有的依赖问题。 + +## 增加 K8s 节点 + +增加 node 节点: + +```shell +$ sealos add --nodes 192.168.64.21,192.168.64.19 +``` + +增加 master 节点: + +```shell +$ sealos add --masters 192.168.64.21,192.168.64.19 +``` + +## 删除 K8s 节点 + +删除 node 节点: + +```shell +$ sealos delete --nodes 192.168.64.21,192.168.64.19 +``` + +删除 master 节点: + +```shell +$ sealos delete --masters 192.168.64.21,192.168.64.19 +``` + +## 清理 K8s 集群 + +```shell +$ sealos reset +``` + + + +## 离线安装 K8s + +离线环境只需要提前导入镜像,其它步骤与在线安装一致。 + +首先在有网络的环境中导出集群镜像: + +```shell +$ sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 +$ sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 +``` + +### 导入镜像并安装 + +将 kubernetes.tar 拷贝到离线环境, 使用 load 命令导入镜像即可: + +```shell +$ sealos load -i kubernetes.tar +``` + +剩下的安装方式与在线安装的步骤一致: + +```shell +$ sealos images # 查看集群镜像是否导入成功 +$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 # 单机安装,集群安装同理 +``` + +### 快速启动 K8s 集群 + +也可以不用 load 命令导入镜像,直接使用以下命令即可安装 K8s: + +```shell +$ sealos run kubernetes.tar # 单机安装,集群安装同理 +``` + +## 集群镜像版本支持说明 + +### 支持 Containerd 的 K8s + +推荐使用 Containerd 作为容器运行时 (CRI) 的集群镜像版本,Containerd 是一种轻量级、高性能的容器运行时,与 Docker 兼容。使用 Containerd 的 Kubernetes 镜像可以提供更高的性能和资源利用率。以下是支持 Containerd 的集群镜像版本支持说明: + +| K8s 版本 | Sealos 版本 | CRI 版本 | 集群镜像版本 | +| -------- | ----------------- | -------- | -------------------------- | +| `<1.25` | `>=v4.0.0` | v1alpha2 | labring/kubernetes:v1.24.0 | +| `>=1.25` | `>=v4.1.0` | v1alpha2 | labring/kubernetes:v1.25.0 | +| `>=1.26` | `>=v4.1.4-rc3` | v1 | labring/kubernetes:v1.26.0 | +| `>=1.27` | `>=v4.2.0-alpha3` | v1 | labring/kubernetes:v1.27.0 | +| `>=1.28` | `>=v5.0.0` | v1 | labring/kubernetes:v1.28.0 | + +根据 Kubernetes 版本的不同,您可以选择不同的 Sealos 版本和 CRI 版本。例如,如果您要使用 Kubernetes v1.26.0 版本,您可以选择 sealos v4.1.4-rc3 及更高版本,并使用 v1 CRI 版本。 + +### 支持 Docker 的 K8s + +当然,你也可以选择使用 Docker 作为容器运行时,以下是支持 Docker 的集群镜像版本支持说明: + +| K8s 版本 | Sealos 版本 | CRI 版本 | 集群镜像版本 | +| -------- | ----------------- | -------- | --------------------------------- | +| `<1.25` | `>=v4.0.0` | v1alpha2 | labring/kubernetes-docker:v1.24.0 | +| `>=1.25` | `>=v4.1.0` | v1alpha2 | labring/kubernetes-docker:v1.25.0 | +| `>=1.26` | `>=v4.1.4-rc3` | v1 | labring/kubernetes-docker:v1.26.0 | +| `>=1.27` | `>=v4.2.0-alpha3` | v1 | labring/kubernetes-docker:v1.27.0 | +| `>=1.28` | `>=v5.0.0` | v1 | labring/kubernetes-docker:v1.28.0 | + + +与支持 Containerd 的 Kubernetes 镜像类似,您可以根据 Kubernetes 版本的不同选择不同的 Sealos 版本和 CRI 版本。例如,如果您要使用 Kubernetes v1.26.0 版本,您可以选择 sealos v4.1.4-rc3 及更高版本,并使用 v1 CRI 版本。 + +### 支持 Containerd 的 k3s + +| K3s 版本 | Sealos 版本 | 集群镜像版本 | +|----------|------------|---------------------| +| `>=1.24` | `>=v5.0.0` | labring/k3s:v1.24.0 | + +## 总结 + +您可以根据自己的需求和偏好,在不同的镜像类型和版本中进行选择。同时,不要忘记查看 [更新日志](https://github.com/labring/sealos/blob/main/CHANGELOG/CHANGELOG.md),以了解各个版本的更新内容和修复问题。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png new file mode 100644 index 00000000000..a9e28004026 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/images/registry-explorer.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/install-cli.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/install-cli.md new file mode 100644 index 00000000000..878cdb44e2a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/quick-start/install-cli.md @@ -0,0 +1,101 @@ +--- +sidebar_position: 1 +keywords: [Sealos命令行工具, Sealos安装, Kubernetes集群部署, 二进制下载, 包管理工具安装, 源码安装, 版本选择, Linux系统] +description: 本文详细介绍了如何下载和安装Sealos命令行工具,包括版本选择、二进制下载、包管理工具安装和源码安装等多种方法,助您快速部署Kubernetes集群。 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# 下载 Sealos 命令行工具 + +你可以通过运行命令来获取版本列表: + +```shell +$ curl --silent "https://api.github.com/repos/labring/sealos/releases" | jq -r '.[].tag_name' +``` + +> 注意:在选择版本时,建议使用稳定版本例如 `v4.3.0`。像 `v4.3.0-rc1`、`v4.3.0-alpha1` 这样的版本是预发布版,请谨慎使用。 + +设置 `VERSION` 环境变量为 latest 版本号,或者将 `VERSION` 替换为您要安装的 Sealos 版本: + +```shell +$ VERSION=`curl -s https://api.github.com/repos/labring/sealos/releases/latest | grep -oE '"tag_name": "[^"]+"' | head -n1 | cut -d'"' -f4` +``` + +## 二进制自动下载 + +```shell + +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/main/scripts/install.sh | PROXY_PREFIX=https://mirror.ghproxy.com sh -s ${VERSION} labring/sealos + +``` + +## 二进制手动下载 + + + + +```shell +$ wget https://mirror.ghproxy.com/https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz \ + && tar zxvf sealos_${VERSION#v}_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin +``` + + + + +```shell +$ wget https://mirror.ghproxy.com/https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_arm64.tar.gz \ + && tar zxvf sealos_${VERSION#v}_linux_arm64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin +``` + + + + +## 包管理工具安装 + +### DEB 源 + +```shell +$ echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list +$ sudo apt update +$ sudo apt install sealos +``` + +### RPM 源 + +```shell +$ sudo cat > /etc/yum.repos.d/labring.repo << EOF +[fury] +name=labring Yum Repo +baseurl=https://yum.fury.io/labring/ +enabled=1 +gpgcheck=0 +EOF +$ sudo yum clean all +$ sudo yum install sealos +``` + +## 源码安装 + +### 前置依赖 +1. `linux` +2. `git` +3. `golang` 1.20+ +4. `libgpgme-dev libbtrfs-dev libdevmapper-dev` + +如果在 `arm64` 环境下需要添加 `:arm64` 后缀。 + +### 构建 + +```shell +# git clone the repo +$ git clone https://github.com/labring/sealos.git +# just make it +$ make build BINS=sealos +``` + +## 下一步 + +[安装 K8s 集群](/self-hosting/lifecycle-management/quick-start/deploy-kubernetes.md)。 + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json new file mode 100644 index 00000000000..950b839be0a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 3 +} diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md new file mode 100644 index 00000000000..fae5196d188 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/image-cri-shim.md @@ -0,0 +1,123 @@ +--- +sidebar_position: 3 +keywords: [image-cri-shim, Kubernetes, 容器运行时, CRI, kubelet, 镜像自动识别, 容器部署, 中间件, 镜像仓库] +description: image-cri-shim 使用指南,简化Kubernetes容器部署,自动识别镜像名称,提高操作便利性,支持CRI API v1alpha2和v1。 +--- + +# image-cri-shim 使用指南 + +## 工作原理 + +image-cri-shim 是一个基于 CRI (Container Runtime Interface) 和 kubelet 的 gRPC (Google Remote Procedure Call) shim。CRI 是 Kubernetes 中用于与容器运行时进行交互的接口,而 kubelet 是负责维护容器运行状态和节点级别的资源管理的 Kubernetes 组件。 + +image-cri-shim 的主要功能是自动识别镜像名称,让用户在使用 Kubernetes 部署容器时无需手动指定镜像名称。这样可以降低用户的操作难度,提高部署容器的便利性。 + +在实际使用中,image-cri-shim 可以作为一个中间件,接收来自 kubelet 的请求,然后将请求转发给容器运行时。通过自动识别镜像名称,image-cri-shim 可以简化容器镜像的部署流程,减轻用户的操作负担。 + +``` ++------------+ +----------------+ +-------------------+ +| User | | Kubelet | | image-cri-shim | +| (Kubernetes| | (Node agent) | | (Middleware) | +| Manifest) | | | | | ++-----+------+ +-------+--------+ +-------+-----------+ + | | | + | YAML Manifest | | + |---------------> | | + | | | + | | | + | | CRI Request | + | |------------------------> | + | | | + | | Image Name | + | | Auto-Recognition | + | | | + | | | + | | CRI Response | + | | <------------------------+ + | | | + | | | + | Container | | + | Deployment | | + | <----------------------| | + | | | + | | | ++------------+ +-------+--------+ +-------+-----------+ + +``` + +从上述流程图可以看出,用户创建一个包含容器信息的 Kubernetes YAML 清单,然后将该清单提交给 kubelet。kubelet 是 Kubernetes 节点上的代理,负责管理容器。 +接着,kubelet 将 CRI 请求发送给 image-cri-shim 中间件。image-cri-shim 的主要任务是自动识别镜像名称,它会处理这个 CRI 请求并获取相关的镜像信息。当 image-cri-shim 识别到镜像名称后,它会将 CRI 响应返回给 kubelet。 + +最后,kubelet 使用从 image-cri-shim 获取的镜像名称来部署容器。这个过程对用户是透明的,用户无需手动指定镜像名称,从而简化了容器部署流程并提高了便利性。 + +## 架构图 + +image-cri-shim 的架构如下图所示: + +![](images/image-cri-shim.png) + + +## 使用说明 + +```yaml +shim: /var/run/image-cri-shim.sock +cri: /run/containerd/containerd.sock +address: http://sealos.hub:5000 +force: true +debug: true +timeout: 15m +auth: admin:passw0rd + +registries: +- address: http://172.18.1.38:5000 + auth: admin:passw0rd +``` +这段配置文件是一个用于设置 image-cri-shim 的 YAML 格式文件。配置文件中包含了一些关键的参数,以下是每个参数的解释: + +1. shim: 指定 image-cri-shim 的 UNIX 套接字文件路径。这个路径用于与 kubelet 之间的通信。 +2. cri: 指定容器运行时(如 containerd)的 UNIX 套接字文件路径。image-cri-shim 会使用这个路径与容器运行时进行通信。 +3. address: 定义镜像仓库的地址。在本例中,镜像仓库地址为 http://sealos.hub:5000。 +4. force: 设置为 true 时,image-cri-shim 会在强制启动shim,无需等待cri启动后启动。 +5. debug: 设置为 true 时,启用调试模式,输出更多的日志信息。 +6. timeout: 定义镜像操作的超时时间。在本例中,超时时间为 15 分钟(15m)。 +7. auth: 定义用于访问镜像仓库的身份验证凭据。在本例中,用户名为 admin,密码为 passw0rd。 + +此外,配置文件还包含了一个 registries 列表,用于定义其他镜像仓库及其身份验证凭据。在这个例子中,只有一个其他仓库: +- address: 该仓库的地址为 http://172.18.1.38:5000。 +- auth: 用于访问该仓库的身份验证凭据。在本例中,用户名为 admin,密码为 passw0rd。 +这个配置文件为 image-cri-shim 提供了所需的信息,以便正确地与 kubelet 和容器运行时(如 containerd)进行通信,以及访问和管理镜像仓库。 + +注意: image-cri-shim 能够同时兼容 CRI API v1alpha2 和 v1。 + +### 管理服务 + +image-cri-shim 通常作为一个系统服务运行。要管理 image-cri-shim,您可以使用系统服务管理工具(如 systemctl)来启动、停止、重启或查看服务状态。首先,确保您已经正确地安装了 image-cri-shim 并将其配置为一个系统服务。 + +1. 启动服务: `systemctl start image-cri-shim` +2. 停止服务: `systemctl stop image-cri-shim` +3. 重启服务: `systemctl restart image-cri-shim` +4. 查看服务状态: `systemctl status image-cri-shim` + +### 日志管理 + +要查看 image-cri-shim 服务的日志,您可以使用 journalctl 命令。journalctl 是一个用于查询和显示系统日志的工具,它与 systemd 服务管理器一起使用。 + +以下是使用 journalctl 查看 image-cri-shim 服务日志的命令: + +```shell +journalctl -u image-cri-shim +``` + +这将显示 image-cri-shim 服务的全部日志。如果您希望实时查看日志,可以添加 -f 参数: + +```shell +journalctl -u image-cri-shim -f +``` + +此外,您还可以根据时间过滤日志。例如,如果您只想查看过去一小时的日志,可以使用以下命令: + +```shell +journalctl -u image-cri-shim --since "1 hour ago" +``` + +这些命令应该能帮助您查看和分析 image-cri-shim 服务的日志,从而更好地了解服务的运行状态和可能出现的问题。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png new file mode 100644 index 00000000000..5c8d5f81b23 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/Image-cri-shim/images/image-cri-shim.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/_category_.json b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/_category_.json new file mode 100644 index 00000000000..e47d9e07a6d --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 99 +} \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/images/01.webp b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/images/01.webp new file mode 100644 index 00000000000..0cc05e478e9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/images/01.webp differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/lvscare.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/lvscare.md new file mode 100644 index 00000000000..8d3f804c5a3 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/lvscare/lvscare.md @@ -0,0 +1,79 @@ +--- +keywords: [LVScare, Sealos, Kubernetes高可用性, IPVS负载均衡, 健康检查工具] +description: LVScare是一款基于IPVS的轻量级负载均衡和健康检查工具,与Sealos集成,提升Kubernetes集群的高可用性和稳定性。 +--- + +# LVScare 使用指南 + +## 介绍 + +LVScare是一款基于IPVS技术的轻量级负载均衡和健康检查工具,可以实时监控和管理后端服务。Sealos,一个云操作系统,它的生命周期管理是一个基于kubeadm的Kubernetes HA安装工具,适用于在任何Linux系统中安装和升级高可用Kubernetes集群。两者结合能实现Kubernetes master节点的高可用性。Sealos利用其生命周期管理能力,通过配合LVScare的轻量级,0依赖,高可用的特性,可以非常有效地保证Kubernetes集群的稳定性和可靠性。 + +### LVScare的工作原理与特点 + +LVScare通过IPVS实时监控后端服务(real servers)的健康状态。如果某个服务变得不可用,LVScare会立即将其权重设为0(用于TCP优雅终止),并在下一次检查期间从服务列表中移除。服务恢复正常后,LVScare会自动将其重新加入到服务列表。LVScare的这种设计使得它具备轻量级,0依赖,高可用的特性。占用资源少,稳定可靠,类似于kube-proxy的实现,可以通过ipvs实现的localLB保证服务的持续可用。 + +## Sealos与LVScare的集成 + +在Sealos中,我们利用了官方推荐的静态Pod的方式,自动配置和管理LVScare,以实现Kubernetes集群的高可用性。Sealos会在安装Kubernetes集群的过程中自动使用LVScare进行master节点的健康检查和负载均衡。这意味着,即使某个master节点出现故障,也不会影响Kubernetes集群的整体功能。 + +![](images/01.webp) + +### 如何运行LVScare静态Pod + +首先,通过`sealctl static-pod`命令生成LVScare的配置,并将其放入`/etc/kubernetes/manifests`目录。这样,Kubernetes集群中的所有节点都能获取到这份配置。 + +```bash +lvscare care --vs 10.103.97.12:6443 --rs 192.168.0.2:6443 --rs 192.168.0.3:6443 --rs 192.168.0.4:6443 --interval 5 --mode route +``` + +### 生成和调整静态Pod配置 + +在需要在每个节点上启动LVScare时,我们可以使用以下命令生成静态Pod的配置: + +```bash +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168 + +.0.3:6443 --print +``` + +当master节点有变化时,Sealos只需重新执行`sealctl static-pod`命令即可调整master节点,简化了维护静态Pod的逻辑。在集群join节点之前,我们需要调用`sealctl ipvs`(该命令直接调用LVScare sdk)手动启动IPVS规则,维护好IPVS集群。节点join成功后,Kubernetes的静态Pod就可以接管IPVS规则了。 + +## 使用LVScare的优势 + +### 高可用性 + +结合LVScare,Sealos可以实现Kubernetes集群master节点的高可用性。 + +### 健康检查机制 + +LVScare的健康检查机制可以及时发现并处理问题,防止单节点故障引发的更大问题。 + +### 无缝集成 + +作为Sealos中的静态Pod,LVScare可以与Kubernetes集群其他部分无缝集成。 + +### 简化运维 + +Sealos自动配置和管理LVScare,大大简化了Kubernetes集群的运维工作。 + +## LVScare使用示例 + +请注意,所有的real server需要在同一主机上监听,并设置为`route`模式。然后,你可以在前台运行LVScare。例如: + +```bash +docker run -p 8081:80 --name echoserver1 -d cilium/echoserver +docker run -p 8082:80 --name echoserver2 -d cilium/echoserver +docker run -p 8083:80 --name echoserver3 -d cilium/echoserver +lvscare care --vs 169.254.0.1:80 --rs 127.0.0.1:8081 --rs 127.0.0.1:8082 --rs 127.0.0.1:8083 --logger DEBG --health-schem http --health-path / +``` + +## 清理 + +最后,你可以使用以下命令进行清理: + +```bash +lvscare care --vs 169.254.0.1:80 --logger DEBG -C +``` + +结论:LVScare是一款基于IPVS的轻量级负载均衡和健康检查工具,它能与Sealos无缝集成,极大地提高了Kubernetes集群的可用性和性能。试一试,看看LVScare如何帮助你更好地管理你的Kubernetes集群! diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/_category_.json b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/_category_.json new file mode 100644 index 00000000000..a788e786e6c --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 2 +} diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cert.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cert.md new file mode 100644 index 00000000000..77d295bad8a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cert.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 1 +keywords: [Kubernetes证书管理, sealctl cert命令, Kubernetes集群安全, TLS加密, Kubernetes证书生成] +description: 了解如何使用sealctl cert命令生成Kubernetes集群所需的证书,确保组件之间的安全通信和数据加密。 +--- + + +# cert 证书管理 + +`cert` 命令用于生成 Kubernetes 集群所需的证书文件。在 Kubernetes 集群中,证书用于确保组件之间的通信安全,例如 API server、kubelet 和 etcd 等。证书通过 TLS(Transport Layer Security)协议实现加密,以确保数据在传输过程中的保密性和完整性。 + +`sealctl cert` 命令可以根据提供的参数自动生成证书。这些参数包括节点 IP、节点名称、服务 CIDR、DNS 域以及可选的其他备用名称。通过生成并配置这些证书,您可以确保 Kubernetes 集群的安全通信。 + + + +``` +cert 命令用于生成 Kubernetes 证书。 + +参数: + --alt-names 备用名称,例如 sealos.io 或 10.103.97.2。可以包含多个备用名称。 + --node-name 节点名称,例如 master0。 + --service-cidr 服务网段,例如 10.103.97.2/24。 + --node-ip 节点的 IP 地址,例如 10.103.97.2。 + --dns-domain 集群 DNS 域,默认值为 cluster.local。 + --cert-path Kubernetes 证书文件路径,默认值为 /etc/kubernetes/pki。 + --cert-etcd-path Kubernetes etcd 证书文件路径,默认值为 /etc/kubernetes/pki/etcd。 + +示例: + sealctl cert --alt-names sealos.io --alt-names 10.103.97.2 \ + --node-name master0 --service-cidr 10.103.97.2/24 \ + --node-ip 10.103.97.2 --dns-domain cluster.local + +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cri.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cri.md new file mode 100644 index 00000000000..ba3dbec5520 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/cri.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 2 +keywords: [Kubernetes, CRI, 容器管理, sealctl, cgroup驱动] +description: 了解如何使用sealctl命令管理和检查Kubernetes集群中的CRI容器运行时环境,确保其正确配置和正常运行。 +--- + +# CRI 容器管理 + +`cri` 命令是用于管理和检查 Kubernetes 集群中的容器运行时(Container Runtime Interface,CRI)环境。容器运行时是负责运行容器的底层技术,如 Docker、containerd 或者 CRI-O 等。在 Kubernetes 中,容器运行时用于启动、停止和管理容器,以支持集群中的工作负载。 + +`sealctl cri` 命令提供了一组子命令,使您能够执行与容器运行时相关的各种操作,例如检查运行时是否是 Docker、是否正在运行,列出 Kubernetes 容器,删除容器,拉取镜像,检查镜像是否存在以及获取 CGroup 驱动信息等。 + +通过使用 `sealctl cri` 命令,您可以轻松地管理和检查 Kubernetes 集群中的容器运行时环境,确保其正确配置和正常运行。 + + + +```shell +sealctl cri [flags] +``` + + + +子命令: + +1. `socket`:检测 CRI 套接字。 + +```shell +sealctl cri socket +``` + +2. `cgroup-driver`:获取容器运行时的 cgroup 驱动。 + +```shell +sealctl cri cgroup-driver [--short] +``` + +- `--short`:仅打印结果。 + +全局参数: + +- `--socket-path`:CRI 套接字路径。 +- `--config`:CRI 配置文件。 + +示例: + +```shell +sealctl cri socket +sealctl cri cgroup-driver --short + +``` \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hostname.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hostname.md new file mode 100644 index 00000000000..d407e6f33b3 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hostname.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 3 +keywords: [sealctl, 主机名, 获取主机名, 操作系统, 命令行工具] +description: 使用sealctl命令行工具获取操作系统的主机名,无需传递任何参数,简单高效。 +--- + + +# hostname 获取主机名 + +获取操作系统的主机名: + +```shell +sealctl hostname +``` + +示例: + +```shell +sealctl hostname +``` + +执行此命令将返回操作系统的主机名。无需传递任何参数。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hosts.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hosts.md new file mode 100644 index 00000000000..97f1d8d112d --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/hosts.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 4 +keywords: [hosts管理, sealctl命令, hosts文件, 域名解析, IP地址映射] +description: 了解如何使用sealctl命令管理操作系统的hosts文件,包括列出、添加和删除域名与IP地址映射的详细步骤。 +--- + +# hosts 管理 + +`hosts` 命令是用于管理操作系统的 hosts 文件。hosts 文件是一个用于解析域名到 IP 地址的文件,通常在本地系统中用于覆盖 DNS 解析。通过修改 hosts 文件,您可以为一个特定的域名分配一个自定义的 IP 地址,而不必依赖 DNS 服务器。 + +`sealctl hosts` 提供了以下三个子命令来实现 hosts 文件的管理: + +1. `list`:列出当前 hosts 文件中的所有条目。 +2. `add`:向 hosts 文件中添加一个新的域名与 IP 地址映射。 +3. `delete`:从 hosts 文件中删除一个指定的域名与 IP 地址映射。 + +通过这些子命令,您可以方便地查看、添加和删除 hosts 文件中的映射,从而更好地控制域名到 IP 地址的解析。 + +1. `sealctl hosts list`:列出当前 hosts 文件中的条目。 + + 示例: + + ```shell + sealctl hosts list + ``` + + + +2. `sealctl hosts add`:向 hosts 文件中添加一个新条目。 + + 参数: + + - `--ip`:IP 地址(必填) + - `--domain`:域名(必填) + + 示例: + + ```shell + sealctl hosts add --ip 192.168.1.100 --domain example.com + ``` + +3. `sealctl hosts delete`:从 hosts 文件中删除一个条目。 + + 参数: + + - `--domain`:要删除的域名(必填) + + 示例: + + ```shell + sealctl hosts delete --domain example.com + ``` + +注意:您可以在任何 `hosts` 子命令后面添加 `--path` 参数来指定 hosts 文件的路径。默认路径为 `/etc/hosts`(Linux 系统)。 + +示例: + +```shell +sealctl hosts list --path /custom/path/hosts +``` + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/ipvs.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/ipvs.md new file mode 100644 index 00000000000..7c906c3d44d --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/ipvs.md @@ -0,0 +1,74 @@ +--- +sidebar_position: 6 +keywords: [IPVS负载均衡, sealctl命令, 虚拟服务器, 真实服务器, 健康检查, 代理模式, 调度算法, 清理功能] +description: 了解如何使用sealctl ipvs命令创建和管理本地IPVS负载均衡,包括虚拟服务器和真实服务器的映射、健康检查、代理模式和调度算法配置。 +--- + +# ipvs 管理 + +`ipvs` 命令用于创建和管理本地的 IPVS 负载均衡。IPVS(IP Virtual Server)是 Linux 内核中的一个模块,它允许在内核空间实现高性能的负载均衡。`ipvs` 命令通过管理虚拟服务器和真实服务器的映射关系,实现对服务的负载均衡。 + +`sealctl ipvs` 支持以下功能: + +1. 创建和管理虚拟服务器 (virtual server) 和真实服务器 (real server) 的映射关系。 +2. 提供健康检查功能,定期检查真实服务器的健康状态,并根据需要对其进行上下线操作。 +3. 支持两种代理模式:`route` 和 `link`。 +4. 支持配置代理调度算法(如轮询、加权轮询等)。 +5. 支持一次性创建代理规则(`--run-once` 标志)或持续运行并管理代理规则。 +6. 支持清理功能:通过 `-C` 或 `--clean` 标志,可以清除现有的 IPVS 规则并退出。 + +通过 `sealctl ipvs` 命令,用户可以轻松地在本地创建和管理高性能的负载均衡服务。 + +**用法** + +```shell +sealctl ipvs [flags] +``` + +**选项** + +- `-C`, `--clean`: 清除现有规则,然后退出。 +- `--health-insecure-skip-verify`: 跳过不安全请求的验证(默认为 true)。 +- `--health-path string`: 用于探测的 URL 路径(默认为 "/healthz")。 +- `--health-req-body string`: 健康检查器发送的请求体。 +- `--health-req-headers stringToString`: HTTP 请求头(默认为 [])。 +- `--health-req-method string`: HTTP 请求方法(默认为 "GET")。 +- `--health-schem string`: 探测器的 HTTP 方案(默认为 "https")。 +- `--health-status ints`: 有效状态码。 +- `-h`, `--help`: ipvs 帮助。 +- `-i`, `--iface string`: 要创建的虚拟接口的名称,与 kube-proxy 的行为相同(默认为 "lvscare")。仅在 mode=link 时启用。 +- `--interval durationOrSecond`: 健康检查间隔(默认为 0s)。 +- `--ip ip`: 作为路由网关的目标 IP,与 route 模式一起使用。 +- `--logger string`: 日志级别:DEBG/INFO(默认为 "INFO")。 +- `--masqueradebit int`: IPTables masquerade 位。仅在 mode=link 时启用。 +- `--mode string`: 代理模式:route/link(默认为 "route")。 +- `--rs strings`: 真实服务器地址,例如 192.168.0.2:6443。 +- `--run-once`: 创建代理规则并退出。 +- `--scheduler string`: 代理调度器(默认为 "rr")。 +- `--vs string`: 虚拟服务器地址,例如 169.254.0.1:6443。 + +**全局选项** + +- `--debug`: 启用调试日志。 +- `--show-path`: 启用显示代码路径。 + +**使用文档** + +要使用 `sealctl ipvs` 命令,请按照以下步骤操作: + +1. 为命令提供必要的选项和参数。 +2. 执行命令,将创建或管理本地 IPVS 负载均衡。 + +**示例** + +创建代理规则并退出: + +```shell +sealctl ipvs --vs 169.254.0.1:6443 --rs 192.168.0.2:6443 --run-once +``` + +清除现有 IPVS 规则: + +```shell +sealctl ipvs --clean +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/registry.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/registry.md new file mode 100644 index 00000000000..bf46cc7441b --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/registry.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 5 +keywords: [Sealos, sealctl, registry serve, Docker 镜像仓库, 文件系统模式, 内存模式, 镜像管理, Docker 分发, 镜像同步] +description: 了解如何使用Sealos的sealctl registry serve命令启动和管理Docker镜像仓库,支持文件系统和内存模式,轻松实现镜像同步和分发。 +--- + +# registry 镜像仓库 + +## Sealos:sealctl registry serve 命令详解与使用指南 + +在构建并管理 Docker 镜像仓库过程中,Sealos 提供了 `sealctl registry serve` 命令以方便用户进行相关操作。本文将详细介绍 `sealctl registry serve` 命令的使用方法和示例。 + +### 基本介绍 + +`sealctl registry serve` 命令的主要作用是启动一个 Docker 分发镜像仓库服务器,支持两种模式:`filesystem` 和 `inmem`。 + +1. **Filesystem 模式**:在此模式下,sealctl 将运行一个针对指定目录的 Docker 分发镜像仓库服务器。该模式下,镜像数据将存储在硬盘上。**该命令还用于sealos做增量镜像同步** + +2. **In-memory 模式**:在此模式下,sealctl 将运行一个内存中的 Docker 分发镜像仓库服务器。该模式下,镜像数据仅保存在内存中,进程退出后数据将丢失。 + +### 命令参数 + +`sealctl registry serve filesystem ` 命令支持以下参数: + +- `--disable-logging`: 禁用日志输出,默认为 false。 +- `--log-level`: 配置日志级别,默认为 'error'。 +- `-p, --port`: 服务器监听的端口,默认为随机未使用的端口。 + +### 使用示例 + +以下是一些 `sealctl registry serve` 命令的使用示例: + +#### 在文件系统中启动镜像仓库服务器 + +```bash +sealctl registry serve filesystem --port=5000 +``` + +以上命令将在端口5000上启动一个文件系统镜像仓库服务器。 + +#### 在内存中启动镜像仓库服务器 + +```bash +sealctl registry serve inmem +``` + +以上命令将启动一个内存镜像仓库服务器。该服务器在进程退出后,存储的数据将丢失。 + +通过 `sealctl registry serve` 命令,用户可以轻松地管理和操作 Docker 镜像仓库。无论是在开发环境,还是在生产环境中,它都是一个强大且易用的工具。 + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/sealctl.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/sealctl.md new file mode 100644 index 00000000000..509ce8a7e4e --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/sealctl.md @@ -0,0 +1,70 @@ +--- +sidebar_position: 0 +keywords: [Sealos, sealctl, 集群管理, 容器管理, 证书管理, IPVS负载均衡, 静态Pod, Kubernetes, 镜像仓库, CRI配置] +description: 了解如何使用Sealos的sealctl命令行工具进行集群管理、容器管理、证书管理、IPVS负载均衡、静态Pod部署等操作,全面掌控Kubernetes集群。 +--- + +# Sealctl 使用指南 + +Sealos 提供 sealctl 是使用 Sealos 与 集群节点进行操作的命令行工具。它包括以下几个子命令: + +1. `cert`:管理证书,用于生成、查看和更新TLS证书。 +2. `cri`:管理容器运行时接口(CRI)配置,例如Docker或containerd。 +3. `hostname`:查看或设置系统主机名。 +4. `hosts`:管理系统的hosts文件,用于定义静态主机名到IP地址映射。 +5. `ipvs`:管理IP虚拟服务器(IPVS)规则,用于负载均衡和代理。 +6. `registry`:管理镜像仓库,用于存储容器镜像仓库格式镜像以及镜像仓库管理。 +7. `static_pod`:管理静态Pod,可以创建静态Pod的配置。 +8. `token`:生成和管理访问令牌,用于授权访问Kubernetes集群。 + +通过这些子命令,您可以方便地管理和配置您的Sealos系统,实现对容器、镜像仓库、网络等各个方面的控制。 + + + + +# sealos 依赖命令 + +1. **添加Hosts** + + 在指定 IP 地址的节点上添加一个新的 hosts 记录。参数包括 IP 地址、主机名和域名。使用`sealctl hosts add `命令 + +2. **删除Hosts** + + 删除指定 IP 地址节点上的一个 hosts 记录。参数包括 IP 地址和域名。使用`sealctl hosts delete`命令 + +3. **hostname** + + 获取指定 IP 地址节点的主机名。 使用`sealctl hostname`命令 + +4. **IPVS负载均衡** + + 在指定 IP 地址的节点上配置 IPVS,实现负载均衡。参数包括节点 IP 地址、虚拟 IP 地址和主节点 IP 地址列表。 使用`sealctl ipvs`命令 + +5. **清空IPVS规则** + + 清除指定 IP 地址节点上的 IPVS 配置。参数包括节点 IP 地址和虚拟 IP 地址。 使用`sealctl ipvs`命令 + +6. **静态POD生成** + + 在指定 IP 地址的节点上部署一个静态 Pod(lvscare)。参数包括节点 IP 地址、虚拟 IP 地址、Pod 名称、镜像名称和主节点 IP 地址列表。使用`sealctl static-pod lvscare`命令 + +7. **处理集群交互认证的token** + + 为指定 IP 地址的节点生成一个 token。参数包括节点 IP 地址、配置文件和证书密钥。使用`sealctl token`命令 + +8. **获取节点的cgroup** + + 获取指定 IP 地址节点的cri CGroup 信息。 使用`sealctl cri cgroup`命令 + +9. **获取节点的cri-socket** + + 获取指定 IP 地址节点的 cri Socket 信息。 使用`sealctl cri socket`命令 + +10. **在节点生成https自签名证书** + + 为指定 IP 地址的节点生成证书。参数包括节点 IP 地址、备用名称列表、主机 IP 地址、主机名、服务 CIDR 和 DNS 域名。 使用`sealctl cert` 命令 + +11. **节点启动registry** + +​ 在指定节点启动regsitry,为进行增量镜像同步。使用`sealctl registry serve`命令 + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/static-pod.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/static-pod.md new file mode 100644 index 00000000000..2dc218faa21 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/static-pod.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 7 +keywords: [static-pod, sealctl, lvscare, Kubernetes, 静态Pod配置, kubelet, IPVS, Kubernetes集群] +description: 了解如何使用sealctl命令生成Kubernetes静态Pod配置,特别是lvscare静态Pod,简化集群管理。 +--- + +# static-pod 配置 + +`static-pod` 命令用于生成静态 Pod,这些 Pod 是由 kubelet 直接管理的,而不是通过 API 服务器。静态 Pod 在某些场景下非常有用,比如设置和管理 Kubernetes 集群中的控制平面组件。 + +`sealctl static-pod` 命令提供了一种简便的方法,用于生成用于特定目的的静态 Pod 配置文件。目前,它主要支持生成 `lvscare` 静态 Pod,`lvscare` 是一种用于管理 IPVS 规则的工具。 + +使用 `sealctl static-pod lvscare`,您可以根据指定的参数(如 VIP、主节点地址、镜像名称等)生成 `lvscare` 静态 Pod YAML 文件。然后,该文件可以存储在 kubelet 的静态 Pod 路径下,kubelet 将自动创建和管理相应的 Pod。 + + + +**用法** + +```shell +sealctl static-pod lvscare [flags] +``` + +**选项** + +- `--vip`: 默认 VIP IP(默认为 "10.103.97.2:6443")。 +- `--name`: 生成 lvscare 静态 Pod 名称。 +- `--image`: 生成 lvscare 静态 Pod 镜像(默认为 `sealos.hub:5000/sealos/lvscare:latest`)。 +- `--masters`: 生成 master 地址列表。 +- `--print`: 是否打印 YAML。 + +**示例** + +生成 lvscare 静态 Pod 文件并打印 YAML: + +```shell +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168.0.3:6443 --print +``` + +如果没有使用 `--print` 选项,将直接生成配置文件到 `/etc/kubernetes/manifests` 并启用静态 Pod: + +```shell +sealctl static-pod lvscare --vip 10.103.97.2:6443 --name lvscare --image lvscare:latest --masters 192.168.0.2:6443,192.168.0.3:6443 +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md new file mode 100644 index 00000000000..b4bf0ec07e1 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/tar&&untar.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 9 +keywords: [Sealos, sealctl tar, sealctl untar, 文件压缩, 文件解压] +description: 了解如何使用Sealos的sealctl tar和sealctl untar命令进行文件和文件夹的压缩与解压,简化备份和迁移操作。 +--- + +# tar 与 untar 详解 + +Sealos 提供了 `sealctl tar` 和 `sealctl untar` 命令以便于用户进行文件或文件夹的压缩和解压。本文将详细介绍这两个命令的使用方法。 + +## sealctl tar 命令 + +`sealctl tar` 命令的主要作用是将指定路径的目录压缩成归档文件。注意,这将剥离父目录。 + +**命令参数:** + +- `--clear`:是否在压缩完成后删除源文件,默认为 false。 +- `--compression`:压缩算法,可用选项有 tar/gzip/zstd/disable,默认为 disable。 +- `-o, --output`:归档文件的路径。 + +**基本用法:** + +```bash +sealctl tar [flags] [options] +``` + +## sealctl untar 命令 + +`sealctl untar` 命令的主要作用是在指定路径 `src` 查找匹配 glob 模式的归档文件,并在 `dst` 路径进行解压。 + +**命令参数:** + +- `--clear`:是否在解压完成后删除源文件,默认为 false。 +- `-o, --output`:解压归档文件的路径。 + +**基本用法:** + +```bash +sealctl untar [flags] [options] +``` + +## 使用示例 + +以下是一些 `sealctl tar` 和 `sealctl untar` 命令的使用示例: + +**创建一个压缩文件:** + +```bash +sealctl tar --output=/path/to/archive.tar /path/to/source +``` + +以上命令将 `source` 目录压缩为 `archive.tar` 文件。 + +**解压一个压缩文件:** + +```bash +sealctl untar --output=/path/to/destination /path/to/archive.tar +``` + +以上命令将 `archive.tar` 文件解压到 `destination` 目录。 + +通过 `sealctl tar` 和 `sealctl untar` 命令,用户可以轻松地进行文件或文件夹的压缩和解压操作。这两个命令在文件管理中,尤其是在备份和迁移文件时,都是非常有用的工具。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/token.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/token.md new file mode 100644 index 00000000000..56e06c78fdb --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealctl/token.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 8 +keywords: [sealctl token, Kubernetes 集群, token 管理, 节点身份验证, 配置文件, 证书密钥, 工作节点, 主节点, 安全性, 节点加入] +description: 了解如何使用 sealctl token 命令生成用于 Kubernetes 集群节点身份验证的 token,确保工作节点安全加入集群,简化管理过程。 +--- + +# token 管理 + +`sealctl token` 命令的主要目的是为了生成一个用于连接主节点(master)和工作节点(node)的 token。在 Kubernetes 集群中,当您想要将一个新的工作节点加入到集群时,通常需要提供一个 token 作为身份验证。这个 token 确保只有拥有正确 token 的工作节点才能加入到集群中。 + +`sealctl token` 命令通过接收配置文件(可选)和证书密钥(可选)作为参数,生成一个用于身份验证的 token。在默认情况下,如果不提供配置文件和证书密钥,命令会使用内置的默认设置来生成 token。 + +总之,`sealctl token` 命令用于生成一个用于身份验证的 token,允许工作节点安全地加入到 Kubernetes 集群中。使用这个命令可以简化节点加入集群的过程,确保集群的安全性。 + + +**用法** + +```shell +sealctl token [config] [certificateKey] +``` + +**参数** + +- `config`: 配置文件(可选)。 +- `certificateKey`: 证书密钥(可选)。 + +**示例** + +使用默认参数生成 token: + +```shell +sealctl token +``` + +使用自定义配置文件和证书密钥生成 token: + +```shell +sealctl token my-config my-certificate-key +``` + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/_category_.json b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/_category_.json new file mode 100644 index 00000000000..c9cb98244eb --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/_category_.json @@ -0,0 +1,3 @@ +{ + "position" : 1 +} diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md new file mode 100644 index 00000000000..a92ca95f0b4 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/app-cluster-image.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 11 +keywords: [Sealos, cluster-image, Kubernetes集群, 应用镜像, Docker镜像, GitHub Action, 镜像构建, Helm chart, Kubernetes yaml, 镜像配置] +description: Sealos 提供 cluster-image 仓库,用于构建和发布 Kubernetes 集群的应用镜像,支持 Docker 和应用集群镜像构建,使用 GitHub Action。 +--- + +# 应用集群镜像使用指南 + +Sealos 提供了一个名为 [cluster-image](https://github.com/labring-actions/cluster-image) 的仓库,该仓库在 GitHub 上用于构建并发布 Kubernetes 集群的应用镜像。这些镜像可以通过提交代码到这个仓库来创建,并可以发布到 `docker.io/labring/` 作为官方的应用镜像。它支持构建 Docker 容器镜像以及应用的集群镜像。 + +## 镜像的类型 + +仓库支持三种类型的镜像构建: + +- **APP集群镜像**:主要是构建应用镜像,使用 GitHub Action,会同时支持 amd64 和 arm64 架构。 +- **配置集群镜像**:主要是构建配置镜像,使用 GitHub Action,没有容器镜像不区分架构,一般是一些脚本相关的配置或者覆盖默认的配置镜像。 +- **Docker镜像**:主要是构建容器镜像,使用 GitHub Action,会同时支持 amd64 和 arm64 架构。 + +## 镜像构建的工作流程 + +你可以直接在 GitHub 仓库中创建 Issue 来触发镜像的构建。这里提供了几个示例可以参考: + +- `/imagebuild_dockerimages helm v3.8.2 Key1=Value1,Key2=Value2` +- `/imagebuild_configs coredns v0.0.1` +- `/imagebuild_apps helm v3.8.2` + +每种类型的镜像构建命令的格式为 `/imagebuild_<类型> <应用名称> <版本> [Key=Value,...]`,其中 `<类型>` 是 `dockerimages`、`configs` 或 `apps`, `<应用名称>` 和 `<版本>` 分别代表应用的名称和版本,`[Key=Value,...]` 是可选的buildArg参数,仅用于 `dockerimages` 类型。 + +## 镜像配置的存放位置 + +你可以在 `applications/<应用名称>/<版本>/` 目录下放置你的配置文件,包括 Dockerfile、Kubefile 和 init.sh 等。init.sh 脚本通常用于下载一些依赖的二进制文件,如 helm、kubectl-minio 等。你可以选择使用 Dockerfile 或 Kubefile 来编写你的镜像构建逻辑。 + +## 镜像构建规则 + +对于每种类型的镜像,构建规则略有不同。通常,你需要在应用的目录下创建不同的子目录并放置不同类型的文件,然后 Sealos 会根据这些文件来构建镜像。具体的规则如下: + +1. `charts` 目录:放置一些集群镜像需要的 Helm chart,Kubernetes 会根据扫描的 chart 获取镜像并构建 + +出 registry 目录放到与 Kubefile 同级的目录。 +2. `manifests` 目录:直接放置一些 Kubernetes yaml 配置,Kubernetes 会扫描 manifests 目录所有的镜像并构建出 registry 目录放到与 Kubefile 同级的目录。 +3. `images/shim` 目录:主要存储一些额外的镜像列表并构建出 registry 目录放到与 Kubefile 同级的目录。 +4. 如果需要模板,在 `etc`、`charts`、`manifests` 放置一些以 `.tmpl` 结尾的文件可以被 `sealos run` 环境变量渲染后去掉 `.tmpl`,比如渲染之前是 `aa.yaml.tmpl`,渲染后为 `aa.yaml`。请注意文件名不要与现有的文件冲突。 +5. `registry` 必须放在与 Kubefile 同级的目录,否则无法拷贝到 master0 的私有仓库。制作镜像时也需要注意这一点。不要把 registry 存放到 chart 里,否则 helm 扫描可能会很慢,可能导致 OOM。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/add.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/add.md new file mode 100644 index 00000000000..7b808169a04 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/add.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 4 +keywords: [Sealos, 集群节点添加, Sealos add, 控制节点, 节点添加] +description: 了解如何使用Sealos add命令向集群中添加节点和控制节点,确保etcd正常选举,掌握基本用法和选项。 +--- + +# add 集群节点添加 + +`sealos add` 是 Sealos 命令行工具中的一个命令,主要用于向集群中添加节点。本指南将详细介绍其使用方法和选项。 + +**注意要保证控制节点的个数为奇数个以保证etcd可以正常选举** + +## 基本用法 + +### 添加节点 + +要向集群中添加节点,可以使用 `--nodes` 选项: + +```bash +sealos add --nodes x.x.x.x +``` + +在上述命令中,`x.x.x.x` 应替换为你想要添加的节点的 IP 地址。 + +### 添加控制节点 + +要向集群中添加控制节点,可以使用 `--masters` 选项: + +```bash +sealos add --masters x.x.x.x +``` + +### 同时添加控制节点和节点 + +如果你想同时向集群中添加控制节点和节点,可以同时使用 `--masters` 和 `--nodes` 选项: + +```bash +sealos add --masters x.x.x.x --nodes x.x.x.x +sealos add --masters x.x.x.x-x.x.x.y --nodes x.x.x.x-x.x.x.y +``` + +## 选项 + +`sealos add` 命令提供了以下选项: + +- `--cluster='default'`: 要执行加入操作的集群的名称。默认为 `default`。 + +- `--masters=''`: 要加入的主节点。 + +- `--nodes=''`: 要加入的节点。 + +每个选项后都可以跟随一个参数。 + +## 使用示例 + +以下是一个使用示例,该示例向集群中添加了 IP 地址为 `192.168.0.2` 的节点: + +```bash +sealos add --nodes 192.168.0.2 +``` + +以上就是 `sealos add` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/apply.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/apply.md new file mode 100644 index 00000000000..4b0aac5a94c --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/apply.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 1 +keywords: [sealos apply, Kubernetes 集群, 集群镜像, Clusterfile, sealos 命令] +description: 了解如何使用 sealos apply 命令在 Kubernetes 集群中运行集群镜像,详细介绍基本用法和选项设置。 +--- + +# apply 启动集群 + +`sealos apply` 是 Sealos 命令行工具中的一个重要命令,用于在 Kubernetes 集群中运行集群镜像。本指南将详细介绍其使用方法和选项。 + +## 基本用法 + +`sealos apply` 命令的基本用法如下: + +```shell +$ sealos apply -f Clusterfile +``` + +Clusterfile 内容: + +```yaml +apiVersion: apps.sealos.io/v1beta1 +kind: Cluster +metadata: + name: default +spec: + # 服务器 IP 地址列表和角色 + hosts: + - ips: + - 192.168.0.2:22 + - 192.168.0.3:22 + - 192.168.0.4:22 + roles: + - master + - amd64 + - ips: + - 192.168.0.5:22 + - 192.168.0.6:22 + - 192.168.0.7:22 + roles: + - node + - amd64 + image: + - labring/kubernetes:v1.25.0 + - labring/helm:v3.8.2 + - labring/calico:v3.24.1 + ssh: + passwd: xxx + pk: /root/.ssh/id_rsa + port: 22 + user: root +``` + +这条命令会根据指定的 `Clusterfile` 文件在 Kubernetes 集群中运行集群镜像。 + +## 选项 + +`sealos apply` 命令提供了多种选项,用于定制命令的行为: + +- `-f, --Clusterfile='Clusterfile'`: 指定要应用的集群文件。默认为 `Clusterfile`。 +- `--config-file=[]`: 指定自定义Config文件的路径,用于替换或者修改资源。 +- `--env=[]`: 设置在命令执行过程中要使用的环境变量。 +- `--set=[]`: 在命令行上设置值,一般是替换模板的值。 +- `--values=[]`: 指定要应用到 `Clusterfile` 的values文件,一般是用于模板方式。 + +每个选项后面都可以跟随一个或多个参数。多个参数之间用逗号分隔。 + +例如,你可以使用 `--set` 选项在命令行上设置一些值: + +```shell +sealos apply -f Clusterfile --set key1=value1,key2=value2 +``` + +这条命令会将 `key1` 和 `key2` 的值设置为 `value1` 和 `value2`,然后应用 `Clusterfile`。 + +同样,你也可以使用 `--values` 选项指定一个值文件: + +```shell +sealos apply -f Clusterfile --values values.yaml +``` + +这条命令会根据 `values.yaml` 文件中的值应用 `Clusterfile`。 + +**更多示例请参考[启动镜像](/self-hosting/lifecycle-management/operations/run-cluster/)** + +以上就是 `sealos apply` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/build.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/build.md new file mode 100644 index 00000000000..ec01d976a16 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/build.md @@ -0,0 +1,71 @@ +--- +sidebar_position: 6 +keywords: [Sealos build命令, 构建OCI镜像, Dockerfile构建, 镜像构建选项, Sealos使用指南] +description: 了解如何使用Sealos的build命令构建OCI镜像,包括主要选项和示例,提升构建效率和便捷性。 +--- + +# build 构建镜像 + +Sealos 的 `build` 命令用于使用 Sealfiles、Kubefiles、Dockerfiles 或 Containerfiles 中的指令构建 OCI 镜像。这是 Sealos 构建集群镜像的基础命令。 + +如果没有指定任何参数,Sealos 将使用当前工作目录作为构建上下文,并查找指令文件。如果不存在 Sealfile、Kubefile、Dockerfile 或 Containerfile,则构建失败。 + +下面是一些主要的 `build` 选项: + +1. `--all-platforms`:尝试为所有基础镜像平台构建镜像。 +2. `--authfile`:认证文件的路径。 +3. `--build-arg`:向构建器提供的 `argument=value`。 +4. `--build-context`:向构建器提供额外构建上下文的 `argument=value`。 +5. `--creds`:访问 registry 使用的 `[username[:password]]`。 +6. `-D, --disable-compression`:默认不压缩图层。 +7. `--env`:为镜像设置环境变量。 +8. `-f, --file`:Dockerfile 的 `pathname 或 URL`。 +9. `--force-rm`:即使构建不成功,也始终在构建后删除中间容器。 +10. `--format`:构建的镜像的清单和元数据的 `format`。 +11. `--from`:用于替换 Containerfile 中第一条 FROM 指令的值的镜像名称。 +12. `--http-proxy`:传递 HTTP Proxy 环境变量。 +13. `--isolation`:使用的进程隔离 `type`。可以是 'oci' 或 'chroot'。 +14. `--max-pull-procs`:拉取时使用的最大 goroutine 数量。 +15. `--platform`:设置镜像的 OS/ARCH/VARIANT 为提供的值,而不是主机的当前操作系统和架构。 +16. `--pull`:从 registry 拉取镜像,如果新的或存储中不存在,则拉取,如果 false,只有在不存在时才拉取镜像,如果 always,即使命名的镜像存在于存储中,也拉取镜像,如果 never,只使用存储中可用的镜像。 +17. `-q, --quiet`:克制不宣布构建指令和镜像读/写进度。 +18. `--retry`:在执行 push/pull 失败时重试的次数。 +19. `--retry-delay`:在 push/pull 失败时重试的延迟。 +20. `--rm`:在成功构建后删除中间容器。 +21. `--save-image`:保存从特定目录解析的镜像,以 registry 格式存储。 +22. `--sign-by`:使用指定 `FINGERPRINT` 的 GPG 密钥签名镜像。 +23. `-t, --tag`:应用到构建镜像的标签 `name`。 + +24. `--target`:设置要构建的目标构建阶段。 +25. `--timestamp`:将创建的时间戳设置为指定的 epoch 秒,以允许确定性构建,默认为当前时间。 + +这些选项可以灵活地应对多种构建需求,包括针对特定平台的构建、环境变量设置、构建上下文管理、镜像签名等。使用 `--save-image` 选项,Sealos 可以自动识别镜像列表(包括从镜像列表、Helm charts、manifests 中解析出的镜像)并保存为 registry 格式。 + +进程隔离模式 `--isolation` 支持 'oci' 和 'chroot' 两个参数。如果本地支持 OCI,可以选择 'oci' 模式;如果不支持 OCI,应该使用 'chroot' 模式。 + +`--save-image` 是 Sealos 构建命令的一个选项,这个选项的作用是在构建过程中自动查找并保存需要的镜像。在 Sealos 中,构建一个镜像可能涉及到其他依赖镜像。这些依赖镜像可能来自镜像列表、Helm charts 或 集群 manifests。当使用 `--save-image` 选项时,Sealos 将根据构建上下文,自动解析这些依赖并将其保存为 Docker Registry 格式。 + +例如,以下是一个使用 `--save-image` 选项的示例: + +```bash +sealos build -t myapp:v1.0.0 -f Dockerfile . +``` + +在这个示例中,Sealos 将使用当前目录作为构建上下文,从 Dockerfile 文件中读取构建指令,并尝试构建出一个标记为 `myapp:v1.0.0` 的镜像。同时,Sealos 将解析 Dockerfile 文件中所有 `FROM` 指令引用的基础镜像,并将这些镜像保存下来。这些镜像将以 Docker Registry 的格式保存,可以被直接推送到 Docker Registry 中。 + +如果你的构建上下文中还包含了 Helm charts 或 集群manifests,Sealos 也会解析这些文件中引用的镜像,并将这些镜像一并保存。 + +总的来说,`--save-image` 选项为 Sealos 的构建过程提供了一种自动处理依赖镜像的方式,大大提高了构建镜像的便捷性和效率。 + +下面有一些详细的示例: + +- [基于镜像清单构建](/self-hosting/lifecycle-management/operations/build-image/build-image-image_list.md) +- [基于部署清单构建](/self-hosting/lifecycle-management/operations/build-image/build-image-manifests.md) +- [基于helm-charts构建](/self-hosting/lifecycle-management/operations/build-image/build-image-helm_charts.md) +- [基于二进制构建](/self-hosting/lifecycle-management/operations/build-image/build-image-binary.md) +- [基于go-template构建](/self-hosting/lifecycle-management/operations/build-image/build-image-go_template.md) +- [基于exec和scp构建](/self-hosting/lifecycle-management/operations/build-image/build-image-scp_exec.md) + +通过 Sealos `build` 命令,可以基于多种指令文件构建 OCI 镜像,为sealos提供所需的镜像。这个过程包括处理 Dockerfile 或其他指令文件中的各种指令,如 `FROM`、`RUN`、`ADD` 等,以及处理镜像层次、镜像标签等。构建过程也包括拉取基础镜像、运行命令、保存结果等步骤。每一个步骤都可以通过上述的选项进行详细的控制和定制,以满足不同的构建需求。 + +以上就是 `sealos build` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/cert.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/cert.md new file mode 100644 index 00000000000..2cacf582ffc --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/cert.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 3 +keywords: [sealos cert, 集群证书更新, API服务器证书, sealos命令行工具, Kubernetes证书] +description: 了解如何使用sealos cert命令更新Kubernetes集群的API服务器证书,添加域名和IP,确保集群安全。 +--- + +# cert 更新集群证书 + +`sealos cert` 是 Sealos 命令行工具中的一个命令,主要用于在集群中更新 API 服务器的证书。本指南将详细介绍其使用方法和选项。 + +## 基本用法 + +要在证书中添加域名或 IP,可以使用 `--alt-names` 选项: + +```bash +sealos cert --alt-names sealos.io,10.103.97.2,127.0.0.1,localhost +``` + +在上述命令中,`sealos.io,10.103.97.2,127.0.0.1,localhost` 应替换为你想要添加的域名和 IP 地址。 + +**注意**:在执行此操作之前,你最好先备份旧的证书。 + +执行 `sealos cert` 命令后,会更新集群 API 服务器的证书,你无需手动重启 API 服务器,sealos会自动帮你重启服务。 + +## 选项 + +`sealos cert` 命令提供了以下选项: + +- `--alt-names=''`: 在证书中添加域名或 IP,例如 `sealos.io` 或 `10.103.97.2`。 + +- `-c, --cluster='default'`: 要执行 exec 操作的集群的名称。默认为 `default`。 + +每个选项后都可以跟随一个参数。 + +## 校验证书 + +更新证书后,你可以使用以下命令进行校验: + +```bash +kubectl -n kube-system get cm kubeadm-config -o yaml +openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text +``` + +上述命令将获取 kube-system 命名空间中的 kubeadm-config 配置映射,并显示 apiserver.crt 证书的详细信息。 + +以上就是 `sealos cert` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/commands.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/commands.md new file mode 100644 index 00000000000..d64a6ad183a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/commands.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 0 +keywords: [Sealos命令, Kubernetes集群管理, 节点管理, 容器镜像, Sealos调试模式] +description: 了解Sealos命令,包括Kubernetes集群管理、节点管理、容器镜像操作等,开启调试模式获取详细系统运行信息。 +--- + +# Sealos 命令说明 + +## 集群管理命令 + +- `apply`:使用 Clusterfile 在 Kubernetes 集群内运行集群镜像。 +- `cert`:更新 Kubernetes API 服务器的证书。 +- `run`:轻松运行云原生应用。 +- `reset`:重置集群中的所有内容。 +- `status`:查看 Sealos集群 的状态。 + +## 节点管理命令 + +- `add`:将节点添加到集群中。 +- `delete`:从集群中删除节点。 + +## 远程操作命令 + +- `exec`:在指定节点上执行 shell 命令或脚本。 +- `scp`:将文件复制到指定节点的远程位置。 + +## 实验性命令 + +- `registry`:与镜像仓库相关的命令。 + +## 容器和镜像命令 + +- `build`:使用 Sealfile 或 Kubefile 中的指令构建镜像。 +- `create`:创建集群,但不运行 CMD,用于检查镜像。 +- `inspect`:检查容器或镜像的配置。 +- `images`:列出本地存储中的镜像。 +- `load`:从文件中加载镜像。 +- `login`:登录到容器仓库。 +- `logout`:登出容器仓库。 +- `manifest`:操作清单列表和镜像索引。 +- `merge`:合并多个镜像为一个。 +- `pull`:从指定位置拉取镜像。 +- `push`:将镜像推送到指定的目标。 +- `rmi`:从本地存储中删除一个或多个镜像。 +- `save`:将镜像保存到存档文件中。 +- `tag`:为本地镜像添加一个附加名称。 + +## 其他命令 + +- `completion`:为指定的 shell 生成自动补全脚本。 +- `docs`:生成 API 参考。 +- `env`:打印 Sealos 使用的所有环境信息。 +- `gen`:生成具有所有默认设置的 Clusterfile。 +- `version`:打印版本信息。 + +Sealos 的 `--debug` 参数是一个全局参数,用于开启调试模式,以便在出现问题时能更详细地了解系统的运行情况。 + +有关安装说明,请参见[下载 Sealos 命令行工具](/self-hosting/lifecycle-management/quick-start/install-cli.md); 如需安装 Kubernetes 集群,请参见[安装 Kubernetes 集群](/self-hosting/lifecycle-management/quick-start/deploy-kubernetes.md)。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/create.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/create.md new file mode 100644 index 00000000000..7cd27ee1441 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/create.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 6 +keywords: [Sealos create, 集群工作目录, Kubernetes, 镜像审查, Sealos 命令行] +description: 了解如何使用 Sealos create 命令创建集群工作目录,审查 Kubernetes 镜像,支持调试和测试,确保镜像内容符合预期。 +--- + +# create 创建工作目录 + +`sealos create` 是 Sealos 命令行工具中的一个命令,主要用于在不执行 CMD 的情况下创建集群工作目录,以便审查镜像。本指南将详细介绍其使用方法和选项。 + +## 基本用法 + +`sealos create` 命令用于创建集群工作目录,但不实际运行,主要用于调试或测试,它可以输出集群镜像的地址,你可以校验集群镜像内容是否与预期一致。 + +```bash +sealos create docker.io/labring/kubernetes:v1.24.0 +``` + +在上述命令中,`clustername` 代表你要创建的集群的名称。 + +## 选项 + +`sealos create` 命令提供了以下选项: + +- `-c, --cluster='default'`: 要创建但不实际运行的集群的名称。默认为 `default`。 + +- `--platform='linux/arm64/v8'`: 将镜像的操作系统/架构/版本设置为提供的值,而不是主机的当前操作系统和架构(例如 `linux/arm`)。 + +- `--short=false`: 如果为真,只打印挂载路径。 + +- `-e, --env=[]`: 指定渲染模板文件时使用的环境变量。 + +每个选项后都可以跟随一个参数。 + +## 示例 + +例如,你可以使用以下命令创建一个名为 `mycluster` 的集群,但不实际运行它: + +```bash +sealos create -e registryPort=8443 docker.io/labring/kubernetes:v1.24.0 +``` + +此命令将创建一个镜像名称为 `docker.io/labring/kubernetes:v1.24.0` 的集群工作目录,并输出集群镜像的地址。`-e registryPort=8443` 选项指定了在渲染模板文件时使用的环境变量,其中 `registryPort` 被设置为 `8443`。请注意,这个示例中集群并没有被实际运行。 + +以上就是 `sealos create` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/delete.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/delete.md new file mode 100644 index 00000000000..3ed5b240f56 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/delete.md @@ -0,0 +1,70 @@ +--- +sidebar_position: 4 +keywords: [sealos delete, 集群节点删除, sealos 命令, 删除控制节点, sealos 使用指南] +description: 了解如何使用 sealos delete 命令从集群中删除节点和控制节点,确保集群正常运行。详细指南和选项说明。 +--- + +# delete 集群节点删除 + +`sealos delete` 是 Sealos 命令行工具中的一个命令,主要用于从集群中移除节点。本指南将详细介绍其使用方法和选项。 + +**注意要保证控制节点的个数为奇数个以保证etcd可以正常选举** + +## 基本用法 + +### 删除节点 + +要从集群中删除节点,可以使用 `--nodes` 选项: + +```bash +sealos delete --nodes x.x.x.x +``` + +在上述命令中,`x.x.x.x` 应替换为你想要删除的节点的 IP 地址。如果不小心删除了错误的节点,可以使用 `sealos add` 命令恢复它: + +```bash +sealos add --nodes x.x.x.x +``` + +### 删除控制节点 + +要从集群中删除控制节点,可以使用 `--masters` 选项: + +```bash +sealos delete --masters x.x.x.x +``` + +请注意,如果指定了 `--masters` 参数,sealos 将删除你的控制节点。 + +### 删除控制节点和节点 + +如果你想同时删除控制节点和节点,可以同时使用 `--masters` 和 `--nodes` 选项: + +```bash +sealos delete --masters x.x.x.x --nodes x.x.x.x +sealos delete --masters x.x.x.x-x.x.x.y --nodes x.x.x.x-x.x.x.y +``` + +## 选项 + +`sealos delete` 命令提供了以下选项: + +- `--cluster='default'`: 执行删除操作应用的集群的名称。默认为 `default`。 + +- `--force=false`: 可以输入一个 `--force` 标志以强制删除节点。 + +- `--masters=''`: 要移除的控制节点。 + +- `--nodes=''`: 要移除的节点。 + +每个选项后都可以跟随一个参数。 + +## 使用示例 + +以下是一个使用示例,该示例删除了 IP 地址为 `192.168.0.2` 的节点: + +```bash +sealos delete --nodes 192.168.0.2 +``` + +以上就是 `sealos delete` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/env.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/env.md new file mode 100644 index 00000000000..288dcd906c7 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/env.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 7 +keywords: [sealos, 环境变量, sealos env, 命令行工具, sealos build] +description: 了解如何使用Sealos命令行工具查看和设置环境变量,掌握sealos env命令的基本用法和详细说明。 +--- + +# env 环境变量 + +`sealos env` 是 Sealos 命令行工具中的一个命令,用于展示目前sealos支持的环境变量以及当前的环境变量值。 + +## 基本用法 + +### 查看环境变量 + +要查看环境变量,可以使用 `sealos env` 命令: + +```bash +sealos env +``` + +### 查看环境变量以及说明 + +要查看环境变量以及说明,可以使用 `sealos env -v` 命令: + +```bash +sealos env -v +``` + + +## 如何设置环境变量 + +```shell +BUILDAH_LOG_LEVEL=debug sealos images +``` + +```shell +SEALOS_REGISTRY_SYNC_EXPERIMENTAL=true sealos build -t xxx . +``` + + +以上就是 `sealos env` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/exec.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/exec.md new file mode 100644 index 00000000000..28acfdacf08 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/exec.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 5 +keywords: [sealos exec, Sealos 命令行工具, 集群节点, Shell 命令, 执行脚本, 集群管理, Sealos 使用指南, Sealos 选项, Sealos 示例] +description: 了解如何使用 Sealos exec 命令在集群节点上执行 Shell 命令或脚本,掌握基本用法、选项和示例,提升集群管理效率。 +--- + +# exec 执行命令 + +`sealos exec` 是 Sealos 命令行工具中的一个命令,用于在指定的集群节点上执行 Shell 命令或脚本。本指南将详细介绍其使用方法和选项。 + +## 基本用法 + +基本的 `sealos exec` 命令格式如下: + +```bash +sealos exec "shell command or script" +``` + +在上述命令中,`shell command or script` 是你要在集群节点上执行的 Shell 命令或脚本。 + +## 选项 + +`sealos exec` 命令提供了以下选项: + +- `-c, --cluster='default'`: 要在其上执行命令的集群的名称。默认为 `default`。 + +- `--ips=[]`: 在具有指定 IP 地址的节点上运行命令。 + +- `-r, --roles='':`: 在具有指定角色的节点上运行命令。目前支持 master,node,registry + +每个选项后都可以跟随一个或多个参数。 + +## 示例 + +例如,你可以使用以下命令在默认集群的所有节点上查看 `/etc/hosts` 文件的内容: + +```bash +sealos exec "cat /etc/hosts" +``` + +如果你想在名为 `my-cluster` 的集群的 `master` 和 `node` 角色的节点上查看 `/etc/hosts` 文件的内容,可以使用以下命令: + +```bash +sealos exec -c my-cluster -r master,node "cat /etc/hosts" +``` + +如果你只想在 IP 地址为 `172.16.1.38` 的节点上查看 `/etc/hosts` 文件的内容,可以使用以下命令: + +```bash +sealos exec -c my-cluster --ips 172.16.1.38 "cat /etc/hosts" +``` + +以上就是 `sealos exec` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/gen.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/gen.md new file mode 100644 index 00000000000..0d87d0607b2 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/gen.md @@ -0,0 +1,51 @@ +--- +sidebar_position: 3 +keywords: [Sealos, Kubernetes集群, gen命令, Clusterfile, sealos apply] +description: 了解如何使用Sealos的gen命令生成Kubernetes集群配置文件,快速创建和管理集群,提升运维效率。 +--- + +# gen 生成集群配置 + +Sealos 的 `gen` 命令是用于生成 Kubernetes 集群的配置文件(Clusterfile),这个配置文件可以在之后通过 `sealos apply` 命令来应用。`gen` 命令可以帮助用户快速生成一个基本的配置文件,用户可以在此基础上根据自己的需求进行修改和调整。 + +下面是 `sealos gen` 命令的基本使用方法和一些常见的示例: + +1. 生成一个默认配置的单节点集群: + + ```bash + sealos gen labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 + ``` + +注意:labring/helm 应当在 labring/calico 之前。 + +2. 生成一个包含多个镜像、指定了主节点和工作节点的集群: + + ```bash + sealos gen labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \ + --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' + ``` + +注意:labring/helm 应当在 labring/calico 之前。 + +3. 指定 SSH 端口,对于所有服务器使用相同的 SSH 端口: + + ```bash + sealos gen labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --port 24 --passwd 'xxx' + ``` + + 对于使用不同 SSH 端口的服务器: + + ```bash + sealos gen labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3:23,192.168.0.4:24 \ + --nodes 192.168.0.5:25,192.168.0.6:25,192.168.0.7:27 --passwd 'xxx' + ``` + +在生成了 Clusterfile 之后,用户可以根据自己的需求来修改这个文件。添加或修改环境变量;修改集群cidr配置。完成修改后,用户就可以通过 `sealos apply` 命令来根据这个配置文件来创建或更新集群了。 + +示例说明: + +- [自定义配置安装](/self-hosting/lifecycle-management/operations/run-cluster/gen-apply-cluster.md) + +以上就是 `sealos gen` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/images.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/images.md new file mode 100644 index 00000000000..8cb43762c51 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/images.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 6 +keywords: [Sealos, 镜像管理, Sealos images 命令, 镜像参数, 镜像过滤] +description: 了解如何使用Sealos的images命令查看和管理本地存储的镜像,包括显示所有镜像、特定镜像和使用多种参数进行过滤。 +--- + +# image 镜像列表 + +Sealos 的 `images` 命令主要用于查看本地存储的镜像。用户可以通过它来查看本地所有的镜像,或者筛选查看特定的镜像。该命令支持多种参数,可以帮助用户更方便的查看和管理镜像。 + +## 基本用法 + +基本的 `sealos images` 命令将显示所有非中间阶段的本地镜像,例如: + +```bash +sealos images +``` + +这将显示本地存储的所有最终阶段镜像。 + +## 示例 + +以下是 `sealos images` 命令的一些常见示例: + +1. 显示所有镜像,包括构建的中间镜像: + + ```bash + sealos images --all + ``` + +2. 显示特定镜像: + + ```bash + sealos images [imageName] + ``` + +3. 以指定的 Go 模板格式显示镜像: + + ```bash + sealos images --format '{{.ID}} {{.Name}} {{.Size}} {{.CreatedAtRaw}}' + ``` + +## 参数 + +以下是 `sealos images` 命令的一些常用参数: + +- `-a, --all`:显示所有镜像,包括构建过程中的中间镜像。 + +- `--digests`:显示镜像的摘要。 + +- `-f, --filter`:根据提供的条件过滤输出结果。 + +- `--format`:使用 Go 模板对镜像进行美化打印。 + +- `--history`:显示镜像的命名历史。 + +- `--json`:以 JSON 格式输出。 + +- `--no-trunc`:不截断输出。 + +- `-n, --noheading`:不打印列标题。 + +- `-q, --quiet`:只显示镜像 ID。 + +通过组合使用这些参数,用户可以轻松地获取和管理本地存储的镜像。例如,使用 `--all` 参数可以查看所有镜像,包括中间镜像;使用 `--filter` 参数可以根据特定条件过滤镜像;使用 `--json` 参数可以以 JSON 格式输出镜像信息,方便进行程序化处理等。 + +以上就是 `sealos images` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md new file mode 100644 index 00000000000..a5913692960 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/inspect.md @@ -0,0 +1,81 @@ +--- +sidebar_position: 6 +keywords: [Sealos命令, inspect命令, 容器配置, 镜像配置, Go模板格式, 远程镜像仓库, 本地OCI归档, Docker归档文件] +description: 了解如何使用Sealos的inspect命令查看容器和镜像的详细配置信息,包括元数据、环境变量和启动命令等。 +--- + +# inspect 详细信息 + +Sealos 的 `inspect` 命令主要用于查看构建容器或已构建镜像的配置信息。该命令支持查看镜像或容器的详细信息,包括其元数据、环境变量、启动命令等。 + +## 基本用法 + +使用 `sealos inspect` 命令查看指定容器或镜像的配置信息。例如,查看指定容器的配置: + +```bash +sealos inspect containerID +``` + +或者查看指定镜像的配置: + +```bash +sealos inspect --type image imageWithTag +``` + +## 示例 + +以下是 `sealos inspect` 命令的一些常见示例: + +1. 查看容器配置: + + ```bash + sealos inspect containerID + ``` + +2. 查看镜像配置: + + ```bash + sealos inspect --type image imageWithTag + ``` + +3. 查看镜像ID的配置信息: + + ```bash + sealos inspect --type image @imageID # 或直接输入imageID, '@' 是可选的 + ``` + +4. 查看远程镜像仓库的配置信息: + + ```bash + sealos inspect --type image docker://alpine:latest + ``` + +5. 查看本地OCI归档文件中镜像的配置信息: + + ```bash + sealos inspect --type image oci-archive:/abs/path/of/oci/tarfile.tar + ``` + +6. 查看本地Docker归档文件中镜像的配置信息: + + ```bash + sealos inspect --type image docker-archive:/abs/path/of/docker/tarfile.tar + ``` + +7. 使用 Go 模板格式显示镜像环境变量: + + ```bash + sealos inspect --format '{{.OCIv1.Config.Env}}' alpine + ``` + +## 参数 + +以下是 `sealos inspect` 命令的一些常用参数: + +- `-f, --format`:使用 Go 模板格式显示输出结果。**模板结构代码[InspectOutput](https://github.com/labring/sealos/blob/f8a17787822714c5fdf21f2a75cc86fadb88adfa/pkg/buildah/inspect.go#L189)** + +- `-t, --type`:指定查看的类型,可以是容器(`container`)或镜像(`image`)。 + +根据你的需要,你可以结合使用这些参数,以获取特定的配置信息。例如,使用 `-t` 参数可以指定你想要查看的是容器的配置信息还是镜像的配置信息;使用 `-f` 参数,可以定义特定的输出格式,方便对输出结果进行处理或解析。 + +以上就是 `sealos inspect` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/load.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/load.md new file mode 100644 index 00000000000..b760b265119 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/load.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 6 +keywords: [sealos load, 加载镜像, 存档文件, 无网络环境, 镜像导入] +description: 了解如何使用sealos load命令从存档文件中加载镜像,特别适用于无网络环境下的镜像导入。 +--- + +# load 加载镜像 + +`sealos load` 是一个用来从存档文件中加载镜像的命令。这对于需要从已有的存档文件中导入镜像非常有用,尤其是在没有网络连接的环境中。 + +## 用法: + +`sealos load [flags] [options]` + +## 参数: + +以下是 `sealos load` 命令的参数: + +- `-i, --input=''`: 从 tar 存档文件中加载镜像。 + +## 示例: + +- 从一个存档文件中加载镜像:`sealos load -i myimage.tar` + +注意,在使用 `sealos load` 命令时,你需要确保指定的存档文件存在,并且格式正确。如果你在导入镜像时遇到问题,你可能需要检查你的存档文件,以确保它们没有被损坏或格式化错误。 + +以上就是 `sealos load` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/login.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/login.md new file mode 100644 index 00000000000..14e778b0354 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/login.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 6 +keywords: [sealos login, 容器注册表登录, sealos命令, 镜像推送, 镜像拉取] +description: 了解如何使用sealos login命令登录容器注册表,进行镜像的拉取和推送,确保提供正确的用户名和密码。 +--- + +# login 登录仓库 + +`sealos login` 命令用于在指定服务器上登录容器注册表。登录注册表后,你可以拉取、推送镜像。 + +## 用法: + +`sealos login [flags] [options] registryName` + +## 参数: + +以下是 `sealos login` 命令的参数: + +- `--authfile=''`: 身份验证文件的路径。可以使用环境变量 REGISTRY_AUTH_FILE 来覆盖。 + +- `--cert-dir=''`: 使用指定路径的证书来访问镜像仓库。 + +- `--get-login=true`: 返回注册表的当前登录用户。 + +- `-k, --kubeconfig=''`: 使用 kubeconfig 登录到 sealos 镜像仓库 hub.sealos.io。 + +- `-p, --password=''`: 注册表的密码。 + +- `--password-stdin=false`: 从标准输入获取密码。 + +- `-u, --username=''`: 注册表的用户名。 + +- `-v, --verbose=false`: 将更详细的信息写入标准输出。 + +## 示例: + +- 登录到 quay.io 注册表:`sealos login -u myusername -p mypassword quay.io ` + +注意,在使用 `sealos login` 命令时,你需要确保提供了正确的用户名和密码,否则登录过程可能会失败。如果你在登录过程中遇到问题,你可能需要检查你的用户名和密码,以确保它们没有输入错误或被遗忘。 + +以上就是 `sealos login` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/logout.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/logout.md new file mode 100644 index 00000000000..95e0102dec9 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/logout.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 6 +keywords: [sealos logout, 镜像仓库, 认证信息, 身份验证文件, quay.io] +description: 了解如何使用sealos logout命令移除本地缓存的镜像仓库账号和密码,包括参数和示例,帮助你轻松管理认证信息。 +--- + +# logout 登出仓库 + +`sealos logout` 命令用于在指定服务器上移除本地缓存的镜像仓库的账号和密码。 + +## 用法: + +`sealos logout [flags] [options] registryName` + +## 参数: + +以下是 `sealos logout` 命令的参数: + +- `--authfile=''`: 身份验证文件的路径。可以使用环境变量 REGISTRY_AUTH_FILE 来覆盖。 + +- `-a, --all=false`: 删除所有的认证信息。 + + +## 示例: + +- 登出到 quay.io 镜像仓库:`sealos logout quay.io ` + +以上就是 `sealos logout` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md new file mode 100644 index 00000000000..c09226bbd43 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/manifest.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 6 +keywords: [Sealos, manifest命令, 多架构支持, Docker镜像, OCI镜像] +description: 了解Sealos的manifest命令,轻松创建、修改和推送多架构支持的Docker和OCI镜像清单,提升部署效率。 +--- + +# manifest 镜像清单 + +Sealos 的 `manifest` 命令用于创建、修改和推送 manifest 列表和镜像索引。这些功能主要用于处理镜像的多架构支持。在 Docker 和 OCI 镜像规范中,manifest 列表(也被称为 "fat manifest")或镜像索引允许一个镜像标签(如 `myimage:latest`)在多种硬件架构(如 amd64, arm64, ppc64le 等)上都能使用。 + +以下是一些主要的 `manifest` 子命令: + +1. `create`:创建新的 manifest 列表或镜像索引。例如:`sealos manifest create localhost/list` +2. `add`:将镜像添加到 manifest 列表或镜像索引中。例如:`sealos manifest add localhost/list localhost/image` +3. `annotate`:在 manifest 列表或镜像索引的条目中添加或更新信息。例如:`sealos manifest annotate --annotation A=B localhost/list localhost/image` +4. `inspect`:显示 manifest 列表或镜像索引的内容。例如:`sealos manifest inspect localhost/list` +5. `push`:将 manifest 列表或镜像索引推送到 registry。例如:`sealos manifest push localhost/list transport:destination` +6. `remove` 和 `rm`:从 manifest 列表或镜像索引中移除条目,或者完全删除 manifest 列表或镜像索引。例如:`sealos manifest remove localhost/list sha256:entryManifestDigest` 或 `sealos manifest rm localhost/list` + +通过 `sealos manifest` 命令,可以灵活地管理 manifest 列表或镜像索引,为多架构的 Docker 或 OCI 镜像提供支持。用户可以根据自己的需求,创建自定义的 manifest 列表,方便在不同的硬件架构上部署和运行 Docker 镜像。 + +用户如果想通过manifest命令构建多架构镜像,可以参考文档[构建支持多架构的集群镜像](/self-hosting/lifecycle-management/operations/build-image/build-multi-arch-image.md) diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/merge.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/merge.md new file mode 100644 index 00000000000..2f38c723d33 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/merge.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 6 +keywords: [Sealos merge, 合并镜像, Dockerfile, 镜像优化, 应用部署] +description: 了解如何使用Sealos的merge命令将多个镜像合并为一个,优化镜像大小,简化应用部署,节省存储空间。 +--- + +# merge 合并镜像 + +Sealos 的 `merge` 命令的主要作用是将多个镜像合并为一个。它通过读取各个输入镜像的 Dockerfile,将其中的命令和层次结构合并到一个新的镜像中。这个命令的运行逻辑很像 `build` 命令,许多参数也是相同的。 + +这个功能在多个镜像有共享层的情况下非常有用,因为它可以减少镜像的大小,节省存储空间。同时,由于合并后的镜像包含了多个镜像的全部功能,所以它可以帮助简化应用部署。 + +以下是 `sealos merge` 的基本使用示例: + +```bash +sealos merge -t new:0.1.0 kubernetes:v1.19.9 mysql:5.7.0 redis:6.0.0 +``` + +在这个示例中,`kubernetes:v1.19.9`、`mysql:5.7.0` 和 `redis:6.0.0` 这三个镜像被合并为一个新的镜像 `new:0.1.0`。 + +`sealos merge` 命令提供了丰富的选项来定制合并过程,例如 `--all-platforms` 用于尝试为所有基础镜像平台构建镜像,`--build-arg` 用于向构建器提供参数,`--no-cache` 用于禁用现有的缓存镜像,等等。 + +请注意,`sealos merge` 命令会根据各个输入镜像的 Dockerfile 来构建新的镜像,所以如果输入镜像的 Dockerfile 不兼容,或者有任何构建错误,那么这个命令可能会失败。在使用 `sealos merge` 命令时,请确保你了解每个输入镜像的 Dockerfile,并根据需要进行调整。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/pull.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/pull.md new file mode 100644 index 00000000000..1096a1ad86c --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/pull.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 6 +keywords: [sealos pull, 拉取镜像, 容器镜像仓库, 镜像下载, sealos命令] +description: 了解如何使用sealos pull命令从容器镜像仓库下载镜像并存储在本地,提高工作效率。获取详细参数和使用示例。 +--- + +# pull 拉取镜像 + +`sealos pull` 是一个非常有用的命令,它可以从容器镜像仓库下载镜像并将其存储在本地。用户可以通过镜像的标签(tag)或摘要(digest)来获取镜像。如果没有指定标签,那么会默认下载带有 'latest' 标签(如果存在)的镜像。 + +通过使用这个命令,用户可以方便地从远程仓库下载所需的镜像,极大地提高了工作效率。 + +## 用法: + +`sealos pull [flags] [options] imageName` + +## 参数: + +以下是 `sealos pull` 命令的参数: + +- `-a, --all-tags=false`: 下载仓库中所有带有标签的镜像。 + +- `--authfile=''`: 认证文件的路径。可以使用环境变量 REGISTRY_AUTH_FILE 进行覆盖。 + +- `--cert-dir=''`: 用于访问镜像仓库的证书的指定路径。 + +- `--creds=''`: 使用 `[username[:password]]` 访问镜像仓库。 + +- `--decryption-key=[]`: 解密镜像所需要的密钥。 + +- `--platform=[linux/arm64/v8]`: 选择镜像时,优先使用指定的 OS/ARCH,而不是当前操作系统和架构。 + +- `--policy='missing'`: 设置策略,可选的值包括 'missing', 'always', 'never'。 + +- `-q, --quiet=false`: 在拉取镜像时,不输出进度信息。 + +- `--remove-signatures=false`: 在拉取镜像时,不复制签名。 + +- `--retry=3`: 在拉取失败时的重试次数。 + +- `--retry-delay=2s`: 拉取失败时,重试之间的延迟。 + +## 示例: + +- 拉取一个镜像:`sealos pull my-image:latest` + +- 从 Docker 守护进程拉取一个镜像:`sealos pull docker-daemon:my-image:tag` + +- 从特定的仓库拉取一个镜像:`sealos pull myregistry/myrepository/my-image:tag` + +- 拉取多个镜像:`sealos pull imageID1 imageID2 imageID3` + +以上就是 `sealos push` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/push.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/push.md new file mode 100644 index 00000000000..0530fba9074 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/push.md @@ -0,0 +1,109 @@ +--- +sidebar_position: 6 +keywords: [Sealos push, 上传镜像, Docker 镜像, 镜像仓库, OCI 布局, Docker 注册表, 镜像传输, 镜像推送, 镜像管理] +description: Sealos push 命令指南,详细介绍如何将本地 Docker 镜像推送到远程镜像仓库,支持多种传输方式和可选参数,轻松管理镜像。 +--- + +# push 上传镜像 + +`sealos push` 是 Sealos 命令行工具中的一个命令,用于将镜像推送到指定的位置。这个命令在你需要将本地 Docker 镜像推送到远程镜像仓库的时候特别有用。本指南将详细介绍其使用方法。 + +## 基本用法 + +基本的 `sealos push` 命令格式如下: + +```bash +sealos push IMAGE_ID DESTINATION +``` + +在上述命令中,`IMAGE_ID` 是你想要推送的镜像的 ID,而 `DESTINATION` 是你想要推送到的位置。 `DESTINATION` 使用 "transport:details" 格式,如果未指定,将复用源 IMAGE 作为 DESTINATION。 + +在 Sealos 中,传输方式定义了源镜像和目标镜像在复制过程中的格式和位置。以下是 Sealos 支持的各种传输方式: + +1. `containers-storage`: 此传输方式用于存储和管理在本地运行的容器。例如,使用 Podman 或 CRI-O 创建的容器的镜像。 + +2. `dir`: 这种传输方式将镜像存储在本地文件系统的一个目录中,该目录结构符合 OCI 布局。 + +3. `docker`: 这种传输方式用于与 Docker 注册表进行交互,如 Docker Hub 或任何其他兼容的私有注册表。 + +4. `docker-archive`: 此传输方式将镜像存储为一个本地的 Docker tar 文件(`.tar`),这是 Docker 的原生格式。 + +5. `docker-daemon`: 这种传输方式用于与本地 Docker 守护程序交互,可以从 Docker 守护程序中提取镜像,或者将镜像推送到 Docker 守护程序。 + +6. `oci`: 该传输方式将镜像存储在一个符合 OCI 布局的目录中,它是一种开放的容器镜像格式。 + +7. `oci-archive`: 这种传输方式将镜像存储为一个本地的 OCI tar 文件(`.tar`)。 + +8. `ostree`: 这种传输方式将镜像存储在 OSTree 存储库中,这是一种支持原子升级和回滚的文件系统。 + +9. `sif`: 这是 Singularity SIF 格式,主要用于高性能计算和数据密集型应用。 + +示例: + +- 将一个镜像推送到 Docker 注册表:`sealos push my-image:latest docker://my-registry.example.com/my-image:latest` + +- 将一个镜像从 Docker 守护程序导出:`sealos push docker-daemon:my-image:latest dir:/path/to/save/` + +- 将一个镜像推送到本地的容器存储:`sealos push my-image:latest containers-storage:my-new-image:latest` + +## 示例 + +例如,你可以使用以下命令将一个镜像推送到 `registry.example.com` 的仓库: + +```bash +sealos push my_image_id docker://registry.example.com/my_repository:my_tag +``` + +## 可选参数 + +- `--all`: 该参数用于推送清单列表引用的所有镜像。 + +- `--authfile`: 该参数用于指定身份验证文件的路径。 可以使用 REGISTRY_AUTH_FILE 环境变量进行覆盖。 + +- `--cert-dir`: 该参数用于指定访问注册表所需的证书的路径。 + +- `--compression-format`: 该参数用于指定要使用的压缩格式。 + +- `--compression-level`: 该参数用于指定要使用的压缩级别。 + +- `--cr-option` 参数是用于控制是否将镜像的自定义资源(Custom Resource,简称 CR)推送到目标镜像仓库的。 + + 具体来说,这个参数的可选值包括: + + - "yes": 将会把镜像以及其关联的 CR 都推送到目标镜像仓库。 + + - "no": 仅推送镜像,而不推送任何 CR。 + + - "only": 仅推送 CR,不推送镜像本身。 + + - "auto": 根据镜像和 CR 的实际状态自动决定是否推送。例如,如果 CR 有更改或者不存在于目标仓库,就会被推送。 + + 请注意,这个参数主要在处理包含自定义资源(如 Kubernetes CRD 对象)的镜像时使用,它能够让你更加灵活地控制镜像和 CR 的推送过程。 + +- `--creds`: 该参数用于访问注册表,使用 `[username[:password]]` 形式。 + +- `--digestfile`: 该参数在复制图像后,将结果图像的摘要写入文件。 + +- `-D`, `--disable-compression`: 该参数用于不压缩层。 + +- `--encrypt-layer`: 该参数用于指定要加密的层,0 索引层索引支持负索引(例如,0 是第一层,-1 是最后一层)。 如果未定义,则在指定 encryption-key 标志时将加密所有层。 + +- `--encryption-key`: 该参数用于指定加密图像所需的密钥,与加密协议一起使用(例如,jwe:/path/to/key.pem)。 + +- `-f`, `--format`: 该参数用于指定目标中要使用的清单类型(oci, v2s1, 或 v2s2)(默认是源的清单类型,带回退)。 + +- `-q`, `--quiet`: 该参数用于在推送图像时不输出进度信息。 + +- `--remove-signatures`: 该参数用于在推送图像时不复制签名。 + +- `--retry + +`: 该参数用于指定在推送/拉取失败时的重试次数。 + +- `--retry-delay`: 该参数用于指定在推送/拉取失败时重试之间的延迟。 + +- `--rm`: 该参数用于在推送成功后删除清单列表。 + +- `--sign-by`: 该参数用于使用指定的 `FINGERPRINT` 的 GPG 密钥签名图像。 + +以上就是 `sealos push` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/registry.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/registry.md new file mode 100644 index 00000000000..b390cfbbaf9 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/registry.md @@ -0,0 +1,234 @@ +--- +sidebar_position: 8 +keywords: [Sealos, registry 命令, Docker 镜像, 镜像仓库, 镜像同步, 镜像复制, 镜像管理, Docker 分发, 镜像保存, 镜像服务器] +description: 了解Sealos registry命令的使用指南,包括save、serve、passwd、sync和copy命令,帮助您高效管理Docker镜像仓库。 +--- + +# registry 镜像仓库命令 + +## Sealos:sealos registry save 命令详解与使用指南 + +`registry save` 命令用于将远程的 Docker 镜像拉取到本地并保存在指定的目录中。这对于在离线或者内网环境中部署容器镜像特别有用。 + +在执行 `registry save` 命令时,将自动获取 `sealos login` 认证信息进行仓库认证。 + +**使用说明** + +1. 使用context自动获取镜像 + + 使用默认方式拉取并保存镜像。这种模式会自动解析 `charts` 目录、`manifests` 目录和 `images` 目录以获取镜像列表。 + + **使用示例** + + ```shell + sealos registry save --registry-dir=/tmp/registry1 my-context + ``` + + +2. 指定镜像列表方式 + + 使用参数传入镜像列表 + + **使用示例** + + ```shell + sealos registry save --registry-dir=/tmp/registry2 --images=docker.io/library/busybox:latest + ``` + +**选项** + +以下选项适用于 `save` 命令及其子命令: + +- `--max-procs`: 拉取镜像时使用的最大并行进程数。 +- `--registry-dir`: 保存镜像的本地目录。 +- `--arch`: 镜像的目标架构,例如:`amd64`、`arm64` 等。 +- `--images`: 需要拉取并保存的镜像列表,以逗号分隔。例如:"my-image1:latest,my-image2:v1.0"。 + +## Sealos:sealos registry serve 命令详解与使用指南 + +在管理 Docker 镜像仓库过程中,Sealos 提供了 `sealos registry serve` 命令以方便用户进行相关操作。本文将详细介绍 `sealos registry serve` 命令的使用方法和示例。 + +### 基本介绍 + +`sealos registry serve` 命令的主要作用是启动一个 Docker 分发镜像仓库服务器,支持两种模式:`filesystem` 和 `inmem`。 + +1. **Filesystem 模式**:在此模式下,sealctl 将运行一个针对指定目录的 Docker 分发镜像仓库服务器。该模式下,镜像数据将存储在硬盘上。 + +2. **In-memory 模式**:在此模式下,sealctl 将运行一个内存中的 Docker 分发镜像仓库服务器。该模式下,镜像数据仅保存在内存中,进程退出后数据将丢失。 + +### 命令参数 + +`sealos registry serve filesystem ` 命令支持以下参数: + +- `--disable-logging`: 禁用日志输出,默认为 false。 +- `--log-level`: 配置日志级别,默认为 'error'。 +- `-p, --port`: 服务器监听的端口,默认为随机未使用的端口。 + +### 使用示例 + +以下是一些 `sealos registry serve` 命令的使用示例: + +#### 在文件系统中启动镜像仓库服务器 + +```bash +sealos registry serve filesystem --port=5000 +``` + +以上命令将在端口5000上启动一个文件系统镜像仓库服务器。 + +#### 在内存中启动镜像仓库服务器 + +```bash +sealos registry serve inmem +``` + +以上命令将启动一个内存镜像仓库服务器。该服务器在进程退出后,存储的数据将丢失。 + +通过 `sealctl registry serve` 命令,用户可以轻松地管理和操作 Docker 镜像仓库。无论是在开发环境,还是在生产环境中,它都是一个强大且易用的工具。 + + +## Sealos:sealos registry passwd 命令详解与使用指南 + +在管理 Docker 镜像仓库过程中,Sealos 提供了 `sealos registry passwd` 命令以方便用户对集群registry进行密码修改。它提供了一种简便的方法,帮助用户修改 registry 的密码。 + +### 基本用法 + +使用 `sealos registry passwd` 命令来修改registry的密码。 + +```bash +sealos registry passwd +``` + +### 参数 + +以下是 `sealos registry passwd` 命令的参数: + +- `-c, --cluster-name`:集群名称,默认为'default'。 + +- `-f, --cri-shim-file-path`:镜像 cri shim 文件路径,如果为空将不会更新镜像 cri shim 文件。默认路径为'/etc/image-cri-shim.yaml'。 + +- `-p, --htpasswd-path`:registry 密码文件路径。默认路径为'/etc/registry/registry_htpasswd'。 + +### 使用步骤 + +1. 执行 `sealos registry passwd` 命令,可以根据需要指定参数来进行配置。 + +2. 根据命令提示,输入新的密码。 + +3. 命令执行成功后,registry 的密码将被修改为新的密码。 + +### 演示说明 + +[![asciicast](https://asciinema.org/a/Qu05jah4ZZmjMuFR4vHEKvBsQ.svg)](https://asciinema.org/a/Qu05jah4ZZmjMuFR4vHEKvBsQ) + +**在使用过程中,会让用户选择registry类型** + +- registry: 二进制启动,执行`systemctl restart registry`进行重启镜像仓库。 +- containerd: containerd启动,执行"nerdctl restart sealos-registry"进行重启镜像仓库。 +- docker: docker启动,执行"docker restart sealos-registry"进行重启镜像仓库。 + +### 注意事项 + +**修改 registry 密码后,修改Clusterfile中的registry密码** +修改 registry 密码后,所有使用该 registry 的节点和服务都需要更新配置,以使用新的密码进行身份验证。否则,它们将无法从该 registry 拉取或推送镜像。 + +如果你不确定如何更新节点和服务的配置,建议在修改 registry 密码之前,先查阅相关文档或者寻求专业的技术支持。 + +## Sealos:`sealos registry sync` 命令详解与使用指南 + +Sealos 的 `registry sync` 命令可帮助您在两个 registry 之间同步所有镜像。这不仅可以用于镜像的迁移,还可以备份您的镜像。 + +### 命令基本用法 + +执行 `sealos registry sync` 命令来进行镜像同步: + +```bash +sealos registry sync source dst +``` + +这里的 `source` 表示源 registry 的地址,而 `dst` 是目标 registry 的地址。 + +例如,您想将地址为 127.0.0.1:41669 的 registry 中的所有镜像同步到地址为 sealos.hub:5000 的 registry,您应执行以下命令: + +```bash +sealos registry sync 127.0.0.1:41669 sealos.hub:5000 +``` + +### 认证与权限 + +在执行 `sealos registry sync` 命令之前,请确保您具有访问源 registry 和目标 registry 的权限。可以使用`sealos login`对registry进行认证登录。 + +### 同步过程 + +请注意,镜像同步可能需要一些时间,这取决于镜像的数量和大小,以及网络的速度。在同步过程中,请保持网络的连通性,并确保在同步完成之前不要中断命令的执行。 + +重要的是,`sealos registry sync` 命令支持增量同步,已经存在于目标 registry 的镜像不会重新同步。 + +### 参数选项 + +`sealos registry sync` 命令还提供了一些参数选项,允许您更精细地控制同步过程: + +- `--override-arch ARCH`:使用指定的 `ARCH` 替代当前机器的架构来选择镜像。 + +- `--override-os OS`:使用指定的 `OS` 替代当前操作系统来选择镜像。 + +- `--override-variant VARIANT`:使用指定的 `VARIANT` 替代当前的架构变种来选择镜像。 + +- `-a` 或 `--all`:如果源镜像是一个列表,同步所有镜像。这对异构环境下特别有用,因为默认情况下,只会同步当前架构的镜像。 + +例如,如果您想同步所有架构的镜像,可以添加 `-a` 参数: + +```bash +sealos registry sync -a 127.0.0.1:41669 sealos.hub:5000 +``` + +以上就是 `sealos registry sync` 命令的详细说明与使用指南。希望这些信息能帮助您更好地理解和使用这个命令。如果您在使用过程中遇到任何问题,欢迎随时提问。 + +## Sealos:`sealos registry copy` 命令详解与使用指南 + +Sealos 的 `registry copy` 命令用于将指定镜像从一个 registry 复制到另一个 registry。这能帮助您在不同的 registry 之间进行镜像的迁移或备份。 + +### 命令基本用法 + +使用 `sealos registry copy` 命令来进行镜像的复制: + +```bash +sealos registry copy source-image dst +``` + +这里的 `source-image` 表示源镜像的全名(包括地址和镜像名),`dst` 是目标 registry 的地址。 + +例如,要将名为 `127.0.0.1:41669/my-image:tag` 的镜像复制到地址为 `sealos.hub:5000` 的 registry,您可以执行以下命令: + +```bash +sealos registry copy 127.0.0.1:41669/my-image:tag sealos.hub:5000 +``` + +### 认证与权限 + +在执行 `sealos registry copy` 命令之前,请确保您具有访问源镜像和目标 registry 的权限。可以使用`sealos login`对registry进行认证登录。 + +### 复制过程 + +请注意,镜像复制可能需要一些时间,这取决于镜像的大小,以及网络的速度。在复制过程中,请保持网络的连通性,并确保在复制完成之前不要中断命令的执行。 + +### 参数选项 + +`sealos registry copy` 命令提供了一些参数选项,允许您更精细地控制复制过程: + +- `--override-arch ARCH`:使用指定的 `ARCH` 替代当前机器的架构来选择镜像。 + +- `--override-os OS`:使用指定的 `OS` 替代当前操作系统来选择镜像。 + +- `--override-variant VARIANT`:使用指定的 `VARIANT` 替代当前的架构变种来选择镜像。 + +- `-a` 或 `--all`:如果源镜像是一个列表,复制所有镜像。这对异构环境下特别有用,因为默认情况下,只会复制当前架构的镜像。 + +例如,如果您想复制所有架构的镜像,可以添加 `-a` 参数: + +```bash +sealos registry copy -a 127.0.0.1:41669/my-image:tag sealos.hub:5000 +``` + + +以上就是 `sealos registry` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/reset.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/reset.md new file mode 100644 index 00000000000..5687004e962 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/reset.md @@ -0,0 +1,63 @@ +--- +sidebar_position: 2 +keywords: [Sealos reset, 重置集群, Sealos 命令, 集群管理, Kubernetes 重置] +description: 了解如何使用 Sealos reset 命令重置集群,包括基本用法、示例和可选参数,确保集群管理更高效。 +--- + +# reset 重置集群 + +`sealos reset` 是 Sealos 命令行工具中的一个命令,用于重置整个集群。这个命令在你想要彻底清空集群数据或者重建集群的时候特别有用。本指南将详细介绍其使用方法。 + +## 基本用法 + +基本的 `sealos reset` 命令格式如下: + +```bash +sealos reset --cluster cluster_name +``` + +在上述命令中,`cluster_name` 是你想要重置的集群的名称。 + +## 示例 + +例如,你可以使用以下命令重置名为 `mycluster` 的集群: + +```bash +sealos reset --cluster mycluster +``` + +## 可选参数 + +- `--force`: 该参数用于强制重置集群,即使集群重置操作未能成功完成。 + +```bash +sealos reset --cluster mycluster --force +``` + +- `--masters`: 该参数用于指定要重置的 master 节点。 + +```bash +sealos reset --cluster mycluster --masters master1 +``` + +- `--nodes`: 该参数用于指定要重置的工作节点。 + +```bash +sealos reset --cluster mycluster --nodes node1 node2 +``` + +- `-p`, `--passwd`: 该参数用于提供密码进行身份验证。 + +- `-i`, `--pk`: 该参数用于指定用于公钥认证的身份(私钥)读取的文件。 + +- `--pk-passwd`: 该参数用于解密 PEM 编码私钥的口令。 + +- `--port`: 该参数用于指定要连接的远程主机的端口。 + +- `-u`, `--user`: 该参数用于指定要作为身份验证的用户名。 + +```bash +sealos reset --cluster mycluster --user username --pk /root/.ssh/id_rsa --pk-passwd yourpassword +``` + +以上就是 `sealos reset` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md new file mode 100644 index 00000000000..4272a531630 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/rmi.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 6 +keywords: [sealos rmi, 删除本地镜像, sealos命令行工具, 镜像管理, sealos教程] +description: 了解如何使用Sealos rmi命令删除本地镜像,清理无用或过时的镜像,节省存储空间。阅读详细指南获取更多信息。 +--- + +# rmi 删除本地镜像 + +`sealos rmi` 是 Sealos 命令行工具中的一个命令,用于删除本地存储的一个或多个镜像。这个命令可以帮助你清理无用或者过时的镜像,节省存储空间。本指南将详细介绍其使用方法。 + +## 基本用法 + +基本的 `sealos rmi` 命令格式如下: + +```bash +sealos rmi imageID +``` + +在上述命令中,`imageID` 是你想要删除的镜像的 ID。 + +## 示例 + +例如,你可以使用以下命令删除 ID 为 `imageID` 的镜像: + +```bash +sealos rmi imageID +``` + +如果你想要删除多个镜像,只需要在命令行中列出所有的镜像 ID,例如: + +```bash +sealos rmi imageID1 imageID2 imageID3 +``` + +## 可选参数 + +- `-a`, `--all`: 该参数用于删除所有镜像。使用此选项时,命令将不接受任何镜像 ID。 + +```bash +sealos rmi --all +``` + +- `-f`, `--force`: 该参数用于强制删除镜像,以及使用该镜像的任何容器。 + +```bash +sealos rmi --force imageID +``` + +- `-p`, `--prune`: 该参数用于修剪悬挂的镜像(没有标签且没有被任何容器引用的镜像)。 + +```bash +sealos rmi --prune +``` + +以上就是 `sealos rmi` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/run.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/run.md new file mode 100644 index 00000000000..4901bda34b1 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/run.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 1 +keywords: [Sealos, 集群镜像, Kubernetes, run命令, 多镜像执行, 集群初始化, 应用安装] +description: 了解如何使用Sealos的run命令进行集群初始化、应用安装和多镜像执行,掌握Kubernetes集群管理的最佳实践。 +--- + +# run 运行集群镜像 + +Sealos 的 `run` 命令是一个强大且灵活的工具,它支持集群初始化、应用安装、多镜像执行,单机集群等操作。下面是对于 `sealos run` 命令及其参数的详细解释和一些使用示例。 + +## 命令概览 + +``` +sealos run --masters [arg] --nodes [arg] [Options] +``` + +`` 参数是您想要在集群中运行的 Docker 镜像名称和版本。`--masters` 和 `--nodes` 是您想要运行这个镜像的 master 节点和 node 节点的 IP 列表。 + +### 选项解释 + +- `--cluster='default'`: 要运行操作的集群名称。 + +- `--cmd=[]`: 覆盖镜像中的 CMD 指令。 + +- `--config-file=[]`: 自定义配置文件的路径,用于替换资源。 + +- `-e, --env=[]`: 在命令执行期间设置的环境变量。 + +- `-f, --force=false`: 强制覆盖此集群中的应用。 + +- `--masters=''`: 要运行的 master 节点。 + +- `--nodes=''`: 要运行的 node 节点。 + +- `-p, --passwd=''`: 使用提供的密码进行认证。 + +- `-i, --pk='/root/.ssh/id_rsa'`: 选择从其中读取公钥认证身份的私钥文件。 + +- `--pk-passwd=''`: 解密 PEM 编码的私钥的密码。 + +- `--port=22`: 远程主机的连接端口。 + +- `-t, --transport='oci-archive'`: 从 tar 归档文件加载镜像传输。(可选值: oci-archive, docker-archive) + +- `-u, --user=''`: 认证的用户名。 + +## 示例 + +1. 创建集群到您的裸机服务器,指定 IP 列表: +``` +sealos run labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +2. 多镜像运行: +``` +sealos run labring/kubernetes:v1.24.0 labring/helm:v3.11.3 calico:v3.24.6 \ + --masters 192.168.64.2,192.168.64.22,192.168.64.20 --nodes 192.168.64.21,192.168.64.19 +``` + +3. 指定服务器的 InfraSSH 端口: +``` +sealos run labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --port 24 --passwd 'xxx' +``` + +4. 自定义 VIP Kubernetes 集群: +``` +sealos run -e defaultVIP=10.103.97.2 labring/kubernetes:v1.24.0 --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +5. 创建单节点 Kubernetes 集群: +``` +sealos run labring/kubernetes:v1.24.0 +``` + +6. 使用自定义环境变量创建集群: +``` +sealos run -e DashBoardPort=8443 mydashboard:latest --masters 192.168.0.2,192.168.0.3,192.168.0.4 \ + --nodes 192.168.0.5,192.168.0.6,192.168.0.7 --passwd 'xxx' +``` + +这些示例展示了 `sealos run` 命令的强大和灵活性,可以根据您的需求进行定制和调整。 + +更多示例请参考 [运行集群](/self-hosting/lifecycle-management/operations/run-cluster.md)。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/save.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/save.md new file mode 100644 index 00000000000..8d2f50b38ce --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/save.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 6 +keywords: [sealos save, 保存镜像, Sealos 命令行工具, 镜像备份, 镜像迁移] +description: 了解如何使用 Sealos save 命令保存镜像到归档文件中,轻松备份和迁移你的镜像,支持多种格式和参数。 +--- + +# save 保存镜像 + +`sealos save` 是 Sealos 命令行工具中的一个命令,用于将镜像保存到归档文件中。这个命令可以帮助你方便地备份和迁移你的镜像。本指南将详细介绍其使用方法。 + +## 基本用法 + +基本的 `sealos save` 命令格式如下: + +```bash +sealos save -o outputFilename imageName +``` + +在上述命令中,`outputFilename` 是你想要保存的归档文件的名称,`imageName` 是你想要保存的镜像的名称。 + +## 示例 + +例如,你可以使用以下命令将名为 `labring/kubernetes:latest` 的镜像保存到一个名为 `kubernetes.tar` 的归档文件中: + +```bash +sealos save -o kubernetes.tar labring/kubernetes:v1.24.0 +``` + +## 可选参数 + +- `--format`: 这个参数用于指定保存镜像的传输方式。目前可用的选项有 `oci-archive` 和 `docker-archive`、`oci-dir`,`docker-dir`。默认值是 `oci-archive`。 +- `-m`: 这个参数可以同时保存多个镜像,但是仅限于`docker-archive`格式。 + +例如,你可以使用以下命令将名为 `labring/kubernetes:latest` 的镜像以 `docker-archive` 的方式保存到一个名为 `kubernetes.tar` 的归档文件中: + +```bash +sealos save -o kubernetes.tar --format docker-archive labring/kubernetes:v1.24.0 +sealos save -o kubernetes.tar -m --format docker-archive labring/kubernetes:v1.24.0 labring/helm:v3.5.0 +``` + +以上就是 `sealos save` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/scp.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/scp.md new file mode 100644 index 00000000000..0fce7a06951 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/scp.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 5 +keywords: [sealos scp, 拷贝文件, 集群节点, 远程节点, 命令行工具] +description: 了解如何使用 Sealos scp 命令将文件复制到指定的集群节点,详细介绍基本用法和选项,助您轻松管理文件传输。 +--- + +# scp 拷贝文件 + +`sealos scp` 是 Sealos 命令行工具中的一个命令,用于将文件复制到指定的集群节点。本指南将详细介绍其使用方法和选项。 + +## 基本用法 + +基本的 `sealos scp` 命令格式如下: + +```bash +sealos scp "source file path" "destination file path" +``` + +在上述命令中,`source file path` 是你要复制的文件的本地路径,`destination file path` 是你要将文件复制到的远程节点路径。 + +## 选项 + +`sealos scp` 命令提供了以下选项: + +- `-c, --cluster='default'`: 要将文件复制到其上的集群的名称。默认为 `default`。 + +- `--ips=[]`: 将文件复制到具有指定 IP 地址的节点。 + +- `-r, --roles='':`: 将文件复制到具有指定角色的节点。 + +每个选项后都可以跟随一个或多个参数。 + +## 示例 + +例如,你可以使用以下命令将本地的 `/root/aa.txt` 文件复制到默认集群的所有节点的 `/root/dd.txt`: + +```bash +sealos scp "/root/aa.txt" "/root/dd.txt" +``` + +如果你想在名为 `my-cluster` 的集群的 `master` 和 `node` 角色的节点上复制文件,可以使用以下命令: + +```bash +sealos scp -c my-cluster -r master,node "/root/aa.txt" "/root/dd.txt" +``` + +如果你只想在 IP 地址为 `172.16.1.38` 的节点上复制文件,可以使用以下命令: + +```bash +sealos scp -c my-cluster --ips 172.16.1.38 "/root/aa.txt" "/root/dd.txt" +``` + +以上就是 `sealos scp` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/tag.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/tag.md new file mode 100644 index 00000000000..3ac7e03ce0a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/commands/tag.md @@ -0,0 +1,35 @@ +--- +sidebar_position: 6 +keywords: [Sealos tag, 镜像管理, 命令行工具, 添加镜像名称, Sealos 使用指南] +description: 了解如何使用 Sealos tag 命令为本地存储的镜像添加一个或多个附加名称,提升镜像管理效率。 +--- + +# tag 添加镜像名称 + +`sealos tag` 是 Sealos 命令行工具中的一个命令,用于给本地存储的镜像添加一个或多个附加名称。这个命令可以帮助你更好地管理你的镜像。本指南将详细介绍其使用方法。 + +## 基本用法 + +基本的 `sealos tag` 命令格式如下: + +```bash +sealos tag imageName newName +``` + +在上述命令中,`imageName` 是你要操作的镜像的名称,`newName` 是你想要添加的新标签。 + +## 示例 + +例如,你可以使用以下命令给名为 `imageName` 的镜像添加一个新的名称 `firstNewName`: + +```bash +sealos tag imageName firstNewName +``` + +你也可以一次添加多个名称,例如,添加 `firstNewName` 和 `SecondNewName` 两个名称: + +```bash +sealos tag imageName firstNewName SecondNewName +``` + +以上就是 `sealos tag` 命令的使用指南,希望对你有所帮助。如果你在使用过程中遇到任何问题,欢迎向我们提问。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md new file mode 100644 index 00000000000..656e6928ad9 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/kubernetes-cluster-image.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 10 +keywords: [Sealos, Kubernetes集群镜像, rootfs类型, 容器运行时, Kubernetes镜像版本] +description: 了解Sealos官方提供的Kubernetes集群镜像,包括镜像名称、类型和版本,选择适合您的Kubernetes容器运行时解决方案。 +--- + +# Kubernetes 集群镜像说明文档 + +本文档主要介绍 Sealos 官方提供的 rootfs 类型集群镜像,包括镜像名称、镜像类型以及镜像版本等方面的说明。 + +## 镜像名称 + +Sealos 官方发布的集群镜像主要包括以下几种: + +1. kubernetes:使用 containerd 作为容器运行时(CRI)的 Kubernetes 镜像。 +2. kubernetes-docker:使用 docker 作为容器运行时(CRI)的 Kubernetes 镜像。 +3. kubernetes-crio:使用 crio 作为容器运行时(CRI)的 Kubernetes 镜像。 + +目前,Sealos 主要提供了 Kubernetes 相关的镜像,而其他类型的集群镜像,如 k3s、k0s 等,尚未提供。 + +## 镜像类型 + +根据容器运行时(CRI)的不同,Sealos 提供了不同类型的 Kubernetes 集群镜像: + +1. 使用 containerd 作为 CRI 的 Kubernetes 镜像。 +2. 使用 docker 作为 CRI 的 Kubernetes 镜像。 +3. 使用 crio 作为 CRI 的 Kubernetes 镜像。 + +用户可以根据自己的需求和偏好,选择合适的镜像类型。 + +## 镜像版本 + +Sealos 官方提供的集群镜像有多个版本可供选择,例如: + +### 1. 开发版(Development version) + +适用于想要尝试项目最新功能的用户。开发版可能包含尚未经过完整测试的新功能和改进,因此可能不够稳定。 + +示例:`v1.26(v1.26-amd64/v1.26-arm64)` + +### 2. 最新版(Latest version) + +通常比开发版更稳定,但可能不包含所有的新功能。这是推荐给大多数用户使用的版本。 + +示例:`v1.26.0(v1.26.0-amd64/v1.26.0-arm64)` + +### 3. 发布版(Release version,包含历史版本) + +包含了历史版本的发布版。发布版通常经过了严格的测试,被认为是稳定的。 + +示例:`v1.26.0-4.1.5(v1.26.0-4.1.5-amd64/v1.26.0-4.1.5-arm64)` `4.1.5`是sealos对应版本号 + +在选择镜像版本时,用户需要根据自己的需求和偏好来选择适合的版本。另外,Sealos 还提供了针对不同处理器架构的子版本,以满足用户在不同硬件平台上的需求。 + +## 总结 + +本文档对 Sealos 官方提供的 rootfs 类型集群镜像进行了说明,包括镜像名称、镜像类型以及镜像版本等方面。用户可以根据自己的需求和偏好,在不同的镜像类型和版本中进行选择,以便在 Kubernetes 集群中运行容器。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/sealos.md b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/sealos.md new file mode 100644 index 00000000000..9d17e9bcae1 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/lifecycle-management/reference/sealos/sealos.md @@ -0,0 +1,18 @@ +--- +sidebar_position: 0 +keywords: [Sealos, 云操作系统, Kubernetes管理, 集群镜像, 命令行工具] +description: 了解Sealos使用指南,掌握云操作系统管理Kubernetes集群的命令行工具和集群镜像的详细信息。 +--- + +# Sealos 使用指南 + +Sealos 是一个统一的云操作系统,用于管理云原生应用。它提供了一系列命令行工具来帮助用户管理 Kubernetes 集群,管理节点,远程操作,管理容器和镜像,以及其他一些功能。下面是这些命令的详细介绍: + +本章节主要介绍 Sealos 的使用指南以及集群镜像相关说明。 + +- Sealos使用指南: 有关每个命令的详细信息,包括所有受支持的参数和子命令, 请参阅 [sealos](/self-hosting/lifecycle-management/reference/sealos/commands.md) 参考文档。 +- 集群镜像: + - [Rootfs集群镜像](/self-hosting/lifecycle-management/reference/sealos/kubernetes-cluster-image.md) + - [Application集群镜像](/self-hosting/lifecycle-management/reference/sealos/app-cluster-image.md) + + diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/QA.md b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/QA.md new file mode 100644 index 00000000000..0bb258f2b87 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/QA.md @@ -0,0 +1,112 @@ +--- +sidebar_position: 3 +keywords: [Sealos Cloud, 常见问题, 部署问题, 证书更新, 域名更换, 用户注册, 集群管理, Kubernetes] +description: 探索Sealos Cloud部署和使用中的常见问题解决方案,包括系统配置、证书更新、域名更换等关键操作指南,助您轻松管理Kubernetes集群。 +--- + +# 常见问题 + +在部署及使用 Sealos Cloud 过程中,您可能会遇到各种问题。为了更好地帮助您解决这些问题,我们对常见问题进行了总结,并提供了详细的答案和解决方法。 + +## 部署问题 + +下面总结了部署过程中可能遇到的问题及解决方法,假如您遇到了其他问题,请在 [Sealos 社区](https://forum.laf.run/)中联系我们。 + +### Q1:iptables / ip_forward 问题 + +**问题描述**:在部分操作系统中,iptables 或 IPv4 IP 转发默认未启用,例如旧版本的 Centos、RHEL 等。这可能导致部署过程中无法正常创建 +iptables 规则或转发数据包,从而导致集群无法正常启动。 + +**解决方法**:需要在每个节点上执行以下命令,以启用 iptables 和 IP 转发: + +```shell +$ modprobe br_netfilter +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables +$ echo 1 > /proc/sys/net/ipv4/ip_forward +``` + +### Q2:系统内核问题 + +- **问题描述**:如果系统内核版本过低,可能导致集群无法正常启动。低版本内核也可能导致依赖 MongoDB 5.0 的应用无法正常运行。 +- **解决方法**:在部署前,请确保系统内核版本至少为 5.4 或更高。 + +### Q3:系统资源问题 + +- **问题描述**:系统资源紧张可能会导致部署过程中出现卡顿或停滞,当您等待过久时,请检查系统资源是否足够。 +- **解决方法**:使用命令 `kubectl describe nodes` 查看节点资源状态。一般情况下可以从 CPU、内存、存储等方向排查系统资源是否充足。 + +### Q4:网络问题 + +- **问题描述**: 在部署过程中,服务器的不当配置可能会引发多种网络问题,例如: + 1. http_proxy / https_proxy 环境变量配置; + 2. 服务器防火墙配置; + 3. 服务器路由配置; +- **解决方法**: 遇到网络问题时,请检查以上配置是否正确。 + +## 证书及域名相关问题 + +### 证书更新 + +在您使用 Sealos 过程中,证书是保障集群安全的重要组成部分。以下是详细的证书更新步骤,这些步骤可以帮助您在证书即将过期时顺利更新: + +1. **备份旧证书**: + + 在主节点 `master0` 上,您需要先备份当前使用的证书。这是一个防止更新过程中出现问题而导致证书丢失的重要步骤。使用以下命令进行备份: + + ```shell + $ kubectl get secret -n sealos-system wildcard-cert -o yaml > cert-backup.yaml + ``` + + 此命令会将名为 `wildcard-cert` 的证书以 YAML 格式保存到文件 `cert-backup.yaml` 中。 + +2. **保存新证书**: + + 将您已经准备好的新证书文件保存到 `master0` 节点上。确保新的证书文件(通常是 `.crt` 和 `.key` 文件)在节点上的某个位置。 + +3. **更新证书**: + + 使用以下脚本来更新证书。您需要替换脚本中的 `` 和 ``,以指向您的新证书文件和密钥文件的实际路径。 + + ```shell + #!/bin/bash + # 设置变量 + CRT_FILE= + KEY_FILE= + + # 将证书和密钥文件内容进行Base64编码 + CRT_BASE64=$(cat $CRT_FILE | base64 -w 0) + KEY_BASE64=$(cat $KEY_FILE | base64 -w 0) + + # 构建部分更新的JSON对象 + PATCH_JSON='{"data":{"tls.crt":"'$CRT_BASE64'","tls.key":"'$KEY_BASE64'"}}' + + # 使用kubectl patch命令更新Secret + kubectl patch secret wildcard-cert -n sealos-system -p $PATCH_JSON + ``` + + 这个脚本的主要作用是将新证书的内容编码为 Base64 格式,并使用 `kubectl patch` 命令更新 Kubernetes 集群中的相应 Secret + 对象。 + +### 域名更换 + +域名更换是一个更加复杂的过程,因为它通常涉及到集群内多个组件和服务的配置更改。目前,我们尚未在文档中提供域名更换的详细教程。不过,我们计划在未来推出 +Sealos 集群管理面板,该面板将提供更加简便的方法来替换集群域名和证书。 + +请注意,域名更换通常需要对集群的网络配置进行深入了解,并且可能涉及到 DNS +设置、服务发现等多个方面。因此,建议在执行此类操作时,确保您具备相应的技术知识或咨询专业人士的帮助。 + +### 用户注册开关 + +关闭用户注册: + +```shell +kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: true/signUpEnabled: false/g' | kubectl apply -f - +kubectl rollout restart deployment desktop-frontend -n sealos +``` + +开启用户注册: + +```shell +kubectl get cm -n sealos desktop-frontend-config -o yaml | sed 's/signUpEnabled: false/signUpEnabled: true/g' | kubectl apply -f - +kubectl rollout restart deployment desktop-frontend -n sealos +``` diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-1.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-1.jpg new file mode 100644 index 00000000000..680d572141b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-1.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-2.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-2.jpg new file mode 100644 index 00000000000..8b6a354702c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/chrome-certificate-2.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-1.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-1.png new file mode 100644 index 00000000000..6e2c46692cf Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-2.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-2.jpg new file mode 100644 index 00000000000..a99aaeaf5a0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-2.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-3.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-3.jpg new file mode 100644 index 00000000000..8a42e6c08c8 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/firefox-export-certificate-3.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-1.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-1.jpg new file mode 100644 index 00000000000..3a211ccd3e1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-1.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-2.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-2.jpg new file mode 100644 index 00000000000..357d5880dbe Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-2.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-3.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-3.jpg new file mode 100644 index 00000000000..9c33c03204f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/safari-export-certificate-3.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-cost-center.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-cost-center.jpg new file mode 100644 index 00000000000..e8e59ccb870 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-cost-center.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-1.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-1.png new file mode 100644 index 00000000000..790d9cc7a3d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-2.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-2.png new file mode 100644 index 00000000000..9f04a466892 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-3.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-3.png new file mode 100644 index 00000000000..ea555c230e1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-4.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-4.png new file mode 100644 index 00000000000..d409c55ba36 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-5.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-5.png new file mode 100644 index 00000000000..3cde5ae7685 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-6.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-6.png new file mode 100644 index 00000000000..4a6ef666fb1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate.jpg new file mode 100644 index 00000000000..97dbcc274b2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate1.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate1.png new file mode 100644 index 00000000000..3f1bfaebdc2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate1.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate2.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate2.png new file mode 100644 index 00000000000..7c33e2693e9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate2.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate3.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate3.png new file mode 100644 index 00000000000..609a653a4f1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate3.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate4.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate4.png new file mode 100644 index 00000000000..6c6a20aadb7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license-activate4.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license.png b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license.png new file mode 100644 index 00000000000..aa820a06c10 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/sealos-license.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/windows-trust-certificate.jpg b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/windows-trust-certificate.jpg new file mode 100644 index 00000000000..243d0d2d558 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/images/windows-trust-certificate.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/sealos/installation.md b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/installation.md new file mode 100644 index 00000000000..c8808661e09 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/sealos/installation.md @@ -0,0 +1,434 @@ +--- +sidebar_position: 1 +toc_max_heading_level: 5 +keywords: [Sealos 集群部署, Kubernetes 安装, Sealos 私有云, Sealos Cloud, Sealos 证书] +description: 了解如何使用 Sealos 一键部署 Kubernetes 集群,支持多种安装方式,确保通信安全,适用于大规模集群和企业生产环境。 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Sealos 集群部署 + +export const Highlight = ({children, color}) => ( + + {children} + +); + +:::tip + +大规模集群以及企业生产环境强烈建议使用 [Sealos 私有云的企业版或者定制版](/self-hosting)。 + +::: + +## 准备工作 + +### 服务器 + +以下是一些基本的要求: + +- 每个集群节点应该有不同的主机名。 +- 所有节点的时间需要同步。 +- 建议使用干净的操作系统来创建集群。**不要自己装 Docker!** +- 支持大多数 Linux 发行版,例如:Ubuntu、Debian、CentOS、Rocky linux。 +- **系统内核版本在 5.4 及以上**。 +- **必须使用 root 用户安装!** + +推荐配置: + +推荐使用 Ubuntu 22.04 LTS 操作系统,内核版本在 5.4 及以上,配置如下: + +| 操作系统 | 内核版本 | CPU | 内存 | 存储 | Masters | Nodes | +|------------------|-------|-----|------|-------|---------|-------| +| Ubuntu 22.04 LTS | ≥ 5.4 | 8C | 16GB | 100GB | 奇数台 | 任意 | + +:::info注意 +Kubernetes 和 Sealos Cloud 的系统组件在每个 Master 节点上大约需要 2 核心(2c)和 2GB 内存(2g),在每个 Node 节点上则需要大约 +1 核心(1c)和 1GB 内存(1g),请确保集群中每个节点都有足够的计算资源以支持系统组件的运行。 +::: + +### 网络 + ++ 所有节点之间网络互通; ++ 需要在 Kubernetes 集群的**第一个 Master 节点**上执行脚本,目前**集群外的节点不支持集群安装**; ++ 所有节点之间可以互相通信。 + +### 域名 + ++ 需要一个域名用于访问 Sealos 及相关服务; ++ 如果您没有域名,可以使用 `nip.io` 提供的免费域名服务。 + +### 证书 + +Sealos 需要使用证书来保证通信安全,默认在您不提供证书的情况下我们会使用 [cert-manager](https://cert-manager.io/docs/) 来自动签发证书。 + +如果您能提供证书,证书需要解析下列域名 (假设您提供的域名为:cloud.example.io): + +- `*.cloud.example.io` +- `cloud.example.io` + +## 安装步骤 + +为了便于部署,我们提供了一个一键安装脚本。该脚本可以从零开始部署 Sealos 集群,也可以在已有的 Kubernetes 集群上部署 Sealos +集群(在已有集群上执行时请谨慎操作)。 + +:::info注意 + +该脚本只支持在 “使用 Sealos 安装的 Kubernetes 集群” 上部署 Sealos 集群,暂不支持其他方式部署的 Kubernetes。 + +关于如何使用 Sealos 部署 Kubernetes +集群,可以参考:[安装 Kubernetes 集群](/self-hosting/lifecycle-management/quick-start/deploy-kubernetes.md) +,支持 [Docker Hub](https://hub.docker.com/r/labring/kubernetes/tags) 中的几乎所有 Kubernetes 版本(**暂不支持 1.28 及以上版本 +**)。 + +::: + +如果您的机器还没有安装过 Kubernetes,**建议直接使用该脚本连同 Kubernetes 和 Sealos 集群一起安装。** + +根据您的域名情况,可以分为以下几种安装方式: + +### 1、无公网域名,也不想自定义域名 + +如果您没有公网域名,也不需要自定义域名,可以选择直接使用 `nip.io` 提供的免费域名服务。`nip.io` 是一个免费的通配符 DNS 服务,它可以将动态分配的 IP 地址映射到一个固定的子域名上,特别适合用于本地开发环境。具体的工作原理为: + +您可以使用任何 IP 地址作为 `nip.io` 子域名的一部分,而 `nip.io` 会将它解析回相应的 IP 地址。例如,如果你有一个内网 IP 地址 `192.168.1.10`,你可以使用 `192.168.1.10.nip.io` 作为域名,所有向这个域名发送的请求都会被解析到 `192.168.1.10` 这个 IP 地址上。这样就无需修改本地 hosts 文件,也不需要搭建内网 DNS 服务,直接通过这个域名就能访问内网服务了。 + +使用 nip.io 作为 Sealos 的域名非常简单,只需在第一个 Master 节点上执行以下命令,并根据提示输入参数: + +```bash +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ + --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ + --proxy-prefix=https://mirror.ghproxy.com +``` + +当需要你输入 Sealos Cloud 域名时,你需要输入这种格式的域名:`[ip].nip.io`,其中 [ip] 是你的 Master 节点 IP。 + +安装完成后,终端会输出 Sealos 访问域名以及用户名和密码,例如: + +```bash +Sealos cloud login info: +Cloud Version: latest +URL: https://10.214.210.102.nip.io +admin Username: admin +admin Password: sealos2023 +``` + +### 2、有公网域名,想公网访问 + +如果你有自己的公网域名,并且想通过公网访问 Sealos,那你就需要准备好公网受信任的 SSL/TLS 证书。你可以通过 acme.sh 等工具自动签发证书,也可以从域名提供商处下载免费证书或者购买商业证书。 + +:::info注意 +如果你的公网 IP 在国内,那么域名必须要备案! +::: + +准备好域名证书后,需要将证书放到第一个 Master 节点的某个目录中,例如 `/root/certs/`。 + +:::info注意 + +您还需要在域名服务商处添加一条该域名的 A 记录,地址解析到第一个 Master 节点的公网 IP 地址。同时还需要添加一条泛解析记录,将该域名的子域名也解析到第一个 Master 节点的公网 IP 地址。 + +例如 (假设你的域名是 `cloud.example.io`,假设你的 Master 节点公网地址是 `192.168.1.10`): + +```bash +cloud.example.io A 192.168.1.10 +*.cloud.example.io A 192.168.1.10 +``` + +::: + +然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: + +```bash +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ + --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ + --proxy-prefix=https://mirror.ghproxy.com \ + --cloud-domain= \ + --cert-path= \ + --key-path= +``` + ++ `` 需要替换成你自己的公网域名。 ++ `` 需要替换成你的证书位置,通常是 `.crt` 或 `.pem` 文件。例如:`/root/certs/example.crt`。 ++ `` 需要替换成你的私钥位置,通常是 `.key` 或 `.pem` 文件。例如:`/root/certs/example.key`。 + +### 3、有公网域名,想内网访问 + +如果您有自己的公网域名,但是只有内网 IP,或者只想在内网访问 Sealos,那您只需要在域名服务商处添加一条该域名的 A 记录,地址解析到第一个 Master 节点的内网 IP 地址。同时还需要添加一条泛解析记录,将该域名的子域名也解析到第一个 Master 节点的内网 IP 地址。 + +例如 (假设你的域名是 `cloud.example.io`,假设你的 Master 节点内网地址是 `192.168.1.10`): + +```bash +cloud.example.io A 192.168.1.10 +*.cloud.example.io A 192.168.1.10 +``` + +然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: + +```bash +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ + --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ + --proxy-prefix=https://mirror.ghproxy.com \ + --cloud-domain= +``` + +其中 `` 需要替换成你自己的公网域名。 + +安装过程中 Sealos 会使用 [cert-manager](https://cert-manager.io/docs/) 来自签名证书。 + +### 4、无公网域名,但想自定义域名 + +如果您没有公网域名,但是需要自定义域名,那么就需要在内网自建 DNS,然后将自定义域名解析到第一个 Master 节点的内网 IP 地址。 + +:::note + +假设您的第一个 Master 节点的内网 IP 地址为 `192.168.1.10`。假设您的域名为 `cloud.example.io`。 + +::: + +可以考虑使用 CoreDNS 来自建 DNS 服务,参考配置: + +```nginx +(global_cache) { + cache { + # [5, 60] + success 65536 3600 300 + # [1, 10] + denial 8192 600 60 + prefetch 1 60m 10% + } +} + +.:53 { + errors + health + ready + + import global_cache + + template IN A cloud.example.io { + answer "{{ .Name }} 60 IN A 192.168.1.10" + fallthrough + } + + forward . 223.5.5.5 + + log + loop + reload 6s +} +``` + +这样不管您访问 `cloud.example.io` 还是 `*.cloud.example.io` 都会解析到第一个 Master 节点的内网 IP 地址。 + +然后在第一个 Master 节点上执行以下命令,并根据提示输入参数: + +```bash +$ curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \ + --cloud-version=v5.0.0 \ + --image-registry=registry.cn-shanghai.aliyuncs.com --zh \ + --proxy-prefix=https://mirror.ghproxy.com \ + --cloud-domain= +``` + +其中 `` 需要替换成你自己的自定义域名。 + +安装过程中 Sealos 会使用 [cert-manager](https://cert-manager.io/docs/) 来自签名证书。 + +## 信任自签名证书 + +如果您选择了上面提供的安装方式中的 1 或 3 或 4,那么您的证书默认是不受浏览器信任的,当你访问 Sealos Cloud 时,浏览器会提示下面的信息: + +![](images/chrome-certificate-1.jpg) + +即使点击继续访问,进入 Sealos Cloud 之后也无法正常显示 App 图标,无法打开 App。 + +![](images/chrome-certificate-2.jpg) + +我们需要导出自签名证书,并让系统信任自签名证书。步骤如下。 + +### 导出自签名证书 + +各个浏览器导出自签名证书的步骤略有不同。以下是在一些常用浏览器中导出自签名证书的步骤: + +#### Chrome (以及基于 Chromium 的浏览器如新版 Edge 和 Brave) + +1. 在浏览器地址栏左侧点击 “不安全” 字样。 +2. 点击 “证书无效”,这将打开一个证书信息窗口。 +3. 在打开的证书窗口中,切换到 “详细信息” 标签页。 +4. 在 “详细信息” 标签页中,找到并点击 “导出”。 +5. 选择一个文件名和保存位置,然后完成导出过程。 + +#### Firefox + +1. 点击页面中的 “高级”。 + + ![](images/firefox-export-certificate-1.png) + +2. 然后点击 “查看证书”。 + + ![](images/firefox-export-certificate-2.jpg) + +3. 在证书页面中点击 “PEM (证书)”。 + + ![](images/firefox-export-certificate-3.jpg) + +#### Safari + +1. 点击页面中的 “显示详细信息”。 + + ![](images/safari-export-certificate-1.jpg) + +2. 然后点击 “查看此证书”。 + + ![](images/safari-export-certificate-2.jpg) + +3. 在证书视图中,可以看到一个带有证书链的窗口。 + + ![](images/safari-export-certificate-3.jpg) + +4. 拖动红框圈出来的证书到桌面或文件夹中,证书就会被导出了。 + +### 信任自签名证书 + +#### macOS + +在 macOS 上信任自签名证书可以使用以下命令: + +```bash +# 假设证书保存在 ~/Downloads/10.214.210.102.nip.io.cer +$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/Downloads/10.214.210.102.nip.io.cer +``` + +您也可以通过以下步骤来操作: + +##### 1、添加证书到钥匙串 + +1. 启动**钥匙串访问** (Keychain Access) 应用程序,点击左侧 “系统钥匙串” 下方的 “系统” 类别。 +2. 然后打开 “访达”,进入证书保存位置,**双击证书文件**:这通常是一个 `.cer`,`.crt`,或 `.pem` 文件。 +3. 输入您的用户名和密码以允许修改。 +4. 证书现在应该已经被添加到您的钥匙串中。 + +##### 2、信任证书 + +1. 在钥匙串访问中,从 “系统” 类别的列表中找到刚刚添加的自签名证书,并双击它。 +2. 在打开的窗口中,展开 “信任” 部分。 +3. 在 “当使用此证书时” 选项旁边,有一个下拉菜单,默认设置可能是 “使用系统默认值”。要信任证书,请改为 “始终信任”。 +4. 关闭证书信息窗口,系统可能会提示您验证您的用户名和密码,以确认更改。 +5. 现在,证书已经被标记为受信任。 + +:::info注意 + +自签名证书不由第三方证书颁发机构 (CA) 颁发,因此,其他设备也不会信任该证书。如果您是在公司或组织内部使用自签名证书,可能需要在每个需要信任此证书的设备上手动进行上述步骤。 + +::: + +#### Windows + +1. 在根证书文件点鼠标右键,选择 “安装证书”。 +2. 选择 “当前用户” 或者 “本地计算机”,下一步 +3. “将所有的证书都放入下列存储”,“浏览”,“受信任的根证书颁发机构”,“确定”,下一步。 +4. 完成,“是”,确定。 + +![](images/windows-trust-certificate.jpg) + +#### Linux + +Linux 不同发行版更新根证书存储的命令不一样,用来保存私有证书的路径也不一样。需要先复制自签名 CA 证书到特定路径,再运行命令更新根证书存储。 + + + + + ```bash + # Debian/Ubuntu/Gentoo + # - 安装 + $ sudo cp root_ca.crt /usr/local/share/ca-certificates/root_ca.crt + # update-ca-certificates 会添加 /etc/ca-certificates.conf 配置文件中指定的证书 + # 另外所有 /usr/local/share/ca-certificates/*.crt 会被列为隐式信任 + $ sudo update-ca-certificates + + # - 删除 + $ sudo rm /usr/local/share/ca-certificates/root_ca.crt + $ sudo update-ca-certificates --fresh + ``` + + + + + ```bash + # CentOS/Fedora/RHEL + $ yum install ca-certificates + # 启用动态 CA 配置功能: + $ update-ca-trust force-enable + $ cp root_ca.crt /etc/pki/ca-trust/source/anchors/ + $ update-ca-trust + ``` + + + + + ```bash + # Alpine + $ apk update && apk add --no-cache ca-certificates + $ cp root_ca.crt /usr/local/share/ca-certificates/ + $ update-ca-certificates + ``` + + + + + ```bash + # OpenSUSE/SLES + $ cp root_ca.crt /etc/pki/trust/anchors/ + $ update-ca-certificates + ``` + + + + +## 激活集群 + +集群安装完成后,需要激活集群,步骤如下: + +1. 首先点击桌面的「许可证」打开许可证应用: + + ![](images/sealos-license-1.png) + +2. 然后点击出现的页面左侧的「激活/购买」: + + ![](images/sealos-license-2.png) + + 然后浏览器会跳转到 License 页面: + + ![](images/sealos-license-3.png) + +3. 如果你还没有在该页面创建过集群,就点击左上角-价格-获取,立即开始创建一个集群;如果你已经创建过集群了,只需要点击「我的集群」便会跳转到已有集群。 + +4. 新购买一个集群后,点进进入会看到新购买的集群显示-未激活: + + ![](images/sealos-license-4.png) + + 点击集群管理,在集群激活处输入一个集群id(自取,不能和他人重复),输入完成后点击激活即可成功激活集群。 + + ![](images/sealos-license-5.png) + + 5.成功激活集群后,集群管理的右侧会出现License管理选项,点击进入,在License列表下面导出License: + + ![](images/sealos-license-6.png) + +6.导出License后,回到 Sealos 集群的「许可证」应用界面,点击「上传 License 文件」: + + ![](images/sealos-license-activate4.png) + +选择刚刚下载的 License 文件进行上传,然后点击右下角的「激活 License」,便可激活 License。 + + ![](images/sealos-cost-center.jpg) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/billing-system.md b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/billing-system.md new file mode 100644 index 00000000000..7d7599a7613 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/billing-system.md @@ -0,0 +1,173 @@ +--- +keywords: [计费系统, Sealos, 公有云, 账户管理, 资源计量, CockroachDB, MongoDB, 充值流程, 用户状态, 账单管理] +description: 了解Sealos计费系统的设计与实现,包括资源计量、账户管理、扣费与账单、暂停与恢复以及充值流程,确保用户轻松管理云服务费用。 +--- + +# 计费系统 + +# 概述 + +计费一直是公有云的服务痛点之一。Sealos +以简单,弹性为设计理念,自然也不想在计费系统上过多的增加用户的心智负担,因此计费系统采取按量计费的方式,通过尽可能的缩小计费品类,为用户带来更低的价格与更容易理解的方式。并通过完备详细的账单系统使用户能及时清晰的看到自己旗下各项类目的消费情况。 + +# 系统架构 + +## 系统组成 + +与其他系统的设计类似,Sealos 的计费系统由一系列的 CRD 与他们所对应的 Controller +为组成。按照计费的流程可以大致分为计量与计费系统两部分。计量系统主要负责计算用户各项资源具体用量,并交由计费系统,计费系统按照用量进行费用的计算与扣减,并根据用户余额执行停机/恢复等操作。同时计费系统还管理用户的账户信息,并处理用户充值流程。 + +## 持久化设计 + +由于 Sealos 存在多个可用区,因此无法使用一套数据源来完成所有功能。 + +计量系统存在数据及时性与复杂的结构,不适合使用持久化数据库存储,因此采用 MongoDB 存储在每个可用区中,并定时清楚。 + +而用户的账户,账单等关键数据则使用 CockroachDB 这种分布式关系型数据库,在不同的可用区之间分片存储并进行数据同步,并永久保存。 + +# 计量 + +## 设计 + +计量系统采用 Controller 执行定时任务的方式。具体工作流程为: + +- 定时(当前为1min)轮询所有用户资源 +- 把轮询的结果存入数据库 + +按照用户系统的设计,每个用户都有专属的命名空间,所以计量系统的是以命名空间为单位进行统计。 + +## 实现 + +计量系统代码位于 Sealos/controllers/resoucers.主要使用一个类 CRD 的 Controller 实现.即使用 Kuberbuilder 生成代码后,不使用其给出的 +Reconcile 方法,而是修改其生成的方法和main函数逻辑的方式实现。 + +main 函数的主要逻辑可以总结为:创建一个 Reconciler 对象,并调用 Reconciler 对象的 StartReconciler() 方法。 + +在 StartReconciler() 中,使用 ticker 创建了一个一个每分钟执行一次的定时任务。 + +该任务的执行逻辑大体如下: + +- 获取所有的命名空间 +- 对于每个命名空间,启动一个 goroutine 进行计费,使用 WaitGroup 同步。 +- 获取Pod资源:CPU,内存 +- 获取PVC资源 +- 获取数据库资源 +- 获取端口资源 +- 获取对象存储资源 +- 组装整体对象,调用数据库接口存入数据库 + +# 计费 + +## 设计 + +计费系统以计量系统为基础,采用定时任务与监听 CR 变化相结合的方式。 + +## 实现 + +### 账户 + +用户账户主要通过名为 account 的 CR 进行管理。代码位于 Sealos/account/account_controller + +当用户创建新的账户时,account controller会使用 syncAccount 为其创建新的 account,并完成分配配额等操作。 + +账户持久化的结构体如下: + +``` +type Account struct { + UserUID uuid.UUID `gorm:"column:userUid;type:uuid;default:gen_random_uuid();primary_key"` + ActivityBonus int64 `gorm:"column:activityBonus;type:bigint;not null"` + EncryptBalance string `gorm:"column:encryptBalance;type:text;not null"` + EncryptDeductionBalance string `gorm:"column:encryptDeductionBalance;type:text;not null"` + CreatedAt time.Time `gorm:"type:timestamp(3) with time zone;default:current_timestamp()"` + CreateRegionID string `gorm:"type:text;not null"` + Balance int64 + DeductionBalance int64 +} +``` + +其中,EncryptBalance 代表全部的历史充值金额,一定程度上反映了用户的信誉程度,EncryptDeductionBalance代表全部的历史扣费金额,均以加密字符串的密文形式存储。 + +Balance 为用户余额,使用明文存储。当余额与两个金额的差值出现不一致的时候,以更安全的差值为准。 + +## 扣费与账单 + +扣费主要由 Sealos/account/billing_controller 负责。这个 controller 没有对应的 CR,其修改的方式其主要是通过 uesr +crd.当前其主要逻辑为: + +- 以小时为单位,轮询 Mongodb 获取数据 +- 计算账单 +- 扣减用户费用,此处即为新增 EncryptDeductionBalance,同时更新 Balance + +扣费完成之后生成以小时为单位的账单数据,通过 billinginfoquery 和 billingrecordquery 两个 CRD 进行管理,提供给用户查询账单的各种接口。 + +## 暂停与恢复 + +### 状态转换 + +当 billing 扣费后,debt_controller 会检测用户的账户余额,并根据当前状态和余额的不同执行不同的操作。 + +用户一共有五个状态: + +- 正常期:账户余额大于等于0 +- 预警期:账户余额小于0时,且超时超过 WarningPeriodSeconds (default is 0 day) +- 临近删除期:账户余额小于0,且上次更新时间超过 ApproachingDeletionPeriodSeconds (default is 4 days +- 即刻删除期:账户余额小于0,且上次更新时间超过 ImmediateDeletePeriodSeconds (default is 3 days) +- 最终删除期:账户余额小于0,且上次更新时间超过 FinalDeletePeriodSeconds (default is 7 days) + +这些状态之间的转移方式大致如下: + +当用户处于正常期,且余额大于0,则不进行任何操作,若余额小于0,则进入预警期。 + +当用户处于预警期,且余额大于0,则返回进入正常期,若余额依然小于0,则判断当前时间,欠费额度与全部历史充值金额的关系,若上次更新时间小于临近删除时间, +且欠费小于历史充值金额的一半,则维持预警期不变,否则进入临近删除期,并向用户发送临近删除的通知。 + +当用户处于临近删除期,且余额大于0,则返回进入正常期,若余额依然小于0,则判断则判断当前时间,欠费额度与全部历史充值金额的关系,若上次更新时间小于临近删除时间, +且欠费小于历史充值金额,则维持临近删除期不变,否则进入即刻删除期,此时暂停用户的资源,并向用户发送即刻删除期的通知。 + +当用户处于即刻删除期,且余额大于0,则返回进入正常期,若余额依然小于0,则判断则判断当前时间,若上次更新时间小于临近删除时间, +则维持即刻删除期不变,否则进入最终删除期,并向用户发送最终删除期的通知。 + +当用户处于最终删除期,且余额大于0,则返回进入正常期。 + +### 实现 + +修改用户的状态通过 SuspendUserResource() 方法,这个方法本质上是通过修改 NameSpace 资源,然后触发 NameSpace CR 的controller +实现。 + +namespcace controller 位于 Sealos/controller/namespcae_controller 中,本质上,是通过一个管道执行一系列函数实现: + +``` +pipelines := []func(context.Context, string) error{ + //r.suspendKBCluster, + r.suspendOrphanPod, + r.limitResourceQuotaCreate, + r.deleteControlledPod, + //TODO how to suspend infra cr or delete infra cr + //r.suspendInfraResources, + r.suspendObjectStorage, + } +``` + +其中,suspendOrphanPod() 方法核心逻辑是使用自建的调度器调度 pod,工作流程如下: + +- 深拷贝原pod +- 修改原pod属性:将调度器修改为自定义的调度器 +- 重新创建pod + +通过这种方式可以保护部分 Pod 不被Kuberrnetes 自带的调度器删除,而可以只删除 Deployment 等资源。 + +limitResourceQuotaCreate() +方法通过为用户的命名空间添加新的,全部用量都为0的配额来限制用户创建新的资源,当用户创建新的命名空间时,会默认为其分配一定的配额,而命名空间中资源的使用必须符合所有的配额类型,所以此时用户就无法再创建任何全新的资源了。 + +deleteControlledPod() 是删除控制 Pod 的具体 Pod + +suspendObjectStorage()方法用于处理对象存储的相关操作 + +## 充值 + +充值功能通过 payment_controller 实现, + +具体的工作流程为: + +用户发起充值请求,前端调用 payment_controller 生成订单CR返回给前端,用户进行支付,同时 account_controller +轮询查询订单支付状态的接口,当判断到用户充值成功了之后,调用数据库接口为用户增加 EncryptBalance ,同时更新 Balance。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_dark.png b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_dark.png new file mode 100644 index 00000000000..403e9223d16 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_dark.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_light.png b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_light.png new file mode 100644 index 00000000000..500f67bbe58 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/application_light.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_dark.png b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_dark.png new file mode 100644 index 00000000000..6d14555ef4d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_dark.png differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_light.png b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_light.png new file mode 100644 index 00000000000..17bf8cf5d6a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/architecture_light.png differ diff --git "a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" "b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" new file mode 100644 index 00000000000..44b16d80d80 Binary files /dev/null and "b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\224\250\346\210\267-1.png" differ diff --git "a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" "b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" new file mode 100644 index 00000000000..08124bf3e46 Binary files /dev/null and "b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/images/\347\233\221\346\216\247-1.png" differ diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/monitor-system.md b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/monitor-system.md new file mode 100644 index 00000000000..c3df044f870 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/monitor-system.md @@ -0,0 +1,49 @@ +--- +keywords: [监控系统, 告警系统, VictoriaMetrics, Grafana, PrometheusAlert, Loki, 日志系统, 公有云服务, 系统设计, 高可用] +description: 了解如何使用VictoriaMetrics和Grafana构建高效的监控与告警系统,结合PrometheusAlert和Loki实现日志收集与展示,提升公有云服务的稳定性与可用性。 +--- + +# 监控与告警系统 + +# 概述 + +监控与告警系统是公有云服务中非常重要的一部分,本身 Sealos 的设计已经可以将运维人员的心智负担大大降低,通过搭建良好的监控与告警系统可以进一步提升系统的稳定性与可用性。 + +根据收集的指标来区分,整个系统可以分为两部分,一部分是面向系统实时 Metrics 的监控和告警,而另一部分主要包括日志系统的收集,聚合,展示。 + +# 监控 + +## 设计 + +监控系统整体采用 [ VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics),其相较于 Prometheus 的优势主要在于: + +- 同时支持推模型和拉模型,采集数据量更高,消耗内存更小 +- 原生支持高可用 +- 兼容 PromQL + +数据可视化工具使用 Grafana,在 Sealos 的每个可用区都分别部署一套 VictoriaMetrics+Grafana,分别监控。 + +# 告警 + +## 设计 + +告警系统设计思路主要是通过监控系统监控数据,当发现异常数据的时候,发送消息给消息处理中间层,这个中间层再把消息转发到相应的 +app 群聊。: + +![Application](./images/监控-1.png) + +## 实现 + +选择开源项目 [PrometheusAlert](https://github.com/feiyu563/PrometheusAlert) 作为转发系统,使用 Grafana 发出告警信息到 +PrometheusAlert ,在由其转发到飞书,微信等平台。 + +与监控系统一样,告警系统同样是每个可用区部署一套,分别进行告警。 + +# 日志 + +### 设计 + +日志系统采用 [Loki](https://github.com/grafana/loki) 实现。Loki 是一个水平可扩展,高可用性的日志聚合系统,对比起 ELK ,Loki +并不会存储大量的索引文件以提供全文检索的功能,因此比较轻量。 + +使用 Grafana,从 Loki 获取数据,完成日志的查询和展示。每个可用区部署一套。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-application.md b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-application.md new file mode 100644 index 00000000000..fb13e936d62 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-application.md @@ -0,0 +1,97 @@ +--- +keywords: [Sealos系统应用, Kubernetes API, CRD API, 应用管理, 费用中心, 定时任务, 数据库, KubePanel, 对象存储, 应用商店] +description: 了解Sealos系统应用的基本原理与实现,包括Kubernetes API、CRD API、应用管理、费用中心、定时任务、数据库、KubePanel等。 +--- + +# 系统应用 + +主要介绍 Sealos 当前各个系统应用的基本原理与实现。 + +## 系统桌面 + +组成:前端系统+Kubernetes API+Kubernetes CRD API+数据库API+其他API + +整个系统的入口,处理主界面上用户数据的展示与相关交互逻辑。 + +部署在桌面上的每个应用都单独存在并前后端分离部署。 + +## 应用管理 + +组成:前端系统+Kubernetes API + +用于管理用户自定义的应用,本质上是吧用户在 GUI 上的命令映射成yml文件(主要是deployment,service等文件),交给Kubernetes执行。 + +## 费用中心 + +组成:前端系统 + Kubernetes CRD API + +前端页面为用户展示各种收费标准,调用 CRD API,CRD controller再调用后端一个单独的程序提供数据库查询接口,返回用户账单信息。 + +## 定时任务 + +组成:前端系统+Kubernetes API + +用户管理 Kbernetes 原生 CronJob 资源,逻辑与应用管理基本相同。 + +## 数据库 + +组成:前端系统+数据库 API+Kubernetes CRD API(Kube Blocks) + +数据库底层使用开源项目 Kube Blocks 实现,其使用了一系列的CRD来帮助用户完成数据库部署的过程。前端需要跟这些CRD的API交互。 + +用户系统的维护则在小强数据库中,使用API提供服务。 + +## KubePanel + +组成:前端系统+Kubernetes API + +用户对特定 Namespace 下的各项资源进行管理,直接调用 Kubernetes 提供的api即可完成。 + +## 对象存储 + +组成:前端系统+Kubernetes CRD API + +底层使用 minio,并使用两个crd维护关系,objectstorageuser_controller 用于维护存储账户与命名空间的关系,并处理限流等逻辑。 + +objectstoragebucket_controller 维护存储桶和存储账户之间的关系。 + +## 云开发 + +一个单独的应用链接,点击直接跳转到云开发应用。 + +## 文档中心 + +一个单独的应用链接,点击直接跳转到官方文档。 + +## 应用商店 + +组成:前端系统 + +应用的名称,种类等信息维护在 Github 的一个仓库中,前端直接拉取仓库中的数据并展示。 + +## 终端 + +组成:前端系统+Kubernetes CRD API + +具体实现可以概括为前端应用调用 API,然后 controller创建一套新的 pod/deployment/ingress等资源,并建立一个 +websocket返回给前端,后续使用这个 websocket进行通信。 + +## 工单 + +组成:前端系统+数据库API + +单独维护自己的用户系统,用户信息存储在单独的 Mongodb中,用户上传的文件存储到 minio中。 + +## fastgpt + +一个单独的应用链接,点击直接跳转到fastgpt应用。 + +## 邀请链接 + +组成:前端系统 + +展示邀请情况 + +## 私有云 + +一个单独的链接,点击直接跳转到一个问卷调查。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-architecture.md b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-architecture.md new file mode 100644 index 00000000000..5eeae528a45 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/system-architecture.md @@ -0,0 +1,40 @@ +--- +keywords: [Sealos, Kubernetes云操作系统, 应用架构, 前后端分离, Kubernetes API] +description: Sealos 是基于 Kubernetes 的云操作系统,采用前后端分离架构,简化用户操作,提供专业高效的工具,满足不同需求。 +--- + +# 系统架构 + +## 设计哲学 + +Sealos 的目的是打造基于 Kubernetes 的云操作系统,在系统与普通用户的交互过程中尽可能多的向用户屏蔽掉 Kubernetes +的复杂性,使这部分功能尽可能的简单。同时对于具有专业知识的云计算领域人员,Sealos 又期望提供专业高效的工具使其完成工作。 + +基于这个目标,Sealos 提出了**"一切皆应用"** +的设计理念。把每个功能抽象成一个个独立又可以相互配合的应用,不同需求和目的的人员操作不同的应用完成不同的功能。尽可能的与用户在使用单机操作系统时的体验保持一致。 + +## 整体架构 + +Sealos 整体架构图如下: + +![Architecture](./images/architecture_light.png#gh-light-mode-only) + +![Architecture](./images/architecture_dark.png#gh-dark-mode-only) + +因此我们可以说,**Sealos = Kubernets + 一系列应用** + +## 应用架构 + +Sealos 上的应用采用前后端分离的架构,同时前端能够提供 `SSR` 能力,使得应用也可以单独对外提供服务,而不需要绑定在 Sealos 单 + +体上。 + +应用架构以及交互情况:(以App Launchpad 与 Terminal 应用与其交互为例子) + +![Application](./images/application_light.png#gh-light-mode-only)![Application](./images/application_dark.png#gh-dark-mode-only) + +每个应用都的前端系统会调用诸多不同的接口,调用 Kubernetes 原生 API 以实现一些简单的逻辑,调用 Kubernetes CRD API +实现复杂的逻辑,调用多种不同的数据库 API 持久化和获取数据,还会调用一些部署在集群内的特殊应用提供的 API 实现一些特殊的逻辑。 + +因此我们可以说,**Sealos = Kubernets + 一系列应用 = 一系列的 "前端系统 + Kubernetes API + Kubernetes CRD API + Database +API+ Service API"**。 diff --git a/docs/5.0/i18n/zh-Hans/developer-guide/system-design/user-system.md b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/user-system.md new file mode 100644 index 00000000000..9ea6266989a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/developer-guide/system-design/user-system.md @@ -0,0 +1,83 @@ +--- +keywords: [Kubernetes用户管理, Sealos用户系统, 命名空间隔离, CockroachDB, RBAC授权] +description: 了解Sealos如何通过Kubernetes用户管理系统实现高效隔离,使用CockroachDB持久化数据,并基于RBAC模式进行用户授权。 +--- + +# 用户系统 + +## 概述 + +Sealos 通过在公有云中,让多个用户共享一个 Kubernetes 集群的方式最大程度的调度了服务器的性能,而用户体系的设计就是为此服务,在满足隔离性要求的基础上,尽可能以简单,容易理解的实现满足需求。 + +## 用户设计 + +Kubernetes 本身不具备原生的用户管理系统,而 Sealos 使用名为 User 的 CR 来代表用户在不同可用区的权限等信息。而用户的姓名,手机号等信息则持久化在数据库中。 + +### 持久化设计 + +由于 Sealos 存在多个可用区,因此无法使用一套数据源来完成所有功能。 + +因此采用 CockroachDB 这种分布式关系型数据库存储在不同可用区之间保持一致的用户信息。 + +## 用户与命名空间 + +命名空间是 Kubernetes 中优秀的隔离资源机制,Sealos 基于命名空间打造了用户之间的隔离机制。 + +每当一个新的用户创建时,Sealos 会为其创建一个新的命名空间,称为个人空间,这个空间与用户绑定,用户拥有其最高的权限,当其用户注销的时候个人空间就会销毁。 + +Sealos 还提供了工作空间机制,每个用户可以创建自己的新工作空间,并可以邀请别人进入。 + +这样,就形成了用户与命名空间的多对多关系,即一个用户可以在多个命名空间中,一个命名空间内也可以有多个用户。 + +![Application](./images/用户-1.png) + +## 授权 + +Sealos 基于 Kubernetes 的 RBAC 模式实现用户授权。 + +当用户创建一个命名空间(包括新建用户时创建的个人空间)时,控制器会在这个新创建的命名空间下创建三个 Role 资源,对应三个角色。同时创建一个 +RoleBinding 资源将这个命名空间的 Owner 授予该用户。 + +同理,当用户拉其他人进入工作空间时,控制器会创建新的 RoleBinding 资源,将权限授予对应的用户。 + +## 认证 + +针对系统外部用户与内部 Pod,Kubernetes 提供了两种认证对象:Normal User 与 Service Account.而由于公有云上 + +用户的操作都在系统内部的 Pod 上执行,所以 Sealos 采用 Service Account 的方式实现用户认证。 + +当创建新用户时,系统会为其创建 Service Account,然后将 Service Account Token 导入进 Kubeconfig 中。 + +当用户访问各个应用程序时,系统会从用户的 Kubeconfig 中获取到 Token,然后挂载到启动的访问容器中,从而完成用户认证。 + +## 隔离 + +Sealos 除了在 Kubernetes 层面使用命名空间做了用户隔离,还在其他多方面实现了底层隔离。 + +如使用 OpenEBS 进行存储的块级别隔离,Firecracker 以及 Cloud Hypervisor 用于计算运行时的隔离,以及通过 Cilium +实现网络隔离等等。这些措施确保即使在共享环境中,每个租户的操作也不会影响到其他租户。 + +## 实现 + +用户系统主要代码放在 Sealos/controllers/user 部分,包含自定义资源的定义与控制器。整体采用 KubeBuilder 生成。 + +用户创建等操作相关的主要逻辑放在 user/controllers/user_controller 部分。其 Reconcile 方法的核心流程如下,由一系列函数组成: + +``` +pipelines := []func(ctx context.Context, user *userv1.User) context.Context{ + r.initStatus, + r.syncNamespace, #处理命名空间 + r.syncServiceAccount, #处理SA + r.syncServiceAccountSecrets, #处理SAS + r.syncKubeConfig, #处理kubeconfig + r.syncRole, #处理用户角色 + r.syncRoleBinding, #处理RoleBinding + r.syncFinalStatus, +} + +for _, fn := range pipelines { + ctx = fn(ctx, user) +} +``` + +而 operationrequest_controller 主要处理工作空间的相关逻辑。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/images/overview-1.png b/docs/5.0/i18n/zh-Hans/images/overview-1.png new file mode 100644 index 00000000000..af1a5bfadae Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/images/overview-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/images/overview-2.jpeg b/docs/5.0/i18n/zh-Hans/images/overview-2.jpeg new file mode 100644 index 00000000000..dc2a48c6c65 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/images/overview-2.jpeg differ diff --git a/docs/5.0/i18n/zh-Hans/images/sealos-desktop-zh.webp b/docs/5.0/i18n/zh-Hans/images/sealos-desktop-zh.webp new file mode 100644 index 00000000000..b82a41f1c54 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/images/sealos-desktop-zh.webp differ diff --git a/docs/5.0/i18n/zh-Hans/images/sealos-qr-code.jpg b/docs/5.0/i18n/zh-Hans/images/sealos-qr-code.jpg new file mode 100644 index 00000000000..506286e82d7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/images/sealos-qr-code.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/msa/privacy-policy.md b/docs/5.0/i18n/zh-Hans/msa/privacy-policy.md new file mode 100644 index 00000000000..2cb3d8d9540 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/msa/privacy-policy.md @@ -0,0 +1,58 @@ +# Sealos 云服务隐私政策 + +我们非常重视您的隐私保护,在您使用本服务时,我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。 + +**信息收集** + +1. 在您注册或使用本服务时,我们可能收集您的姓名、电话号码、电子邮件地址、地址等个人信息。 +2. 在您使用本服务过程中产生的信息,如操作日志、访问IP地址、设备型号等。 +3. 我们可能会通过 Cookies 或其他技术收集和存储您访问本服务的相关信息,以便为您提供更好的用户体验。 + +**信息使用** + +1. 我们会根据法律法规规定以及与用户之间的约定来处理用户的个人信息。 +2. 我们可能会将收集到的信息用于改进服务质量、开发新产品或功能等目的。 +3. 我们可能会将收集到的信息用于向您推送与本服务相关的通知或广告。 + +**信息披露** + +1. 我们不会向任何第三方披露您的个人信息,除非: + + 1. 您事先同意; + + 2. 法律法规要求; + + 3. 为维护我们或其他用户的合法权益。 + +2. 我们可能与关联公司、合作伙伴分享您的个人信息,但我们会采取相应的保密措施,确保信息安全。 + +**信息保护** + +1. 我们采取各种安全措施,包括加密、访问控制等技术手段,以保护您的个人信息免受未经授权的访问、使用或泄露。 +2. 我们会定期对收集、存储和处理的个人信息进行安全评估,以确保个人信息安全。 +3. 在发生个人信息泄露等安全事件时,我们会立即启动应急预案,并在法律法规规定的范围内向您及时告知。 + +**用户权利** + +1. 您有权随时查阅、更正或删除您的个人信息。 +2. 您有权拒绝我们收集您的个人信息,但这可能导致您无法使用本服务的部分功能。 +3. 您有权要求我们停止处理您的个人信息,但这可能导致您无法继续使用本服务。 + +**隐私政策更新** + +1. 我们可能会对本隐私政策进行修改。如本隐私政策发生变更,我们将在本服务页面上发布修改后的隐私政策。如您继续使用本服务,则视为同意修改后的隐私政策。 +2. 我们鼓励您定期查阅本隐私政策,以了解我们如何保护您的个人信息。 + +**未成年人保护** + +我们非常重视对未成年人个人信息的保护,如您为未成年人,请在监护人指导下使用本服务,并请监护人帮助您在使用本服务过程中正确处理个人信息。 + +**跨境数据传输** + +由于我们的服务器可能位于不同国家或地区,您同意我们可能需要将您的个人信息传输至其他国家或地区,并在该等国家或地区存储和处理以向您提供服务。我们会采取适当措施确保跨境传输的数据仍然受到适当保护。 + +**联系我们** + +1. 如您对本隐私政策有任何疑问、建议或投诉,请通过以下方式与我们联系(微信): + [fangnux] +2. 我们将尽快回复并解决您提出的问题。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/msa/terms-of-service.md b/docs/5.0/i18n/zh-Hans/msa/terms-of-service.md new file mode 100644 index 00000000000..d3970c9ea33 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/msa/terms-of-service.md @@ -0,0 +1,64 @@ +# Sealos 云服务服务协议 + +Sealos 云服务服务协议是您与珠海环界云计算有限公司(以下简称“我们”或“本公司”)之间就云服务(以下简称“本服务”)的使用等相关事项所订立的协议。请您仔细阅读并充分理解本协议各条款,特别是免除或者限制我们责任的条款、对您权益的限制条款、争议解决和法律适用条款等。如您不同意本协议任一内容,请勿注册或使用本服务。 + +**第1条 服务内容** + +1. 我们将向您提供存储、计算、网络传输等基于互联网的信息技术服务。 +2. 我们将为您提供相关技术支持和客户服务,帮助您更好地使用本服务。 +3. 您同意我们有权自行决定变更、中断、终止或暂停本服务的全部或部分功能,且无需对您承担任何责任。 + +**第2条 用户注册与账户管理** + +1. 您在使用本服务前需要注册一个账户。您保证在注册时提供的信息真实、准确、完整,并及时更新。 +2. 您应妥善保管账户名和密码,对由此产生的全部行为负责。如发现他人使用您的账户,应立即通知我们。 +3. 我们有权对您的账户进行审查,如发现您的账户存在异常情况,我们有权暂停或终止向您提供服务。 + +**第3条 使用规则** + +1. 您不得利用本服务从事任何违法活动或侵犯他人合法权益的行为,包括但不限于侵犯知识产权、泄露他人商业机密等。 +2. 您不得通过任何手段恶意注册账户,包括但不限于以牟利、炒作、套现等目的。 +3. 您不得利用本服务传播任何违法、有害、恶意软件等信息。 +4. 您应遵守相关法律法规及本协议的规定,对在本服务中发布的信息及使用本服务所产生的结果承担全部责任。 + +**第4条 费用及支付** + +1. 您同意支付与本服务相关的费用,具体费用标准以我们公布的价格为准。 +2. 我们可能会根据市场情况调整费用标准,并提前通知您。您如继续使用本服务,则视为同意调整后的费用标准。 +3. 如您未按时支付费用,我们有权暂停或终止向您提供本服务,并保留追讨欠款及要求赔偿的权利。 + +**第5条 服务免责与责任限制** + +1. 本服务按照现有技术和条件所能达到的水平提供。我们不能保证本服务无故障、安全完全可靠或满足您的所有需求。 +2. 如因不可抗力导致本服务发生故障或无法正常使用,我们不承担责任。 +3. 对于因您自身原因导致的数据丢失、损坏等情况,我们不承担责任。 + +**第6条 隐私政策** + +您同意接受并遵守我们制定的隐私政策。隐私政策为本协议的一部分,具体内容请参见下文“隐私政策”。 + +**第7条 知识产权** + +1. 我们对本服务及相关软件、技术、文档等拥有全部知识产权,除非经我们明确许可,您不得进行复制、分发、出租、反向工程等行为。 +2. 您在使用本服务过程中产生的数据和内容(包括但不限于文件、图片等)之知识产权归您所有,但为了向您提供服务,您同意授权我们在必要范围内对其进行存储、备份等操作。 + +**第8条 协议终止** + +1. 如您违反本协议规定,我们有权立即终止向您提供服务,并保留追究法律责任的权利。 +2. 如您决定停止使用本服务,可以申请注销账户,本协议自账户注销之日起终止。 + +**第9条 争议解决和法律适用** + +1. 本协议的签订、履行、解释和争议解决均适用中华人民共和国法律。 +2. 若您与我们发生争议,应先友好协商解决;协商不成的,任何一方均有权将争议提交至有管辖权的人民法院诉讼解决。 + +**第10条 网络安全** + +1. 如果利用平台服务提供违反国家法律的服务,您需要自行承担后果。 +2. 您对外提供的服务需要做好监管职责,如有用户在您的服务上从事违反国家法律的行为,您需自行承担后果。 +3. 我们如果发现您存在违法行为,将会对相关部门发起诉讼,并为有关部门提供证据。 + +**第11条 其他条款** + +1. 如本协议中部分条款因违反法律法规而被视为无效,不影响其他条款的效力。 +2. 本公司保留对本协议及隐私政策的最终解释权。如您对本协议或隐私政策有任何疑问,请联系我们。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos1.png new file mode 100644 index 00000000000..7313d36f548 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos2.png new file mode 100644 index 00000000000..32f0fb67f31 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/imgs/sealos2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md new file mode 100644 index 00000000000..22ad21b787a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/ai-applications/install-fastgpt-on-desktop.md @@ -0,0 +1,20 @@ +--- +keywords: [FastGpt AI知识库, Sealos部署, 无服务器AI应用, 快速安装AI, 一键部署AI, 免费AI知识库, AI应用教程] +description: 了解如何快速安装FastGpt AI知识库,无需服务器、域名或特殊网络。通过Sealos一键部署,轻松搭建您的AI知识库系统,适合初学者和专业人士。 +--- + +# 快速安装 FastGpt AI 知识库 + +无需服务器、无需魔法、无需域名,点击即可部署 👇 + +[![](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) + +由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。 + +![](./imgs/sealos1.png) + +## 运行 + +点击 sealos 提供的【外网地址】即可使用。登录用户名为: root,密码是刚设置的环境变量,上图中设置了: 1234 + +![](./imgs/sealos2.png) diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/baas/install-fireboom.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/baas/install-fireboom.md new file mode 100644 index 00000000000..b555d3b885e --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/baas/install-fireboom.md @@ -0,0 +1,109 @@ +--- +keywords: [Fireboom安装, 可视化API开发, Sealos部署, 声明式开发框架, 快速接口开发, 前端全栈, 应用管理, 控制面板配置] +description: 学习如何在Sealos上快速安装Fireboom,一个面向开发者的可视化API开发平台。本教程涵盖从创建应用到配置和访问Fireboom的全过程,助您提升开发效率。 +--- + +# 快速安装 Fireboom + +[Fireboom](https://fireboom.io) ⾯向开发者的可视化 API 开发平台,为开发者提供**声明式开发框架**、**可视化编辑套件**和**钩子机制 +**。 + +![fireboom introduction](../images/fireboom/fireboom-intro.jpeg) + +官网地址: https://fireboom.io + +**功能特性** + +- 分钟级交付: 将传统模式下 2天才能完成的接⼝缩短⾄ 2分钟 + +- 前端变全栈: 可视化开发,显著降低接⼝开发⻔槛,让前端搞定前后端秒变全栈 + +- 后端不搬砖: 声明式编程,避免复制粘贴,减少bug概率,让后端专注于业务开发 + +## 步骤 1:新建应用 + +- 在 [Sealos](https://cloud.sealos.io) 桌面环境中打开 「应用管理」 应用 + +![](../images/appsmith-1.png) + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](../images/appsmith-2.png) + +## 步骤 2:应用部署 + +- 基础配置: + + - 应用名称(自定义):fireboom + + - 镜像名(默认最新版本):fireboomapi/fireboom_server:latest + + - CPU(推荐):2 Core ( 最低1 Core) + + - 内存(推荐):4 G (最低 512 M) + +- 部署模式: + + - 实例数(自定义):1 + +![](../images/fireboom/2-1.png) + +- 网络配置: + + - 控制面板:9123 + - API端点:9991,开启外网 + +![](../images/fireboom/2-2.png) + +- 高级配置: + + - 命令设置: + - 参数设置: dev (dev表示开发模式,start表示生产模式) + + - 持久化存储: + + - 元数据:/fbserver/store + - 上传文件:/fbserver/upload + +![](../images/fireboom/2-3.png) + +## 步骤 3:部署应用 + +1, 点击「部署应用」开始部署应用。 + +![](../images/fireboom/3-1.png) + +2, 点击「详情」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 + +![](../images/fireboom/3-2.png) + +## 步骤 4:访问应用 + +- 访问控制面板:9123对应的域名 + +![](../images/fireboom/4-1.png) + +- 访问API端点:9991对应的域名 + +``` +status ok +``` + +## 步骤 5:配置Fireboom(可选) + +设置后,可方便使用swagger文档~ + +1, 查看API外网地址: 设置-> 系统 + +![](../images/fireboom/5-1.png) + +2, 修改为:API端点地址,9991对应的公网地址 + + - 静态值:选择静态值,设置为 **API端点** 公网域名 + - 环境变量:前往 环境变量 ,找到 FB_API_PUBLIC_URL 设置为 **API端点** 公网域名 + +![](../images/fireboom/5-2.png) + +3, 使用swagger文档测试API + +![](../images/fireboom/5-3.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-halo.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-halo.md new file mode 100644 index 00000000000..45124678510 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-halo.md @@ -0,0 +1,148 @@ +--- +sidebar_position: 2 +keywords: [Halo博客平台, Sealos部署, PostgreSQL数据库, 快速安装, 环境变量配置, 外网访问, 应用管理, 开源建站工具] +description: 本文详细介绍如何在Sealos上快速部署Halo博客平台,包括PostgreSQL数据库配置、应用部署步骤、环境变量设置等,助您轻松搭建个人博客系统。 +--- + +# 快速安装 Halo + +在 Sealos 上快速部署 Halo 博客平台 + +![](../images/halo_img-1.png) + +[Halo](https://github.com/halo-dev/halo) 是一款强大易用的开源建站工具,本文将介绍如何在 Sealos 上部署 +Halo,同时在 [Sealos 上部署 PostgreSQL](../../quick-start/install-db-with-database.md) 可以帮助你轻松地管理和维护数据库,以满足不同的业务需求。 + +## 步骤 1:准备 PostgreSQL + +### 使用 Sealos 数据库安装 PostgreSQL + +参考 [Sealos 上部署 PostgreSQL](../../quick-start/install-db-with-database.md) ,一分钟即可成功安装和使用 PostgreSQL。 + +### 查看数据库配置: + +保存这里生成的配置中包含数据库的用户名密码以及数据库连接方式,用于下文 Halo 中配置: + +![](../images/halo_img-6.png) + +> 图中可以看到 PostgreSQL 连接配置为: +> +> Username: postgres +> +> Password: rcx7f47m +> +> Connection: postgresql://postgres:rcx7f47m@dbname-postgresql.ns-sy32q9p9.svc:5432 + +## 步骤 2: 在 Sealos 中部署 Halo应用 + +### 打开 应用管理 + +![](../images/halo_img-7.png) + +![](../images/halo_img-8.png) + +### 填写配置 + +- 自定义应用名称 + +- 镜像名称设置为 `halohub/halo:2.5` + +- CPU 和存储应根据实际情况进行配置,memory 需要 `500Mi` 的内存才能启动 Halo,这里可以参考官方 + prepare:https://docs.halo.run/getting-started/prepare + +- 暴露端口应为 `8090`。同时,设置为外网访问将自动为应用配置一个出口域名用于外网访问,同时需要在 Halo 中进行配置该地址 + +- 环境变量包括数据库配置和其他相关配置。需要注意的是,你需要根据你在 [步骤 1](查看数据库配置:) 中设置的用户名、密码和 DNS + 来配置数据库连接信息。同时,你还需要为 Halo 配置超级管理员的用户名和密码。 + +配置 Halo 环境变量 + +```Bash +spring.sql.init.platform=postgresql +spring.r2dbc.url=r2dbc:pool:postgresql://postgres:rcx7f47m@dbname-postgresql.ns-sy32q9p9.svc:5432/halo +spring.r2dbc.username=postgres +spring.r2dbc.password=rcx7f47m +halo.external-url=tmtdvfjiyyfh.cloud.sealos.io +halo.security.initializer.superadminusername=root +halo.security.initializer.superadminpassword=sealos +``` + +环境变量配置详解: + +| 参数名 | 描述 | +|----------------------------------------------|--------------------------------| +| spring.r2dbc.url | 数据库连接地址,详细可查阅下方的 数据库链接格式 | +| spring.r2dbc.username | 数据库用户名 | +| spring.r2dbc.password | 数据库密码 | +| spring.sql.init.platform | 数据库平台名称,支持 postgresql、mysql、h2 | +| halo.external-url | 外部访问链接,如果需要在公网访问,需要配置为实际访问地址 | +| halo.security.initializer.superadminusername | 初始超级管理员用户名 | +| halo.security.initializer.superadminpassword | 初始超级管理员密码 | + +数据库的链接格式(这里我们使用 postgresql 的格式): + +| 链接方式 | 链接地址格式 | spring.sql.init.platform | +|-------------|------------------------------------------------------------------------------------|--------------------------| +| PostgreSQL | r2dbc:pool:postgresql://`{HOST}`:`{PORT}`/`{DATABASE}` | postgresql | +| MySQL | r2dbc:pool:mysql://`{HOST}`:`{PORT}`/`{DATABASE}` | mysql | +| MariaDB | r2dbc:pool:mariadb://`{HOST}`:`{PORT}`/`{DATABASE}` | mysql | +| H2 Database | r2dbc:h2:file:///`${halo.work-dir}`/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE | h2 | + +### 网络配置 + +![](../images/halo_img-9.png) + +### 环境变量配置 + +![](../images/halo_img-10.png) + +### 配置持久化存储卷 + +挂载 `/root/.halo2` 目录来持久化 halo 数据 : + +![](../images/halo_img-11.png) + +## 步骤 3: 使用外网访问 Halo + +成功启动应用后,即可通过外网访问地址访问 Halo 进行配置: + +![](../images/halo_img-12.png) + +![](../images/halo_img-13.png) + +### 初始化 Halo + +![](../images/halo_img-14.png) + +![](../images/halo_img-15.png) + +### First Halo + +![](../images/halo_img-16.png) + +![](../images/halo_img-17.png) + +![](../images/halo_img-18.png) + +## FAQ + +### 忘记密码 + +#### 进入 「应用管理」,点击日志查看 + +![](../images/halo_img-19.png) + +![](../images/halo_img-20.png) + +可以看到这里的日志中:用户名:`admin` 密码:`QTu2J2xgUQ3ngqUo` + +#### 或终端执行如下命令查看日志 + +![](../images/halo_img-21.png) + +``` +root@td3q8uc46:~# kubectl logs halo-0 | grep 'Generated random password:' | tail -1 +2023-05-30T13:32:16.942+08:00 INFO 7 --- [-controller-t-1] r.h.app.security.SuperAdminInitializer : === Generated random password: QTu2J2xgUQ3ngqUo for super administrator: admin === +``` + +![](../images/halo_img-22.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-wordpress.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-wordpress.md new file mode 100644 index 00000000000..749b1a8c1ba --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/blog-platform/install-wordpress.md @@ -0,0 +1,111 @@ +--- +sidebar_position: 1 +keywords: [WordPress安装, Sealos, MySQL数据库, 内容管理系统, 快速部署, 应用管理, 环境变量配置, 网站搭建, 博客平台, 外网访问] +description: 学习如何使用Sealos快速安装WordPress和MySQL数据库,轻松配置环境变量和网络设置,实现高效的网站和博客搭建。本教程提供详细步骤指导,助您迅速开启内容创作之旅。 +--- + +# 快速安装 WordPress + +[WordPress](https://github.com/WordPress/WordPress) 是一款功能强大、易用、开源的内容管理系统 (CMS), +可以用于在互联网上发布网站、新闻、博客等内容。它提供了便捷的内容编辑、发布和更新方法 , 同时也可以通过主题和插件进行高度自定义。WordPress +已经成为非常成功和普及的 CMS 系统 , 在全球有超过 3 千万个网站使用 WordPress 搭建。 + +> 使用 Sealos 安装 WordPress,可以大幅度减少安装时间,极速开启用户的内容输出之旅。 + +WordPress 需要搭配 MySQL 数据库一同安装使用。作为使用 Sealos 的最佳实践,建议使用**数据库**应用独立安装 MySQL +数据库,依托独立数据库,快速安装 WordPress。 + +## 新建 MySQL 实例 + +进入 [Sealos](https://cloud.sealos.io) 桌面环境,在「数据库」中,快速配置需要的数据库实例,等待数据库部署完成。 + +![](../images/wordpress_15.png) + +![](../images/wordpress_16.png) + +![](../images/wordpress_17.png) + +**注:此时的 MySQL 实例中并不存在用户自定义数据库,需要在终端中手动创建** + +## 新建数据库 + +通过**数据库**应用安装的 MySQL 实例时,并不会自动创建用户自定义数据库。在使用应用程序连接 MySQL 数据库时,您需要在 MySQL +实例中手动创建相应的数据库。 + +可以通过如下方式进入数据库的终端命令行 + +![](../images/wordpress_12.png) +![](../images/wordpress_13.png) + +也可以在终端中自行输入命令 + +`mysql -u username -p -h yourhost` + +![](../images/wordpress_14.png) + +数据库连接成功后,可以按照如下命令创建数据库 + +`CREATE DATABASE yourdb;` + +至此,您已经在 MySQL 实例中手动创建了一个用户自定义数据库。 + +## 应用管理 + +点击应用管理,进入安装界面。 + +![](../images/wordpress_1.png) + +## 基础配置 + +首先设置自定义的应用名称,选择需要安装的镜像。Sealos 既支持公有镜像源,也支持私有镜像源。本示例选用的官方镜像源,不指定镜像版本时,默认拉取 +latest 版本。 + +其次,为 WordPress 配置 CPU 与内存资源,WordPress 十分的轻量级,较少的资源就可以保证程序的正常运行。 + +![](../images/wordpress_8.png) + +## 网络配置 + +网络配置方面,打开外网访问,Sealos 会为用户自动分配出口域名用作外网访问,如果用户已经注册了自己的自定义域名,那么可以将自定义域名 +cname 到该出口域名,这样就可以使用该自定义域名访问用户安装的应用。 + +注:后续演示,使用的是 Sealos 随机生成的出口域名。 + +![](../images/wordpress_9.png) + +## 高级配置 + +在高级配置中,需要根据数据库的实际情况配置 WordPress 的环境变量。 + +高级配置中,需要为 WordPress 配置环境变量与本地存储。 + +WordPress 常见环境变量如下所示: + +```Plain +WORDPRESS_DB_HOST 数据库实例的ip地址 +WORDPRESS_DB_USER 连接数据库的用户 +WORDPRESS_DB_PASSWORD 连接库所需的用户密码 +WORDPRESS_DB_NAME 连接的数据库名称 +``` + +根据之前安装的 MySQL 示例,可以这样配置环境变量: + +```Plain +WORDPRESS_DB_HOST=mysql-host:3306 +WORDPRESS_DB_USER=root +WORDPRESS_DB_PASSWORD=root_passwd +WORDPRESS_DB_NAME=yourdb +``` + +WordPress 官方镜像的存储卷挂载地址为:`/var/www/html`,用户根据需求为应用分配存储空间。 + +这样,WordPress 也一并安装成功,点击详情,通过外网地址就可以成功访问。 + +![](../images/wordpress_10.png) + +点击该链接,如下页面,证明安装成功 + +![](../images/wordpress_11.png) + +**注:如部署失败 , 优先排查 WordPress 访问的用户自定义数据库是否存在于 MySQL 实例中** + diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/dial-testing-system/install-uptime-kuma.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/dial-testing-system/install-uptime-kuma.md new file mode 100644 index 00000000000..7d87627b81b --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/dial-testing-system/install-uptime-kuma.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 1 +keywords: [Uptime Kuma, 服务器监控, Sealos, 应用部署, 开源监控工具, 实时监控, 服务器状态, 快速安装, 持久化数据, 外网访问] +description: 学习如何在Sealos上快速安装Uptime Kuma,一款开源的服务器监控工具。本教程涵盖从应用创建到配置和访问的全过程,帮助您轻松实现服务器状态的实时监控。 +--- + +# 快速安装 Uptime Kuma + +![](../images/uptimekuma_img-0.png) + +[Uptime Kuma](https://github.com/louislam/uptime-kuma) +是一款开源的、易于使用的服务器监控工具。它可以帮助你实时监控服务器的运行状态、响应时间以及其他关键指标,以确保你的服务器始终保持最佳状态。如果你想快速安装 +Uptime Kuma,可以按照以下步骤进行操作: + +### 步骤 1:首先进入 [Sealos](https://cloud.sealos.io) 桌面环境并打开「应用管理」 + +![](../images/uptimekuma_img-1.png) + +### 步骤 2: 新建应用 + +在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](../images/uptimekuma_img-2.png) + +### 步骤 3: 设置启动参数 + +在启动参数中,按照以下方式进行设置: + +- 容器暴露端口指定为 3001。 +- 设置为外网访问即可通过给出的域名访问。 + +![](../images/uptimekuma_img-3.png) + +![](../images/uptimekuma_img-4.png) + +### 步骤 4: 设置存储卷 + +在高级配置中,添加存储卷挂载来持久化 Uptime Kuma 数据目录 `/app/data`。这样可以确保应用数据在容器重启后不会丢失。 + +![](../images/uptimekuma_img-5.png) + +### 步骤五:部署应用 + +点击「部署应用」后即可启动应用: + +![](../images/uptimekuma_img-6.png) + +### 步骤 6: 访问应用 + +一旦应用启动成功,你就可以使用应用的外网地址进行访问了。在浏览器中输入应用的域名,即可访问应用的主界面。 + +![](../images/uptimekuma_img-7.png) + +### 步骤 7: 创建管理员账户 + +为了保护 Uptime Kuma 的安全性,首次进入你需要创建一个管理员账户,填写管理员账户的基本信息,包括用户名、密码。填写完毕后,点击创建按钮进行注册。 + +![](../images/uptimekuma_img-8.png) + +### 步骤 8: 添加自定义监控项 + +![](../images/uptimekuma_img-9.png) + +![](../images/uptimekuma_img-10.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/gitea/install-gitea.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/gitea/install-gitea.md new file mode 100644 index 00000000000..e19b5e7a7e2 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/gitea/install-gitea.md @@ -0,0 +1,117 @@ +--- +keywords: [Gitea安装, Sealos部署, 自托管Git服务, 代码托管平台, MySQL配置, 应用管理, 容器化部署, 开发团队协作, CI/CD工具, 代码审查系统] +description: 学习如何在Sealos云平台上快速安装和配置Gitea,实现自托管的代码托管、团队协作和CI/CD服务。包含详细步骤和MySQL数据库设置指南。 +--- + +# 快速安装 Gitea + +喝杯茶吧!无痛自托管多合一软件开发服务,包括 Git 托管、代码审查、团队协作、包注册和 CI/CD。 + +## 步骤 1:登陆 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](../images/gitea-0.png) + +## 步骤 2:打开 「应用管理」 应用 + +![](../images/gitea-1.png) + +## 步骤 3:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](../images/gitea-2.png) + +## 步骤 4:应用部署 + +- 基础配置: + + - 应用名称(自定义):gitea + - 镜像名(默认最新版本):gitea/gitea:latest-rootless + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + + ![](../images/gitea-3.png) + +- 网络配置: + + - 容器暴露端口:3000 + - 外网访问:开启 + + ![](../images/gitea-4.png) + +- 高级配置: + + - 自定义本地存储,持久化 Gitea 的数据(推荐 1 G)。 + +![](../images/gitea-5.png) + +## 步骤 5:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](../images/gitea-6.png) + +## 步骤6:配置数据库 + +- 通过 Sealos 为 Gitea 配置 MySQL 数据库 +- 进入 Database + +![](../images/gitea-9.png) + +- 新建数据库 + +![](../images/gitea-10.png) + +- 部署集群 + +- 基础配置: + + - 集群类型:mysql + - 数据库版本:ac-mysql-8.0.30 + - CPU(推荐):1 Core + - 内存(推荐):1 G + +![](../images/gitea-11.png) + +- 部署成功后进入详情页面查看 MySQL 连接信息 + +![](../images/gitea-12.png) + +- 点击一键连接进入 MySQL 终端连接 + +![](../images/gitea-13.png) + +- 执行 + +```sql +CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; +``` + +创建 Gitea 所需要的数据库 + +![](../images/gitea-14.png) + +## 步骤 7:访问应用 + +- 点击「App Launchpad」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 + +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](../images/gitea-7.png) + +- 访问外网地址后进入到配置页面,根据刚刚创建的 MySQL 的详情页面进行配 + +![](../images/gitea-15.png) + +配置好后点击安装,等待一会便可进入到登陆页面,部署成功! + +![](../images/gitea-16.png) + +![](../images/gitea-17.png) + diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png new file mode 100644 index 00000000000..025a0c4e45a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-10-52-H2ZWUZ.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png new file mode 100644 index 00000000000..1ca1cd0ed53 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-31-vrNHJU.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-1iudM0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-1iudM0.png new file mode 100644 index 00000000000..5ba9b3ad878 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-1iudM0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png new file mode 100644 index 00000000000..ac8de099a1a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2022-04-10-14-32-ADfk8T.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg new file mode 100644 index 00000000000..1b1fe554ea5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-54-EIVahX.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg new file mode 100644 index 00000000000..a773666c4ff Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-55-NDkuEg.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-59-FxJE12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-59-FxJE12.png new file mode 100644 index 00000000000..fdc343a80ed Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-11-59-FxJE12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-01-DKect7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-01-DKect7.png new file mode 100644 index 00000000000..b4d2db4792a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-01-DKect7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-05-CWczxm.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-05-CWczxm.png new file mode 100644 index 00000000000..d512ad14195 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-05-CWczxm.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png new file mode 100644 index 00000000000..28a241ade20 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-06-lvv6ms.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png new file mode 100644 index 00000000000..aa8e415fb5b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-07-s8W7iu.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-09-RslDGj.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-09-RslDGj.png new file mode 100644 index 00000000000..0935a645d99 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-09-RslDGj.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png new file mode 100644 index 00000000000..a446015a5c5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-24-QHYKZt.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png new file mode 100644 index 00000000000..6996e718eb5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-26-HYOaBJ.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png new file mode 100644 index 00000000000..c76f2e0535a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-28-ccnUOj.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png new file mode 100644 index 00000000000..ba4d166331c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-29-z5E9gi.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg new file mode 100644 index 00000000000..7ca839b52b2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-12-39-1jsF0t.jpeg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png new file mode 100644 index 00000000000..ac7134504f8 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-FwsbfW.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png new file mode 100644 index 00000000000..59460d087f2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-Vs9ccy.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png new file mode 100644 index 00000000000..0fc1e2d152b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-YFHPYc.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png new file mode 100644 index 00000000000..00e7aa10391 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-hdHfxP.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png new file mode 100644 index 00000000000..08ff96c0c12 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/2023-06-26-13-09-nwrxrv.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-1.png new file mode 100644 index 00000000000..700c4e0d4d3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-2.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-3.png new file mode 100644 index 00000000000..01876eeff7a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-4.png new file mode 100644 index 00000000000..fad0d90a71d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-5.png new file mode 100644 index 00000000000..d6567da245a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-6.png new file mode 100644 index 00000000000..78b505e7529 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-7.png new file mode 100644 index 00000000000..9771645376a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-8.png new file mode 100644 index 00000000000..ca7f7e62e60 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/appsmith-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-1.png new file mode 100644 index 00000000000..5fb4c0ec51f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-2.png new file mode 100644 index 00000000000..714ad389184 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-3.png new file mode 100644 index 00000000000..e0d5a1a605d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/2-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-1.png new file mode 100644 index 00000000000..10d9ef1b793 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-2.png new file mode 100644 index 00000000000..eef62cdfc5f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/3-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/4-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/4-1.png new file mode 100644 index 00000000000..880e86b32ce Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/4-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-1.png new file mode 100644 index 00000000000..b8f83e07b0d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-2.png new file mode 100644 index 00000000000..b9b2404dc9c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-3.png new file mode 100644 index 00000000000..5e22398cdfc Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/5-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-architecture.jpeg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-architecture.jpeg new file mode 100644 index 00000000000..7f9660c847f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-architecture.jpeg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-intro.jpeg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-intro.jpeg new file mode 100644 index 00000000000..848bd2b5d97 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/fireboom/fireboom-intro.jpeg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-0.png new file mode 100644 index 00000000000..51d1b856472 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-1.png new file mode 100644 index 00000000000..40327086916 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-10.png new file mode 100644 index 00000000000..ebcad36657b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-11.png new file mode 100644 index 00000000000..7de1f375aa4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-12.png new file mode 100644 index 00000000000..32fea7a571b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-13.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-13.png new file mode 100644 index 00000000000..da74e2ae6af Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-13.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-14.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-14.png new file mode 100644 index 00000000000..70d6971d990 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-14.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-15.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-15.png new file mode 100644 index 00000000000..cd370d79a7b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-15.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-16.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-16.png new file mode 100644 index 00000000000..1c2de6f7d4c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-16.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-17.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-17.png new file mode 100644 index 00000000000..a41d1df04ff Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-17.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-2.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-3.png new file mode 100644 index 00000000000..7cbc77cebe6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-4.png new file mode 100644 index 00000000000..7011b776993 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-5.png new file mode 100644 index 00000000000..edadcc1ae00 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-6.png new file mode 100644 index 00000000000..4044b336778 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-7.png new file mode 100644 index 00000000000..e2cd50bc191 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-8.png new file mode 100644 index 00000000000..9db3b3c06cf Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-9.png new file mode 100644 index 00000000000..e8dffac2625 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/gitea-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-1.png new file mode 100644 index 00000000000..51d7a08dd35 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-10.png new file mode 100644 index 00000000000..47ac9bd3b6a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-11.png new file mode 100644 index 00000000000..986e50a61e6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-12.png new file mode 100644 index 00000000000..21e55e93ae9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-13.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-13.png new file mode 100644 index 00000000000..7911c018cf4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-13.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-14.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-14.png new file mode 100644 index 00000000000..c3d2cc3bde0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-14.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-15.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-15.png new file mode 100644 index 00000000000..11197b975ec Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-15.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-16.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-16.png new file mode 100644 index 00000000000..d443d3d8dfe Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-16.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-17.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-17.png new file mode 100644 index 00000000000..1e88fe4f3c5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-17.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-18.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-18.png new file mode 100644 index 00000000000..b93a0dcfc9f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-18.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-19.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-19.png new file mode 100644 index 00000000000..17c863592f8 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-19.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-2.png new file mode 100644 index 00000000000..5a9d401f263 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-20.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-20.png new file mode 100644 index 00000000000..9ed9ed3435f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-20.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-21.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-21.png new file mode 100644 index 00000000000..6a1c4a896f5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-21.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-22.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-22.png new file mode 100644 index 00000000000..d5e70681e57 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-22.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-3.png new file mode 100644 index 00000000000..29ba87c9cc5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-4.png new file mode 100644 index 00000000000..0790b5ce2e4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-5.png new file mode 100644 index 00000000000..f35eebc16cd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-6.png new file mode 100644 index 00000000000..933d0efde05 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-7.png new file mode 100644 index 00000000000..93a5e88a6e8 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-8.png new file mode 100644 index 00000000000..9b41cf4dee0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-9.png new file mode 100644 index 00000000000..609c7c0959c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/halo_img-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa0.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa1.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa1.jpg new file mode 100644 index 00000000000..908af82a6ed Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa1.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa2.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa2.jpg new file mode 100644 index 00000000000..b7ddd076b3a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa2.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa3.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa3.jpg new file mode 100644 index 00000000000..4a897b409c6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa3.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa4.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa4.jpg new file mode 100644 index 00000000000..ed4f9c4e40b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa4.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa5.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa5.jpg new file mode 100644 index 00000000000..f233bedc7a0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa5.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa6.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa6.jpg new file mode 100644 index 00000000000..f5691f979ba Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa6.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa_home.jpg b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa_home.jpg new file mode 100644 index 00000000000..a7cd310760b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/illa_home.jpg differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-1.png new file mode 100644 index 00000000000..700c4e0d4d3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-10.png new file mode 100644 index 00000000000..0aa0f2546ce Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-11.png new file mode 100644 index 00000000000..ef702aadb7e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-2.png new file mode 100644 index 00000000000..bca16d41669 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-3.png new file mode 100644 index 00000000000..00edfb9382b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-4.png new file mode 100644 index 00000000000..c947ad852ca Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-5.png new file mode 100644 index 00000000000..289789fd639 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-6.png new file mode 100644 index 00000000000..a58fbc16537 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-7.png new file mode 100644 index 00000000000..414ff44e067 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-8.png new file mode 100644 index 00000000000..dc7bb21bd4e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-9.png new file mode 100644 index 00000000000..0011841a7d1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/pageplug-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/0.png new file mode 100644 index 00000000000..3b876679928 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/1.png new file mode 100644 index 00000000000..8594460ab60 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/10.png new file mode 100644 index 00000000000..a8785255d65 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/11.png new file mode 100644 index 00000000000..4582e3ffe3f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/12.png new file mode 100644 index 00000000000..1eca4f3c1ab Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/13.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/13.png new file mode 100644 index 00000000000..1c592128b98 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/13.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/14.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/14.png new file mode 100644 index 00000000000..d5ab998613d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/14.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/15.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/15.png new file mode 100644 index 00000000000..d8ae3e93589 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/15.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/16.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/16.png new file mode 100644 index 00000000000..ab8def218f7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/16.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/17.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/17.png new file mode 100644 index 00000000000..6dedc0883d3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/17.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/2.png new file mode 100644 index 00000000000..0cbffe89e7b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/3.png new file mode 100644 index 00000000000..d08b062b0a4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/4.png new file mode 100644 index 00000000000..97b8d6a7c99 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/5.png new file mode 100644 index 00000000000..3568a104c8c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/6.png new file mode 100644 index 00000000000..6a25d0523ce Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/7.png new file mode 100644 index 00000000000..05553d34735 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/8.png new file mode 100644 index 00000000000..50dbf2e31bc Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/9.png new file mode 100644 index 00000000000..5b117a1c33f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/tailchat/9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-0.png new file mode 100644 index 00000000000..2281aaa4123 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-1.png new file mode 100644 index 00000000000..a19a6b255b3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-10.png new file mode 100644 index 00000000000..6a7fb98ddb4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-2.png new file mode 100644 index 00000000000..0cbffe89e7b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-3.png new file mode 100644 index 00000000000..56f6c056be6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-4.png new file mode 100644 index 00000000000..abda6fa2d15 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-5.png new file mode 100644 index 00000000000..8c9b87c88d9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-6.png new file mode 100644 index 00000000000..8aa71909987 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-7.png new file mode 100644 index 00000000000..810d8e793df Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-8.png new file mode 100644 index 00000000000..1a657270d13 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-9.png new file mode 100644 index 00000000000..6aeebd4b6de Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/uptimekuma_img-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_1.png new file mode 100644 index 00000000000..d641378d420 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_10.png new file mode 100644 index 00000000000..d1cd7993028 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_11.png new file mode 100644 index 00000000000..103bf474654 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_12.png new file mode 100644 index 00000000000..80c69d18580 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_13.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_13.png new file mode 100644 index 00000000000..250114b79ef Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_13.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_14.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_14.png new file mode 100644 index 00000000000..d180432b02c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_14.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_15.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_15.png new file mode 100644 index 00000000000..87711203809 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_15.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_16.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_16.png new file mode 100644 index 00000000000..b490fade878 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_16.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_17.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_17.png new file mode 100644 index 00000000000..9d0bc039160 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_17.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_2.png new file mode 100644 index 00000000000..83254bdb6cd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_3.png new file mode 100644 index 00000000000..1b0a1f926bb Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_4.png new file mode 100644 index 00000000000..86ad0a605c7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_5.png new file mode 100644 index 00000000000..1a9a1566ae1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_6.png new file mode 100644 index 00000000000..52b0dc908d4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_7.png new file mode 100644 index 00000000000..a18bfa6d170 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_8.png new file mode 100644 index 00000000000..484684f79ae Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_9.png new file mode 100644 index 00000000000..24db5cadb90 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/images/wordpress_9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-appsmith.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-appsmith.md new file mode 100644 index 00000000000..528c030bd4e --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-appsmith.md @@ -0,0 +1,71 @@ +--- +keywords: [Appsmith安装, 低代码平台, Sealos部署, 内部应用程序, 快速部署, 应用管理, 开源平台, CRUD应用, 管理面板, 自定义业务应用] +description: 学习如何在Sealos云平台上快速安装和部署Appsmith低代码平台。本教程提供详细步骤,帮助您轻松创建和管理内部应用程序、仪表板和工作流。 +--- + +# 快速安装 Appsmith + +[Appsmith](https://github.com/appsmithorg/appsmith) 是一个用于构建、部署和维护内部应用程序的开源平台。您可以构建任何东西,从简单的 +CRUD 应用程序、管理面板、仪表板到自定义业务应用程序和复杂的多步骤工作流。 + +## 步骤 1:在 [Sealos](https://cloud.sealos.io) 桌面环境中打开 「应用管理」 应用 + +![](../images/appsmith-1.png) + +## 步骤 2:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](../images/appsmith-2.png) + +## 步骤 3:应用部署 + +- 基础配置: + + - 应用名称(自定义):appsmith + + - 镜像名(默认最新版本):appsmith/appsmith-ce + + - CPU(推荐):2 Core + + - 内存(推荐):4 G + +- 部署模式: + + - 实例数(自定义):1 + +![](../images/appsmith-3.png) + +- 网络配置: + + - 容器暴露端口:80 + + - 外网访问:开启 + +![](../images/appsmith-4.png) + +- 高级配置: + + - 自定义本地存储,持久化 Appsmith 的数据(推荐 15 G)。 + +![](../images/appsmith-5.png) + +## 步骤 4:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](../images/appsmith-6.png) + +## 步骤 5:访问应用 + +- 点击「详情」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 + +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](../images/appsmith-7.png) + +- 访问成功! + +![](../images/appsmith-8.png) + + diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-illacloud.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-illacloud.md new file mode 100644 index 00000000000..9c3054834f3 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-illacloud.md @@ -0,0 +1,73 @@ +--- +keywords: [ILLA Cloud, 低代码平台, Sealos, 应用部署, 内部应用程序, 快速安装, 拖放组件, 应用管理, illasoft/illa-builder] +description: 了解如何在Sealos上快速安装ILLA Cloud低代码平台。本指南详细介绍了从创建应用到部署和访问的全过程,助您轻松构建内部应用程序。 +--- + +# 快速安装 ILLA Cloud + +[ILLA Cloud](https://www.illacloud.com/zh) 是一个开源的低代码平台,使用户能够创建、部署和管理内部应用程序。通过 ILLA +Cloud,您可以使用直观的拖放组件来灵活地构建各种应用程序,从基本的 CRUD 应用程序到更复杂的多步骤工作流程。 + +## 步骤 1:在 [Sealos](https://cloud.sealos.io) 桌面环境中打开 「应用管理」 应用 + +![illa_home](../images/illa_home.jpg) + +## 步骤 2:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![illa0](../images/illa0.png) + +## 步骤 3:应用部署 + +- 基础配置: + + - 应用名称(自定义):illa-builder + + - 镜像名(默认最新版本):illasoft/illa-builder + + - CPU(推荐):0.5 Core + + - 内存(推荐):512 MB + +- 部署模式: + + - 实例数(自定义):1 + +- 注意:我们这里使用的是最低配置,您可以根据自己的需求加大配置。 + +![illa1](../images/illa1.jpg) + +- 网络配置: + + - 容器暴露端口:2022 + + - 外网访问:开启 + +- 注意:空白的域名可以运行 ILLA Cloud,但您也可以使用自己的域名。 + +![illa2](../images/illa2.jpg) + +- 高级配置: + + - 自定义本地数据库和磁盘(最低 1G)。 + +![illa3](../images/illa3.jpg) + +## 步骤 4:部署应用 + +- 点击「部署应用」开始部署应用。 + +![illa4](../images/illa4.jpg) + +## 步骤 5:访问应用 + +- 点击「详情」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 + +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![illa5](../images/illa5.jpg) + +- 访问成功! + +![illa6](../images/illa6.jpg) diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-pageplug.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-pageplug.md new file mode 100644 index 00000000000..2278d1daedd --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/low-code-platform/install-pageplug.md @@ -0,0 +1,78 @@ +--- +keywords: [PagePlug, 低代码平台, Sealos安装, 应用部署, 可视化开发, 前端框架, 开源项目, 快速部署, 容器化应用, 云原生开发] +description: 学习如何在Sealos云平台上快速安装和部署PagePlug低代码平台。本教程提供详细步骤,帮助您轻松搭建可视化开发环境,实现高效的前端应用开发。 +--- + +# 快速安装 PagePlug + +[PagePlug](https://github.com/cloudtogo/pageplug) 是 [Appsmith](https://github.com/appsmithorg/appsmith) 的中国化项目,基于 +Appsmith 做了整体性能优化及汉化,也集合了特色表单解决方案 Formily 组件、图表解决方案 Echarts +组件、低代码小程序开发等,是面向研发使用的一个开源的、声明式的、可视化的、符合开发者直觉的前端低代码框架。 + +## 步骤 1:在 [Sealos](https://cloud.sealos.io) 桌面环境中打开 「应用管理」 应用 + +![](../images/pageplug-1.png) + +## 步骤 2:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](../images/pageplug-2.png) + +## 步骤 3:应用部署 + +- 基础配置: + + - 应用名称(自定义):pageplug + + - 镜像名(默认最新版本):cloudtogouser/pageplug-ce + + - CPU(推荐):2 Core + + - 内存(推荐):4 G + +- 部署模式: + + - 实例数(自定义):1 + +![](../images/pageplug-3.png) + +- 网络配置: + + - 容器暴露端口:80 + + - 外网访问:开启 + +![](../images/pageplug-4.png) + +- 高级配置: + + - 自定义本地存储,持久化 PagePlug 的数据。 + +![](../images/pageplug-5.png) + +## 步骤 4:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](../images/pageplug-6.png) + +## 步骤 5:访问应用 + +- 点击「详情」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 + +![](../images/pageplug-7.png) + +![](../images/pageplug-8.png) + +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](../images/pageplug-9.png) + +- 若访问出现 503 异常,等待一会重试即可。 + +![](../images/pageplug-10.png) + +- 访问成功! + +![](../images/pageplug-11.png) diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/others/install-anki.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/others/install-anki.md new file mode 100644 index 00000000000..3662725e6cf --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/others/install-anki.md @@ -0,0 +1,152 @@ +--- +keywords: [Anki同步服务器, Sealos部署, anki-sync-server-rs, 自定义同步, Anki客户端配置] +description: 本文详细介绍如何在Sealos上快速部署Anki自定义同步服务器,并指导如何在桌面端、安卓端和iOS端配置客户端,解决Anki同步速度慢的问题。 +--- + +# 快速安装 Anki 自定义同步服务器 + +Anki 是一个辅助记忆软件,其本质是一个卡片排序工具--**即依据使用者对卡片上的自定义内容进行主动测试、自我评判后,其内部算法根据评判结果更改每张卡片下次测试时间的排序工具。 +** + +所谓的卡片,专业说法叫 Flash Card(抽认卡或闪卡),是一小块纸片,分为正反两面,将问题和提示写在一面,将答案写在另一面。使用方法就是先看正面的问题与提示,在脑中回想答案,然后翻出反面进行对照验证。 + +闪卡的核心制作原则就是:**一个知识点一张卡**。因此非常适合用来学习英文,也可以用来记忆历史事件时间、公式等等。 + +Anki 的同步服务器在国外,还是一个个人项目,带宽很小,同步速度很慢,如果我们想在多个客户端之间同步学习进度和新增的知识点,那将非常痛苦。 + +为了解决这个问题,我们需要部署一个自定义的同步服务器,然后让客户端去使用这个同步服务器。 + +## Anki 同步服务器部署 + +自从 2023 年 2 月份,Anki 发布了 PC 端 2.1.57 版本以后,Anki 的 PC 端,安卓端,iOS 端用户都可以自定义同步服务器了,并且不再需要安装插件。从此 +Anki 小伙伴再也不用担心 Anki 同步的问题了,困扰 Anki 用户多年的同步问题终于得到彻底解决。 + +社区目前只有 [anki-sync-server-rs](https://github.com/ankicommunity/anki-sync-server-rs) 这个项目支持最新的 Anki +版本,其他的同步服务器项目基本上都失效了。这个项目是用 Rust 写的,追踪 [Anki 官方](https://github.com/ankitects/anki) +同步服务端的进度,它们都是基于sqlite c 作为数据存储后端。 + +下面我们将在 Sealos 中部署并配置 anki-sync-server-rs。 + +首先在浏览器地址栏输入网址 [https://cloud.sealos.io/](https://cloud.sealos.io/) 进入 Sealos 桌面。然后打开「应用管理」: + +![](../images/2023-06-26-11-54-EIVahX.jpg) + +点击「新建应用」: + +![](../images/2023-06-26-11-55-NDkuEg.jpg) + +依次输入应用名和镜像名,容器暴露端口是 `27701`,并开启外网访问: + +![](../images/2023-06-26-11-59-FxJE12.png) + +继续向下,展开「高级配置」,点击「编辑环境变量」: + +![](../images/2023-06-26-12-01-DKect7.png) + +将以下内容粘贴到环境变量输入框中: + +```bash +ANKISYNCD_USERNAME= +ANKISYNCD_PASSWORD= +``` + +请将 `` 替换为你自己的用户名,将 `` 替换为你自己的密码。 + +![](../images/2023-06-26-12-05-CWczxm.png) + +点击「新增存储卷」: + +![](../images/2023-06-26-12-06-lvv6ms.png) + +挂载路径填入 `/app`,然后点击确认: + +![](../images/2023-06-26-12-07-s8W7iu.png) + +最后点击右上角的部署应用即可。 + +部署完成后点击「详情」进入应用详情界面。 + +![](../images/2023-06-26-12-09-RslDGj.png) + +这里可以看到实例的运行状态,一定要等到状态是 running 才算是部署成功。如果一段时间以后状态还不是 running,可以点击「详情」查看故障原因: + +![](../images/2023-06-26-13-09-Vs9ccy.png) + +部署成功后,可以看到应用的运行情况,包括 CPU 占用、内存占用等。点击外网地址即可通过外网域名直接打开同步服务器的 Web 界面。 + +![](../images/2023-06-26-13-09-YFHPYc.png) + +如果出现以下的界面,则表示部署成功: + +![](../images/2023-06-26-13-09-FwsbfW.png) + +查看日志的方法也很简单,直接点击实例右侧的「三个点」,然后点击「日志」即可查看日志: + +![](../images/2023-06-26-13-09-hdHfxP.png) + +![](../images/2023-06-26-13-09-nwrxrv.png) + +## 客户端设置 + +### 桌面端 + +桌面客户端(macOS/Windows/Linux)配置方法如下: + +1. 先打开「首选项」 + + ![](../images/2023-06-26-12-24-QHYKZt.png) + +2. 点击「**网络**」,往下看,可以看到标有 `self-hosted sync server(自定义同步服务器)` 的方框,在里面填写您的服务端的地址: + + ![](../images/2023-06-26-12-26-HYOaBJ.png) + +3. 重启 Anki,然后点击「**同步**」: + + ![](../images/2023-06-26-12-28-ccnUOj.png) + +4. 这时候会弹出一个输入框让你输入用户名和密码,你需要将你之前设置的用户名和密码输入进去: + + ![](../images/2023-06-26-12-29-z5E9gi.png) + +5. 点击确认后,就会开始同步了。 + +### 安卓端 + +安卓端也是直接配置即可,我的 AnkiDroid 版本是 `2.15.6`。你可以通过「设置 -> 高级设置 -> 自定义同步服务器」找到配置页面。 + +![](../images/2022-04-10-14-31-vrNHJU.png) + +再填写用户名和密码: + +> 设置 -> 常用设置 -> AnkiWeb账户 + +这样就算配置完成了,所有的牌组都同步过来了。 + +![](../images/2022-04-10-14-32-ADfk8T.png) +![](../images/2022-04-10-14-32-1iudM0.png) + +官方的版本比较旧,如果你想使用更激进的社区版本,可以到这个页面下载最新的 Beta 版: + ++ [https://github.com/ankidroid/Anki-Android/releases](https://github.com/ankidroid/Anki-Android/releases) + +建议下载 **arm64-v8a** 版本。 + +安装完成后,可以通过「设置 -> 同步 -> 自定义同步服务器」找到配置页面: + +![](../images/2023-06-26-12-39-1jsF0t.jpeg) + +再填写用户名和密码: + +> 设置 -> 同步 -> AnkiWeb账户 + +### iOS 端 + +AnkiMobile 也已经支持和自建的同步服务器同步了。至少对于版本 Ankimobile 2.0.90(20090.2) 来说,似乎是可行的,这是一位 iOS +系统用户[在 Anki 论坛报告的](https://forums.ankiweb.net/t/ankimobile-self-sync-server-failure-the-one-bundled-in-version-2-1-60-qt6/27862)。 + +如果设置完成后发现不能同步可以参考下面的内容再试一次: + +> If you're using AnkiMobile and are unable to connect to a server on your local network, please go into the iOS +> settings, locate Anki near the bottom, and toggle "Allow Anki to access local network" off and then on again. + +上面的内容摘自 [ANki tutorial](https://docs.ankiweb.net/sync-server.html#client-setup) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Go Apps.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Go Apps.md new file mode 100644 index 00000000000..f3fa20260fb --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Go Apps.md @@ -0,0 +1,156 @@ +--- +keywords: [Go程序安装, Docker镜像, Sealos部署, 容器化应用, 云原生开发, Go Web应用, Docker Hub, 应用管理, 快速部署, 外网访问] +description: 本教程详细介绍如何快速安装Go程序,包括编写Go代码、创建Docker镜像、推送到Docker Hub,以及在Sealos平台上部署和访问应用的完整流程。 +--- + +# 快速安装 Go 程序 + +首先,确保你已经安装了以下工具: + +- Docker + +## 步骤1:编写你的 Go 程序 + +```go +package main + +import ( + "fmt" + "net/http" +) + +func main() { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello,Wolrd!") + }) + + http.ListenAndServe(":8080", nil) +} +``` + +## 步骤2:创建Docker镜像 + +- 在与`main.go`相同的目录中,创建一个名为`Dockerfile`的文件,包含以下内容: + +``` +FROM golang:1.17 as builder + +WORKDIR /app +COPY . . + +RUN go mod init myapp +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . + +FROM alpine:latest +RUN apk --no-cache add ca-certificates +WORKDIR /app +COPY --from=builder /app/main /app/ + +EXPOSE 8080 +ENTRYPOINT ["/app/main"] +``` + +这个`Dockerfile`定义了一个多阶段构建过程。在第一阶段,我们使用官方的`golang`镜像作为基础镜像,然后编译Go应用程序。在第二阶段,我们使用轻量级的 +`alpine`镜像,将编译好的二进制文件复制到`/app`目录,并将8080端口暴露。 + +- 在`Dockerfile`所在的目录运行以下命令,为Go应用程序构建Docker镜像: + +``` +docker build -t your_image_name . +``` + +将`your_image_name`替换为您的镜像名称和标签。 + +## 步骤3:推送Docker镜像 + +- 将创建的Docker镜像推送到Docker仓库,如Docker Hub或者私有仓库。**假设您已经登录到Docker仓库**,使用以下命令推送镜像 + + - 首先标记Docker镜像,在推送镜像之前,需要为其添加一个标签,以便 Docker 知道将其推送到哪个仓库。运行以下命令为镜像添加标签: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-image-name` 替换为你的本地镜像名称,`your-dockerhub-username` 替换为你的 Docker Hub 用户名, + `your-repo-name` 替换为你在 Docker Hub 上要创建的仓库名称,`your-tag` 替换为你为镜像设置的标签(例如:latest)。 + + 例如: + + ``` + docker tag demo damager6666/demo:latest + ``` + + - 接下来推送Docker镜像,使用以下命令将镜像推送到 Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-dockerhub-username`、`your-repo-name` 和 `your-tag` 替换为实际的值。例如: + + ``` + docker push damager6666/demo:latest + ``` + +## 步骤4:登陆 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](images/java-example-0.png) + +## 步骤5:打开 「应用管理」 应用 + +![](images/java-example-3.png) + +## 步骤 6:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](images/java-example-4.png) + +## 步骤7:应用部署 + +- 基础配置: + + - 应用名称(自定义):go-demo + - 镜像名(**步骤5**中推送的镜像):damager6666/demo:latest + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + +![](images/java-example-5.png) + +- 网络配置: + + - 容器暴露端口:8080 + + - 外网访问:开启 + +![](images/java-example-6.png) + +## 步骤8:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](images/java-example-7.png) + +## 步骤9:访问应用 + +- 点击「应用管理」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](images/java-example-8.png) + +- 在浏览器上输入 + +``` +https://tmgkflgdlstl.cloud.sealos.io/hello +``` + +![](images/java-example-9.png) + +- 页面上显示 ”Hello,World! “ ,表示你的 Go 应用程序已经在 Sealos 上运行 + diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Java Apps.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Java Apps.md new file mode 100644 index 00000000000..44145e3422b --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Java Apps.md @@ -0,0 +1,280 @@ +--- +keywords: [Java应用部署, Sealos云平台, Docker镜像, Spring Boot, 数据库配置, 应用管理, 快速安装] +description: 本教程详细介绍如何在Sealos云平台上快速部署Java应用,包括Spring Boot项目创建、Docker镜像构建、数据库配置及应用管理等步骤,助您轻松实现Java程序的云端部署。 +--- + +# 快速安装 Java 程序 + +首先,确保你已经安装了以下工具: + +- Docker +- Maven + +## 步骤1:编写你的 Java 程序 + +- 这里直接通过 [Spring Initializr](https://start.spring.io/) 生成生成一个基本的 Spring Boot 项目。 + +![](images/java-example-1.png) + +- 打开项目的 `pom.xml` 文件,在 `` 部分添加以下内容,以包含MySQL JDBC驱动: + + ``` + + mysql + mysql-connector-java + + ``` + +- 接下来,在 `src/main/resources` 目录下的 `application.properties` 文件中添加以下内容,以配置数据库连接: + + ``` + spring.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 + spring.datasource.username=root + spring.datasource.password=your_password + spring.jpa.hibernate.ddl-auto=update + ``` + +## 步骤2:创建实体类和存储类 + +在项目中创建一个新的Java类,如 `Person.java`,用于表示数据库中的实体。添加以下内容: + +```java +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Person { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + + // Getters and setters + // ... +} +``` + +- 然后创建一个存储库接口,如 `PersonRepository.java`: + + ```java + import org.springframework.data.jpa.repository.JpaRepository; + import org.springframework.stereotype.Repository; + + @Repository + public interface PersonRepository extends JpaRepository { + } + ``` + +## 步骤3:创建 Web 控制器 + +- 在项目的 `src/main/java` 目录下,创建一个简单的 Web 控制器。例如,创建一个名为 `PersonController.java` 的文件,并添加以下内容: + +```java +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class PersonController { + @Autowired + private PersonRepository personRepository; + + @GetMapping("/getPersons") + public String getAllPersons() { + List persons = personRepository.findAll(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < persons.size(); i++) { + sb.append("id: " + persons.get(i).getId() + " name: " + persons.get(i).getName() + "/n"); + } + System.out.println(sb.toString()); + return sb.toString(); + } + + @PostMapping(value = "/addPerson") + public Person addPerson(@RequestBody Person person) { + return personRepository.save(person); + } + +} +``` + +## 步骤4:构建应用程序 + +- 使用maven构建项目,运行以下命令 + + ``` + mvn clean install + ``` + + ​ ![](images/java-example-2.png) + +## 步骤5:创建Docker镜像 + +- 在 Java 项目的根目录下,创建一个名为 `Dockerfile` 的文件。这个文件将包含构建 Docker 镜像所需的指令。以下是一个简单的示例 + Dockerfile: + + ``` + # 使用官方的 OpenJDK 镜像作为基础镜像 + FROM openjdk:8-jre-slim + + # 设置工作目录 + WORKDIR /app + + # 复制构建好的 JAR 文件到镜像中 + COPY target/demo-0.0.1-SNAPSHOT.jar /app/demo-0.0.1-SNAPSHOT.jar + + # 暴露应用程序的端口 + EXPOSE 8080 + + # 设置启动命令 + CMD ["java", "-jar", demo-0.0.1-SNAPSHOT.jar"] + ``` + +- 在项目根目录下,运行以下命令构建 Docker 镜像: + +``` +docker build -t java-demo . +``` + +## 步骤6:推送Docker镜像 + +- 将创建的Docker镜像推送到Docker仓库,如Docker Hub或者私有仓库。**假设您已经登录到Docker仓库**,使用以下命令推送镜像 + + - 首先标记Docker镜像,在推送镜像之前,需要为其添加一个标签,以便 Docker 知道将其推送到哪个仓库。运行以下命令为镜像添加标签: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-image-name` 替换为你的本地镜像名称,`your-dockerhub-username` 替换为你的 Docker Hub 用户名, + `your-repo-name` 替换为你在 Docker Hub 上要创建的仓库名称,`your-tag` 替换为你为镜像设置的标签(例如:latest)。 + + 例如: + + ``` + docker tag java-demo damager6666/demo:v2 + ``` + + - 接下来推送Docker镜像,使用以下命令将镜像推送到 Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-dockerhub-username`、`your-repo-name` 和 `your-tag` 替换为实际的值。例如: + + ``` + docker push damager6666/java-demo:v2 + ``` + +## 步骤7:登陆 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](images/java-example-0.png) + +## 步骤8:打开 「数据库」 应用 + +![](images/java-example-10.png) + +## 步骤9:创建数据库 + +- 点击新建数据库 + +![](images/java-example-11.png) + +- 基础配置: + - 集群类型:mysql + - 集群名称 : demo-db + - CPU(推荐):1 Core + - 内存(推荐):1 G + - 实例数:1 + - 存储容量: 1 Gi +- 点击 部署集群 + +## 步骤10:配置数据库 + +![](images/java-example-12.png) + +- 点击一键连接到数据库执行以下语句: + + - 创建 test_db 数据库 + + ```sql + create database test_db; + ``` + + - 创建 test 表 + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - 插入数据 + + ```sql + insert into test values (1,'Sealos'); + ``` + +## 步骤11:打开 「应用管理」 应用 + +![](images/java-example-3.png) + +## 步骤 12:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](images/java-example-4.png) + +## 步骤13:应用部署 + +- 基础配置: + + - 应用名称(自定义):java-demo + - 镜像名:damager6666/java-demo:v2 + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + +![](images/java-example-5.png) + +- 网络配置: + + - 容器暴露端口:8080 + + - 外网访问:开启 + +![](images/java-example-6.png) + +## 步骤14:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](images/java-example-7.png) + +## 步骤15:访问应用 + +- 点击「应用管理」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](images/java-example-8.png) + +- 在浏览器上输入 + +``` +https://tmgkflgdlstl.cloud.sealos.io/getPersons +``` + +![](images/java-example-13.png) + +- 页面上显示之间插入到数据库的数据 ,表示你的 Java 应用程序已经在 Sealos 上运行 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md new file mode 100644 index 00000000000..8158c106866 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Node.js Apps.md @@ -0,0 +1,230 @@ +--- +keywords: [Node.js应用部署, Docker镜像构建, Sealos云平台, 数据库配置, 快速安装教程, 容器化部署, Web应用开发, 云原生应用, Express框架, MySQL数据库] +description: 本教程详细介绍如何快速安装并部署Node.js应用到Sealos云平台。包括编写代码、构建Docker镜像、配置数据库和应用部署的完整步骤,助您轻松实现云原生应用开发。 +--- + +# 快速安装 Node.js 程序 + +首先,确保你已经安装了以下工具: + +- Docker + +## 步骤1:编写你的 Node.js 程序 + +- 在目录下创建一个名为 `app.js` 的文件,并添加以下代码: + + ```js + const express = require('express'); + const mysql = require('mysql'); + const app = express(); + + const db = mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + }); + + db.connect((err) => { + if (err) throw err; + console.log('Connected to the database.'); + }); + + app.get('/', (req, res) => { + db.query('SELECT id, name FROM users', (err, results) => { + if (err) throw err; + res.send(JSON.stringify(results)); + }); + }); + + app.listen(8080, () => { + console.log('Server is running on port 8080'); + }); + + ``` + +- 在项目根目录下创建一个名为 `package.json` 的文件,并包含以下内容: + + ```json + { + "name": "nodejs-web-app-mysql", + "version": "1.0.0", + "main": "app.js", + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "^4.17.1", + "mysql": "^2.18.1" + } + } + ``` + +## 步骤2:创建 Docker 镜像 + +- 在项目的根目录下,创建一个名为 `Dockerfile` 的文件。这个文件将包含构建 Docker 镜像所需的指令。以下是一个简单的示例 + Dockerfile: + +```dockerfile +FROM node:16 + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +EXPOSE 8080 + +CMD ["npm", "start"] +``` + +## 步骤3:构建 Docker 镜像 + +- 在包含 `Dockerfile` 的目录中运行以下命令来构建 Docker 镜像: + + ``` + docker build -t nodejs-demo . + ``` + +## 步骤4:推送Docker镜像 + +- 将创建的Docker镜像推送到Docker仓库,如Docker Hub或者私有仓库。**假设您已经登录到Docker仓库**,使用以下命令推送镜像 + + - 首先标记Docker镜像,在推送镜像之前,需要为其添加一个标签,以便 Docker 知道将其推送到哪个仓库。运行以下命令为镜像添加标签: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-image-name` 替换为你的本地镜像名称,`your-dockerhub-username` 替换为你的 Docker Hub 用户名, + `your-repo-name` 替换为你在 Docker Hub 上要创建的仓库名称,`your-tag` 替换为你为镜像设置的标签(例如:latest)。 + + 例如: + + ``` + docker tag nodejs-demo damager6666/nodejs-demo:v1 + ``` + + - 接下来推送Docker镜像,使用以下命令将镜像推送到 Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-dockerhub-username`、`your-repo-name` 和 `your-tag` 替换为实际的值。例如: + + ``` + docker push damager6666/nodejs-demo:v1 + ``` + +## 步骤5:登陆 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](images/java-example-0.png) + +## 步骤6:打开 「数据库」 应用 + +![](images/java-example-10.png) + +## 步骤7:创建数据库 + +- 点击新建数据库 + +![](images/java-example-11.png) + +- 基础配置: + - 集群类型:mysql + - 集群名称 : demo-db + - CPU(推荐):1 Core + - 内存(推荐):1 G + - 实例数:1 + - 存储容量: 1 Gi +- 点击 部署集群 + +## 步骤8:配置数据库 + +![](images/java-example-12.png) + +- 点击一键连接到数据库执行以下语句: + + - 创建 test_db 数据库 + + ```sql + create database test_db; + ``` + + - 创建 test 表 + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - 插入数据 + + ```sql + insert into test values (1,'Sealos'); + ``` + +## 步骤9:打开 「应用管理」 应用 + +![](images/java-example-3.png) + +## 步骤 10:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](images/java-example-4.png) + +## 步骤11:应用部署 + +- 基础配置: + + - 应用名称(自定义):nodejs-demo + - 镜像名:damager6666/nodejs-demo:v1 + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + +![](images/nodejs-example-0.png) + +- 网络配置: + + - 容器暴露端口:8080 + + - 外网访问:开启 + +![](images/java-example-6.png) + +## 步骤12:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](images/java-example-7.png) + +## 步骤13:访问应用 + +- 点击「应用管理」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](images/java-example-8.png) + +- 在浏览器上输入 + +``` +https://tmgkflgdlstl.cloud.sealos.io/getPersons +``` + +![](images/nodejs-example-1.png) + +- 页面上显示之间插入到数据库的数据 ,表示你的 Node.js应用程序已经在 Sealos 上运行 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Python Apps.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Python Apps.md new file mode 100644 index 00000000000..7fb5385bf94 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Python Apps.md @@ -0,0 +1,250 @@ +--- +keywords: [Python程序安装, Docker镜像, Sealos部署, Flask应用, MySQL数据库, 容器化, 云原生应用, 快速部署, 应用管理, 外网访问] +description: 本教程详细介绍如何快速安装Python程序并部署到Sealos云平台。包括编写Flask应用、创建Docker镜像、配置MySQL数据库和使用Sealos进行应用管理与外网访问。 +--- + +# 快速安装 Python 程序 + +首先,确保你已经安装了以下工具: + +- Docker + +## 步骤1:编写你的 Python 程序 + +- 在目录下创建一个名为 `app.py` 的文件,并添加以下代码: + + ```python + from flask import Flask, render_template + import mysql.connector + + app = Flask(__name__) + + def get_data_from_database(): + cnx = mysql.connector.connect( + host="java-demo-db-mysql.ns-7otl3mb2.svc", + user="root", + password="l9h8f24b", + database="test_db" + ) + + cursor = cnx.cursor() + cursor.execute("SELECT * FROM test") + data = cursor.fetchall() + cursor.close() + cnx.close() + + return data + + @app.route('/') + def index(): + data = get_data_from_database() + return render_template('index.html', data=data) + + if __name__ == '__main__': + app.run(host='0.0.0.0', debug=True) + ``` + +- 在项目目录下创建一个名为 `requirements.txt` 的文件,以列出应用程序所需的依赖。 + +``` +Flask +mysql-connector-python +``` + +- 在项目目录中创建一个名为 `templates` 的文件夹,并在其中创建一个名为 `index.html` 的文件。将以下内容添加到 `index.html`: + + ~~~html + + + + + Data from MySQL + + +

Data from MySQL

+ + + + + + + {% for row in data %} + + + + + + {% endfor %} +
Column1Column2Column3
{{ row[0] }}{{ row[1] }}{{ row[2] }}
+ + + ``` + + 请将 `Column1`、`Column2` 和 `Column3` 替换为您要显示的实际列名。 + ~~~ + +## 步骤2:创建 Docker 镜像 + +- 在项目的根目录下,创建一个名为 `Dockerfile` 的文件。这个文件将包含构建 Docker 镜像所需的指令。以下是一个简单的示例 + Dockerfile: + + ```dockerfile + FROM python:3.8 + + WORKDIR /app + + COPY requirements.txt . + + RUN pip install --no-cache-dir -r requirements.txt + + COPY . . + + EXPOSE 5000 + + CMD ["python", "app.py"] + ``` + +## 步骤3:构建 Docker 镜像 + +- 在包含 `Dockerfile` 的目录中运行以下命令来构建 Docker 镜像: + + ``` + docker build -t python-demo . + ``` + +## 步骤4:推送Docker镜像 + +- 将创建的Docker镜像推送到Docker仓库,如Docker Hub或者私有仓库。**假设您已经登录到Docker仓库**,使用以下命令推送镜像 + + - 首先标记Docker镜像,在推送镜像之前,需要为其添加一个标签,以便 Docker 知道将其推送到哪个仓库。运行以下命令为镜像添加标签: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-image-name` 替换为你的本地镜像名称,`your-dockerhub-username` 替换为你的 Docker Hub 用户名, + `your-repo-name` 替换为你在 Docker Hub 上要创建的仓库名称,`your-tag` 替换为你为镜像设置的标签(例如:latest)。 + + 例如: + + ``` + docker tag python-demo damager6666/python-demo:v1 + ``` + + - 接下来推送Docker镜像,使用以下命令将镜像推送到 Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-dockerhub-username`、`your-repo-name` 和 `your-tag` 替换为实际的值。例如: + + ``` + docker push damager6666/python-demo:v1 + ``` + +## 步骤5:登陆 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](images/java-example-0.png) + +## 步骤6:打开 「数据库」 应用 + +![](images/java-example-10.png) + +## 步骤7:创建数据库 + +- 点击新建数据库 + +![](images/java-example-11.png) + +- 基础配置: + - 集群类型:mysql + - 集群名称 : demo-db + - CPU(推荐):1 Core + - 内存(推荐):1 G + - 实例数:1 + - 存储容量: 1 Gi +- 点击 部署集群 + +## 步骤8:配置数据库 + +![](images/java-example-12.png) + +- 点击一键连接到数据库执行以下语句: + + - 创建 test_db 数据库 + + ```sql + create database test_db; + ``` + + - 创建 test 表 + + ```sql + CREATE TABLE `name_info` ( + `id` int(11) NOT NULL, + `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ); + ``` + + - 插入数据 + + ```sql + insert into test values (1,'Sealos'); + ``` + +## 步骤9:打开 「应用管理」 应用 + +![](images/java-example-3.png) + +## 步骤 10:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](images/java-example-4.png) + +## 步骤11:应用部署 + +- 基础配置: + + - 应用名称(自定义):python-demo + - 镜像名:damager6666/python-demo:v1 + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + +![](images/python-example-0.png) + +- 网络配置: + + - 容器暴露端口:5000 + + +- 外网访问:开启 + +![](images/python-example-1.png) + +## 步骤12:部署应用 + +![](images/python-example-2.png) + +## 步骤13:访问应用 + +- 点击「应用管理」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](images/python-example-3.png) + +- 在浏览器上输入外网地址,可以访问到刚刚存入到 MySQL 中的数据,表示程序已经成功 Sealos 上 + + ```http + https://mkqreaqfgwac.cloud.sealos.io/ + ``` + +![](images/python-example-4.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Vue Apps.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Vue Apps.md new file mode 100644 index 00000000000..7916c06f141 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/Quick installation of Vue Apps.md @@ -0,0 +1,149 @@ +--- +keywords: [Vue应用部署, Docker镜像, Sealos云平台, 前端开发, 容器化, 快速部署, 云原生应用, DevOps实践, 微服务架构, 持续集成] +description: 本教程详细介绍如何快速安装Vue应用并部署到Sealos云平台。从Vue CLI创建到Docker镜像构建,再到Sealos上的一键部署,助您轻松实现云原生前端开发。 +--- + +# 快速安装 Vue 程序 + +首先,确保你已经安装了以下工具: + +- Docker +- Node.js +- npm + +## 步骤1:安装 Vue CLI + +```bash +npm install -g @vue/cli +``` + +## 步骤2:使用 Vue CLI 创建一个新项目 + +```bash +vue create my-vue-app +``` + +## 步骤3:使用 Vue CLI 构建项目的生产版本 + +```bash +cd my-vue-app +npm run build +``` + +## 步骤4:创建Docker镜像 + +- 在与my-vue-app目录中,创建一个名为`Dockerfile`的文件,包含以下内容: + +```dockerfile +# 使用 nginx 镜像作为基础镜像 +FROM nginx:1.21-alpine + +# 复制构建的前端文件到 nginx 容器中 +COPY dist/ /usr/share/nginx/html + +# 暴露端口 +EXPOSE 80 + +# 启动 nginx +CMD ["nginx", "-g", "daemon off;"] +``` + +- 在`Dockerfile`所在的目录运行以下命令,为 Vue 应用程序构建 Docker 镜像: + +```bash +docker build -t my-vue-app . +``` + +## 步骤5:推送Docker镜像 + +将创建的Docker镜像推送到Docker仓库,如Docker Hub或者私有仓库。**假设您已经登录到Docker仓库**,使用以下命令推送镜像 + +- 首先标记Docker镜像,在推送镜像之前,需要为其添加一个标签,以便 Docker 知道将其推送到哪个仓库。运行以下命令为镜像添加标签: + + ``` + docker tag your-image-name your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-image-name` 替换为你的本地镜像名称,`your-dockerhub-username` 替换为你的 Docker Hub 用户名,`your-repo-name` + 替换为你在 Docker Hub 上要创建的仓库名称,`your-tag` 替换为你为镜像设置的标签(例如:latest)。 + + 例如: + + ``` + docker tag my-vue-app damager6666/my-vue-app:v1 + ``` + +- 接下来推送Docker镜像,使用以下命令将镜像推送到 Docker Hub: + + ``` + docker push your-dockerhub-username/your-repo-name:your-tag + ``` + + 将 `your-dockerhub-username`、`your-repo-name` 和 `your-tag` 替换为实际的值。例如: + + ``` + docker push damager6666/my-vue-app:v1 + ``` + +## 步骤6:登录 Sealos + +- 进入 [Sealos](https://cloud.sealos.io/) 官网 + +![](images/java-example-0.png) + +## 步骤7:打开 「应用管理」 应用 + +![](images/java-example-3.png) + +## 步骤 8:新建应用 + +- 在 「应用管理」 中,点击「新建应用」来创建一个新的应用。 + +![](images/java-example-4.png) + +## 步骤9:应用部署 + +- 基础配置: + + - 应用名称(自定义):my-vue-app + - 镜像名(**步骤5**中推送的镜像):damager6666/my-vue-app:v1 + - CPU(推荐):1 Core + - 内存(推荐):1 G + +- 部署模式: + + - 实例数(自定义):1 + +![](images/vue-example-0.png) + +- 网络配置: + + - 容器暴露端口:80 + + - 外网访问:开启 + +![](images/vue-example-1.png) + +## 步骤10:部署应用 + +- 点击「部署应用」开始部署应用。 + +![](images/vue-example-2.png) + +## 步骤11:访问应用 + +- 点击「应用管理」查看,当应用的 STATUS 由 Pending 变为 Running,则表明该应用已成功启动。 +- 当 STATUS 为 Running,即可直接访问外网地址。 + +![](images/vue-example-3.png) + +- 在浏览器上输入 + +``` +https://mvpztqzczudy.cloud.sealos.io +``` + +![](images/vue-example-4.png) + +- 页面上显示 ”Hello,Vue.js! “ ,表示你的 Vue 应用程序已经在 Sealos 上运行 + diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-0.png new file mode 100644 index 00000000000..f856ec873a6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-1.png new file mode 100644 index 00000000000..83b3f85e444 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-10.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-10.png new file mode 100644 index 00000000000..7164ba6a31f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-11.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-11.png new file mode 100644 index 00000000000..b1cf562ca8c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-11.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-12.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-12.png new file mode 100644 index 00000000000..6eedee90f87 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-12.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-13.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-13.png new file mode 100644 index 00000000000..3548b505e15 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-13.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-2.png new file mode 100644 index 00000000000..179f4b85a5f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-3.png new file mode 100644 index 00000000000..07db46ce9e6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-4.png new file mode 100644 index 00000000000..670338bb9b0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-5.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-5.png new file mode 100644 index 00000000000..a79b84e285a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-6.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-6.png new file mode 100644 index 00000000000..d5f28559a33 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-7.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-7.png new file mode 100644 index 00000000000..4a14b632edd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-8.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-8.png new file mode 100644 index 00000000000..19a4f0f3276 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-9.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-9.png new file mode 100644 index 00000000000..b5582f255cd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/java-example-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-0.png new file mode 100644 index 00000000000..629be8f5f14 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-1.png new file mode 100644 index 00000000000..83d4acd117f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/nodejs-example-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-0.png new file mode 100644 index 00000000000..86d53a8b85c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-1.png new file mode 100644 index 00000000000..2f03cf92b39 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-2.png new file mode 100644 index 00000000000..19dcda99374 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-3.png new file mode 100644 index 00000000000..54ceb5547f3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-4.png new file mode 100644 index 00000000000..3ffbe07560b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/python-example-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-0.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-0.png new file mode 100644 index 00000000000..648276d1412 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-0.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-1.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-1.png new file mode 100644 index 00000000000..e47a1b27115 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-2.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-2.png new file mode 100644 index 00000000000..dab8d56621b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-3.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-3.png new file mode 100644 index 00000000000..9ac654f2439 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-4.png b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-4.png new file mode 100644 index 00000000000..b0020952109 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/examples/programming-languages/images/vue-example-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/examples/social-communication/install-tailchat.md b/docs/5.0/i18n/zh-Hans/quick-start/examples/social-communication/install-tailchat.md new file mode 100644 index 00000000000..f9d501d4c31 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/examples/social-communication/install-tailchat.md @@ -0,0 +1,183 @@ +--- +keywords: [Tailchat, Sealos, 开源IM, 快速部署, 微服务架构, 企业级应用, MongoDB, Redis, MinIO, 水平扩容] +description: 本文详细介绍如何在Sealos云平台上快速部署Tailchat开源IM应用,包括依赖服务的创建、主应用部署、服务预览及扩容等步骤,助您轻松搭建企业级即时通讯系统。 +--- + +# 快速安装 Tailchat + +[Tailchat](https://tailchat.msgbyte.com/) 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能性。 + +前端微内核架构 + 后端微服务架构 使得 Tailchat 能够驾驭任何定制化/私有化的场景 + +面向企业与私域用户打造,高度自由的群组管理与定制化的面板展示可以让私域主能够更好的展示自己的作品,管理用户,打造自己的品牌与圈子。 + +![](../images/tailchat/0.png) + +## 首先在 [Sealos](https://cloud.sealos.io) 桌面环境中打开「应用管理」 + +![](../images/tailchat/1.png) + +## 新建应用 + +![](../images/tailchat/2.png) + +### 创建依赖 + +`tailchat` 作为企业级的应用,最小依赖: `mongodb`, `redis`, `minio`. + +接下来让我们来一一创建。 + +#### mongodb + +为了方便起见我们固定一个实例,并且为数据库绑定本地存储。 + +使用的镜像是 `mongo:4` + +需要注意的是因为我没有给数据库设置密码,因此不要对外网提供网络服务。容器暴露端口填数据库默认服务端口 `27017` 即可 + +内容如下: + +![](../images/tailchat/3.png) + +点击部署应用提交部署 + +耐心等待一会,就可以看到应用已经启动起来了 + +![](../images/tailchat/4.png) + +> 需要注意的是初始分配的64m对于mongodb来说实在太小了,所以通过变更应用改为了128m。可以随时分配资源大小这也是sealos/k8s很方便的一点 + +#### minio + +接下来我们创建minio, minio是一个开源的对象存储服务。我们同样可以通过`sealos`的点点点来快速创建 + +使用的镜像是: `minio/minio` + +需要注意的是我们要进行一些调整: + +- 暴露端口: 9000 +- 运行命令改为: `minio` +- 命令参数改为: `server /data` +- 设置环境变量: + - MINIO_ROOT_USER: tailchat + - MINIO_ROOT_PASSWORD: com.msgbyte.tailchat +- 本地存储: `/data` + +最终结果如下: + +![](../images/tailchat/5.png) + +点击部署按钮同样看到服务已经正常启动起来了。 + +#### redis + +最后我们需要部署redis作为内容缓存与信息转发。 + +使用镜像: `redis:alpine` + +暴露端口: `6379` + +最终结果如下: + +![](../images/tailchat/6.png) + +### 创建 Tailchat 本体 + +此时Tailchat所需要的依赖均已部署完毕,如下: + +![](../images/tailchat/7.png) + +现在我们来部署 `Tailchat` 本体。 + +`Tailchat` 的本体会相对复杂一点,不过因为`sealos`纯UI操作也不会太过复杂。 + +- 使用镜像: `moonrailgun/tailchat` +- 暴露端口: `11000`(记得要打开外网访问) +- 配置环境变量如下: + ``` + SERVICEDIR=services,plugins + TRANSPORTER=redis://redis:6379 + REDIS_URL=redis://redis:6379 + MONGO_URL=mongodb://mongo/tailchat + MINIO_URL=minio:9000 + MINIO_USER=tailchat + MINIO_PASS=com.msgbyte.tailchat + ``` + +最终效果如下: + +![](../images/tailchat/8.png) + +耐心等待一段时间后可以看到`Tailchat` 服务已经启动起来了 + +![](../images/tailchat/9.png) + +## 预览服务 + +首先我们可以先检查一下`Tailchat`服务的可用性,可以通过外网地址提供的服务后面加上 `/health` 来检查服务可用性, 如: +`https://.cloud.sealos.io/health` + +当启动完毕后,Tailchat服务会返回如下内容: + +![](../images/tailchat/10.png) + +这段json字符串中包含了使用的镜像版本,节点名称,系统占用,微服务加载情况。 + +这里我们可以看到我的常见的服务, 如`user`/`chat.message`以及一些带有插件前缀的服务如`plugin.registry` +都已经正常启动起来了,说明我们的服务端是正常运行的。 + +现在我们可以直接访问我们的外网地址,可以看到经过短暂的加载后,页面正常打开自动跳转到了登录界面。 + +![](../images/tailchat/11.png) + +随便注册一个账号,可以看到我们可以正常进入Tailchat的主界面, 如下图: + +![](../images/tailchat/12.png) + +至此我们的服务已经成功在 sealos 中落地了。 + +## 扩容服务 + +当然,作为一个分布式架构的系统,`Tailchat` 天然是支持水平扩容的。而在 `sealos` 想要实现扩容也非常简单, +只需要通过变更操作修改实例数即可: + +![](../images/tailchat/13.png) + +![](../images/tailchat/14.png) + +![](../images/tailchat/15.png) + +此时当我们访问 `https://.cloud.sealos.io/health` 可以看到我们可以访问到不同的节点 + +![](../images/tailchat/16.png) + +## 添加 Tailchat 入口到桌面 + +打开 Terminal, 输入`vim app.yml`创建并编辑一个配置文件 + +输入以下内容,注意url要换成自己部署的网址 + +```yml +apiVersion: app.sealos.io/v1 +kind: App +metadata: + name: tailchat-app-entry +spec: + name: Tailchat + icon: + type: iframe + data: + url: + desc: + icon: https://tailchat.msgbyte.com/img/logo.svg + menuData: + displayType: normal +``` + +按`esc`退出编辑模式, 按`:wq`保存并退出vim + +输入`kubectl apply -f app.yml`启动配置。 + +完毕后刷新页面,此时我们可以看到我们的入口就出现在`sealos`的桌面上了 + +![](../images/tailchat/17.png) diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-1.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-1.png new file mode 100644 index 00000000000..6fb723004f9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-2.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-2.png new file mode 100644 index 00000000000..00f4cbbb2f1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-3.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-3.png new file mode 100644 index 00000000000..23f6f8e3d56 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-4.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-4.png new file mode 100644 index 00000000000..9c4532f429d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-5.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-5.png new file mode 100644 index 00000000000..3785a81c1d6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-6.png b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-6.png new file mode 100644 index 00000000000..23d46dfb5ad Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/quick-start/images/quick-start-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/quick-start/quick-start.md b/docs/5.0/i18n/zh-Hans/quick-start/quick-start.md new file mode 100644 index 00000000000..783cc4db562 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/quick-start/quick-start.md @@ -0,0 +1,34 @@ +--- +keywords: [Sealos快速部署, Flarum论坛, 开源论坛软件, 应用商店部署, 简洁论坛搭建] +description: 学习如何使用Sealos快速部署Flarum开源论坛。本教程提供详细步骤,从应用商店选择到成功访问论坛,助您轻松搭建简洁高效的社区平台。 +--- + +# 快速开始 + +使用 Sealos 快速部署 Flarum。 + +> Flarum 是一款非常简洁的开源论坛软件。它响应快速、简便易用,拥有打造一片成功的社区所需的所有功能。它也极其可扩展,允许达到终极的可定制性。 + +打开 Sealos 桌面,点击应用商店。 + +![](./images/quick-start-1.png) + +点击 Flarum 应用(左上角搜索栏可以快速查找应用)。 + +![](./images/quick-start-2.png) + +点击部署应用 + +![](./images/quick-start-3.png) + +等待所有组件的状态变为运行中,代表组件启动完毕(可以重新进入当前页面刷新状态)。 + +![](./images/quick-start-4.png) + +返回 Sealos 桌面,点击 Flarum 应用。 + +![](./images/quick-start-5.png) + +成功访问 Flarum。 + +![](./images/quick-start-6.png) diff --git a/docs/5.0/i18n/zh-Hans/sidebar.json b/docs/5.0/i18n/zh-Hans/sidebar.json new file mode 100644 index 00000000000..8c63bb5e6a1 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/sidebar.json @@ -0,0 +1,142 @@ +{ + "version.label": { + "message": "5.0.0", + "description": "The label for version current" + }, + "sidebar.docSidebar.category.Examples": { + "message": "案例", + "description": "The label for category Examples in sidebar docSidebar" + }, + "sidebar.docSidebar.category.ai-applications": { + "message": "AI 应用", + "description": "The label for category ai-applications in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Quick Start": { + "message": "快速开始", + "description": "The label for category Quick Start in sidebar docSidebar" + }, + "sidebar.docSidebar.category.App Deployments": { + "message": "部署应用", + "description": "The label for category App Deployments in sidebar docSidebar" + }, + "sidebar.docSidebar.category.How-to Guides": { + "message": "使用指南", + "description": "The label for category How-to Guides in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Master Services Agreement": { + "message": "服务政策", + "description": "The label for category Master Services Agreement in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Self Hosting": { + "message": "私有化部署", + "description": "The label for the doc item Self Hosting in sidebar docSidebar, linking to the doc Community" + }, + "sidebar.docSidebar.category.User Guide": { + "message": "用户文档", + "description": "The label for category User Guide in sidebar docSidebar" + }, + "sidebar.docSidebar.doc.CronJob": { + "message": "定时任务", + "description": "The label for category CronJob in sidebar docSidebar" + }, + "sidebar.docSidebar.doc.App Store": { + "message": "应用商店", + "description": "The label for category App Store in sidebar docSidebar" + }, + "sidebar.docSidebar.category.App Launchpad": { + "message": "应用管理", + "description": "The label for category App Launchpad in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Database": { + "message": "数据库", + "description": "The label for category Database in sidebar docSidebar" + }, + "sidebar.docSidebar.category.System Function": { + "message": "系统功能", + "description": "The label for category System Function in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Developer Guide": { + "message": "开发者文档", + "description": "The label for category Developer Guide in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos": { + "message": "Sealos 私有云", + "description": "The label for category Sealos Self Hosting in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Kubernetes Lifecycle Management": { + "message": "K8s 集群生命周期管理", + "description": "The label for category Kubernetes Lifecycle Management in sidebar docSidebar" + }, + "sidebar.docSidebar.category.System Design": { + "message": "系统设计", + "description": "The label for category System Design in sidebar docSidebar" + }, + "sidebar.docSidebar.doc.Community": { + "message": "社区", + "description": "The label for the doc item Community in sidebar docSidebar, linking to the doc Community" + }, + "sidebar.docSidebar.category.Operations": { + "message": "操作说明", + "description": "The label for category Operations in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Advanced Guide": { + "message": "进阶指南", + "description": "The label for category Advanced Guide in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Reference": { + "message": "参考", + "description": "The label for category Reference in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealctl 使用指南": { + "message": "Sealctl 使用指南", + "description": "The label for category Sealctl 使用指南 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos 使用指南": { + "message": "Sealos 使用指南", + "description": "The label for category Sealos 使用指南 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos 集群镜像构建": { + "message": "Sealos 集群镜像构建", + "description": "The label for category Sealos 集群镜像构建 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos 镜像仓库": { + "message": "Sealos 镜像仓库", + "description": "The label for category Sealos 镜像仓库 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos 集群镜像运行": { + "message": "Sealos 集群镜像运行", + "description": "The label for category Sealos 集群镜像运行 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.Sealos 命令说明": { + "message": "Sealos 命令说明", + "description": "The label for category Sealos 命令说明 in sidebar docSidebar" + }, + "sidebar.docSidebar.category.baas": { + "message": "后端即服务", + "description": "The label for category baas in sidebar docSidebar" + }, + "sidebar.docSidebar.category.low-code-platform": { + "message": "低代码平台", + "description": "The label for category low-code-platform in sidebar docSidebar" + }, + "sidebar.docSidebar.category.others": { + "message": "其他", + "description": "The label for category others in sidebar docSidebar" + }, + "sidebar.docSidebar.category.dial-testing-system": { + "message": "拨测系统", + "description": "The label for category dial-testing-system in sidebar docSidebar" + }, + "sidebar.docSidebar.category.blog-platform": { + "message": "博客平台", + "description": "The label for category blog-platform in sidebar docSidebar" + }, + "sidebar.docSidebar.category.social-communication": { + "message": " IM 应用", + "description": "The label for category social-communication in sidebar docSidebar" + }, + "sidebar.docSidebar.category.programming-languages": { + "message": "常用语言案例", + "description": "The label for category programming-languages in sidebar docSidebar" + } +} \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/add-domain.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/add-domain.md new file mode 100644 index 00000000000..880981cd1b5 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/add-domain.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 2 +keywords: [自定义域名, Sealos, 应用部署, CNAME解析, 外网访问, 品牌体验, 域名绑定, 云平台] +description: 学习如何在Sealos云平台上为您的应用添加自定义域名,提升品牌形象。本指南涵盖部署时和部署后的域名设置流程,包括CNAME解析和外网访问配置。 +--- + +# 自定义域名 + +想让您的用户能够享受与您的品牌一致的专属体验?只需要在 [Sealos](https://cloud.sealos.io) 中为你的项目指定一个自定义域名。 + +## 部署时接入 + +如果您在部署应用时接入自定义域名,只需要在部署应用时打开「外网访问」,Sealos 会给您的应用自动分配一个外网域名。 + +![](./images/app-launchpad-domain.png) + +然后需要到您的域名服务商处,添加该域名的 `CNAME` 解析到上面分配的外网域名。以阿里云为例: + +![](./images/aliyun-cname.png) + +等待解析生效后即可回到 Sealos 中绑定自定义域名,直接点击右侧的「自定义域名」: + +![](./images/app-launchpad-domain2.png) + +在弹出的界面中输入您的自定义域名,然后点击确认即可。 + +![](./images/app-launchpad-domain3.png) + +最终点击右上角的「部署」开始部署应用,部署完成后点击外网地址即可通过自定义域名访问应用。 + +## 部署完成后接入 + +已经部署完成的应用可以在应用详情页面的右上角点击「变更」,然后参考之前的步骤接入自定义域名即可。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/app-launchpad.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/app-launchpad.md new file mode 100644 index 00000000000..c756679b1fd --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/app-launchpad.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 0 +keywords: [应用管理, Sealos, 容器部署, 弹性伸缩, 持久化存储, 自定义域名, 多端口暴露, 应用监控] +description: Sealos 应用管理工具简化容器部署,支持私有镜像、资源定制、多副本、弹性伸缩等功能。快速部署、监控和优化您的应用,提高效率和性能。 +--- + +# 应用管理 + +**应用管理** 是 Sealos 内置的单镜像部署工具,主要用于简化和加速应用程序的部署过程,可以帮助您在 5 分钟内完成应用的部署和上线。 + +目前「应用管理」具备以下功能: + +- 支持使用私有镜像部署应用; +- 支持根据应用需求,自定义所需的 CPU 和内存资源; +- 支持多副本; +- 弹性伸缩 (HPA); +- 提供外网访问地址,便于公网访问; +- 允许用户为应用配置自定义域名,提高品牌识别度和用户体验; +- ConfigMap 配置文件; +- 应用数据的持久化存储,保障数据的安全性和持续性; +- 提供应用和 Pod 的实时监控,帮助用户及时发现并解决问题; +- 记录和管理应用日志,便于问题追踪和性能分析; +- 分析系统事件(Events),提供关键信息帮助优化应用性能; +- 一键进入容器终端,方便管理和调试; +- 支持将应用的多个端口暴露到外网。 + +## [快速开始](./use-app-launchpad.md) + +快速安装一些比较常见的应用。 + +## [更新应用](./update-app.md) + +应用部署完成后修改应用配置。 + +## [自定义域名](./add-domain.md) + +为应用接入自定义域名。 + +## [暴露多端口](./expose-multi-ports.md) + +将应用的多个端口暴露到外网中。 + +## [环境变量](./environment.md) + +通过环境变量为应用提供配置信息。 + +## [配置文件](./configmap.md) + +通过配置文件为应用提供配置信息。 + +## [弹性伸缩](./autoscale.md) + +通过弹性伸缩来根据负载自动调整应用的实例数量。 + +## [持久化存储](./persistent-volume.md) + +使用持久化存储来保障数据的持久化。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/autoscale.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/autoscale.md new file mode 100644 index 00000000000..264a85f5be3 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/autoscale.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 6 +keywords: [弹性伸缩, Horizontal Pod Autoscaler, HPA, Sealos, 应用管理, 自动调整, CPU使用率, 资源优化, 性能监控, 动态扩缩容] +description: 了解Sealos的弹性伸缩功能如何自动调整应用实例数量,优化资源利用。探索HPA工作原理,实现高效的应用性能管理和资源分配。 +--- + +# 弹性伸缩 + +「[应用管理](/guides/applaunchpad/applaunchpad.md)」可以在 Sealos 集群中自动调整应用的实例数量,以适应不同的负载条件。这个功能叫「 +**弹性伸缩**(Horizontal Pod Autoscaler,简称 HPA)」。 + +「弹性伸缩」通过监测特定的度量指标(如 CPU 使用率或内存使用率)来动态增加或减少应用的实例数量,以确保应用程序运行效率和资源利用的最优化。 + +> 注意:在弹性伸缩的上下文中,提到的“使用率”通常是指应用实例的平均使用率。例如,如果一个应用有两个实例,那么其 CPU 平均使用率将是这两个实例的 CPU 使用率的平均值。 + +弹性伸缩的工作原理: + +1. **监控**:持续监控应用的关键性能指标,如 CPU 使用率或内存使用量。 +2. **决策**:根据设定的目标(例如 CPU 使用率不超过 50%),系统会计算出为了达到这一目标所需增加或减少的应用实例数量。 +3. **调整**:基于计算结果,弹性伸缩会自动指示 Sealos 的控制器增加或减少应用实例的数量,以保持资源使用率在预定目标范围内。 + +假设我们为一个应用设置了如下规则:CPU 使用率不得超过 50%,实例数量可在 1 至 5 之间变动。在这种设定下,弹性伸缩将会: + +- 当应用的平均 CPU 使用率超过 50% 时,系统会增加实例数量,最多增至 5 个。 +- 当应用的平均 CPU 使用率低于 50% 时,系统会减少实例数量,但至少保持 1 个实例运行。 + +![](./images/autoscale.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/configmap.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/configmap.md new file mode 100644 index 00000000000..9c5fed13e8a --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/configmap.md @@ -0,0 +1,20 @@ +--- +sidebar_position: 5 +keywords: [Sealos配置文件, 应用程序配置管理, 容器配置注入, Nginx容器配置, 应用行为调整] +description: 探索Sealos应用程序中配置文件的重要性和优势。了解如何使用配置文件灵活管理复杂配置数据,并以Nginx容器为例说明配置文件的应用。 +--- + +# 配置文件 + +在 [Sealos](https://cloud.sealos.io) +应用程序中,配置文件的使用非常重要,尤其是当应用程序需要处理大量或复杂的配置信息时。与环境变量相比,配置文件可以提供一种更灵活、更可靠的配置管理方式。环境变量更适合用于传递少量、简单的配置数据。 + +配置文件的主要优势在于其能够存储和管理复杂的配置数据,这些配置数据可以包含配置文件、命令行参数、环境变量等信息。这些数据可以在应用容器启动时注入到容器中,从而允许你对应用程序的行为进行调整,而无需重新构建镜像。 + +下面以 Nginx 容器为例,说明如何使用配置文件来调整应用的行为: + +- **文件名**: 对应 Nginx 容器里的文件,可以参考镜像提供者给出的说明。 +- **文件值**: 文件对应的内容。如果内容过于复杂,建议在本地编辑完成后,再复制粘贴到相应位置。 +- **注意事项**:配置文件是挂载单个文件,而不是挂载目录。你需要明确指定要挂载的具体文件,而非仅仅指定一个目录路径。 + +![](./images/applaunchpad13.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/environment.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/environment.md new file mode 100644 index 00000000000..fb474a5710d --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/environment.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 4 +keywords: [Sealos环境变量, 容器应用配置, 应用管理, 环境变量格式, 键值对设置, 应用可维护性, 应用可扩展性, 批量输入, 环境变量解析] +description: 探索Sealos中环境变量的重要性及其在容器应用配置中的应用。学习如何通过批量输入定义环境变量,提高应用的可维护性和可扩展性。 +--- + +# 环境变量 + +在 [Sealos](https://cloud.sealos.io) +中,环境变量扮演着至关重要的角色,它们是管理容器应用配置数据的关键工具。通过使用环境变量,可以为应用提供必要的配置信息,而无需直接修改应用的代码或其镜像,从而提高应用的可维护性和可扩展性。 + +在「[应用管理](/guides/applaunchpad/applaunchpad.md) +」界面,环境变量是通过批量输入的方式来定义的。用户可以通过按行输入的方式来定义多个环境变量,其中每个环境变量由键(key)和值(value)组成,两者之间可以使用等号(=)或冒号(: +)作为分隔符,「[应用管理](/guides/applaunchpad/applaunchpad.md)」会自动清除键(key)中的无效字符,以确保环境变量的正确性和有效性。 + +![](./images/applaunchpad12.png) + +**可正常解析的环境变量格式:** + +```bash +host=127.0.0.1 +port:3000 +name: sealos +- username=123 +- password:123 +# 这一行的注释会被忽略。因为不包含等号(=)或冒号(:)这两种标记字符。 +``` + +**不可解析的环境变量格式:** + +```bash +host=127.0.0.1 # 这一行会被解析,因为包含了等号(=)或冒号(:)这两种标记字符。这里的注释也会被解析,因为前面已经有等号(=)了。 +``` \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/expose-multi-ports.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/expose-multi-ports.md new file mode 100644 index 00000000000..b902918db63 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/expose-multi-ports.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 3 +keywords: [多端口暴露, Sealos应用管理, 网络配置, 公网访问, 多协议支持, 应用多功能, 兼容性, Prometheus监控, GRPC服务] +description: 了解如何在Sealos平台上轻松配置应用的多端口暴露,支持多协议、多功能和监控需求,并获得独立二级域名实现便捷的公网访问。 +--- + +# 暴露多端口 + +在复杂的应用环境中,经常需要应用服务同时暴露多个端口以满足不同的需求。这种需求可能出现在多种场景下: + ++ **多协议支持**:例如,一个应用可能同时支持 HTTP 和 HTTPS 协议,需要暴露 80 和 443 端口。 ++ **应用的多功能**:例如,一个应用可能有一个 Web 服务和一个 Admin 服务,它们分别监听不同的端口。 ++ **兼容性考虑**:为了与旧版本或其他服务兼容,可能需要同时暴露新旧两种接口的端口。 ++ **Prometheus 监控和应用服务**:如果你的应用既有业务端口,又有一个用于 Prometheus 监控的 `/metrics` 端口,你可能需要同时暴露两者。 ++ **GRPC 和 RESTful 服务并存**:如果你的应用同时提供 GRPC 和 RESTful 服务,你可能需要为每种服务类型暴露不同的端口。 + +[Sealos](https://cloud.sealos.io) 在使用「[应用管理](/guides/applaunchpad/applaunchpad.md) +」部署应用时,可以轻松地选择暴露多个端口。在部署应用的过程中,用户只需要点击「网络配置」选项,然后选择「添加端口」,即可实现多端口的配置。 + +![](./images/multi-ports1.png) + +此外,Sealos 平台还提供了端口的外网访问功能。一旦暴露到公网,每一个暴露的端口都会被分配一个独立的二级域名,使得用户可以更方便地进行远程访问和管理。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/11.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/11.png new file mode 100644 index 00000000000..a4ba0152400 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/aliyun-cname.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/aliyun-cname.png new file mode 100644 index 00000000000..54651df5931 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/aliyun-cname.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain.png new file mode 100644 index 00000000000..9e88bb76dc3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain2.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain2.png new file mode 100644 index 00000000000..b5a9dd12dc4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain3.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain3.png new file mode 100644 index 00000000000..5eb0377da0e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/app-launchpad-domain3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad1.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad1.png new file mode 100644 index 00000000000..0e2d87f9612 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad10.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad10.png new file mode 100644 index 00000000000..37bbf7ab57d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad10.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad11.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad11.png new file mode 100644 index 00000000000..ceeb631f312 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad12.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad12.png new file mode 100644 index 00000000000..a0189b569ab Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad12.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad13.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad13.png new file mode 100644 index 00000000000..9317aa9f5c5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad13.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad14.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad14.png new file mode 100644 index 00000000000..a7551be2882 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad14.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad2.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad2.png new file mode 100644 index 00000000000..01639505990 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad3.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad3.png new file mode 100644 index 00000000000..fd28e1f9fb6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad4.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad4.png new file mode 100644 index 00000000000..82b4603f4ca Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad5.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad5.png new file mode 100644 index 00000000000..c4f8f7c33d9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad6.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad6.png new file mode 100644 index 00000000000..6019b61ca10 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad7.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad7.png new file mode 100644 index 00000000000..73fcdcc39cf Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad8.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad8.png new file mode 100644 index 00000000000..227d5f1b8cf Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad8.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad9.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad9.png new file mode 100644 index 00000000000..77eb0919f86 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/applaunchpad9.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/autoscale.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/autoscale.png new file mode 100644 index 00000000000..e8b4907448f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/autoscale.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/multi-ports1.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/multi-ports1.png new file mode 100644 index 00000000000..ab08b16299b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/multi-ports1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/persistent-volume.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/persistent-volume.png new file mode 100644 index 00000000000..b904addd338 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/persistent-volume.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert1.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert1.png new file mode 100644 index 00000000000..373e56b2bee Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert2.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert2.png new file mode 100644 index 00000000000..b7ea59eed18 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert3.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert3.png new file mode 100644 index 00000000000..0fddf457489 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert4.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert4.png new file mode 100644 index 00000000000..aa4fc627bc1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/set-cert4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-1.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-1.png new file mode 100644 index 00000000000..53d586c7fc5 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-10.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-10.png new file mode 100644 index 00000000000..8e477e550a4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-10.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-11.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-11.png new file mode 100644 index 00000000000..49ab8b95ae3 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-12.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-12.png new file mode 100644 index 00000000000..5f1da8a47b4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-12.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-2.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-2.png new file mode 100644 index 00000000000..a9461aae6b7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-3.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-3.png new file mode 100644 index 00000000000..2f2429e965d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-4.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-4.png new file mode 100644 index 00000000000..355cd126eec Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-5.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-5.png new file mode 100644 index 00000000000..8948883dd40 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-6.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-6.png new file mode 100644 index 00000000000..834cb08f40d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-7.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-7.png new file mode 100644 index 00000000000..7154f775b5d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-8.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-8.png new file mode 100644 index 00000000000..2c57fd60b2e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-8.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-9.png b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-9.png new file mode 100644 index 00000000000..b904addd338 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/images/use-app-launchpad-9.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/persistent-volume.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/persistent-volume.md new file mode 100644 index 00000000000..9b439489978 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/persistent-volume.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 7 +keywords: [持久化存储, Sealos, 容器数据, 数据持久性, 外挂存储, Nextcloud, 数据库, 文件存储系统] +description: 了解Sealos中的持久化存储如何解决容器数据丢失问题。学习使用外挂存储确保数据库、文件系统等关键数据的安全性,以Nextcloud为例展示实际应用。 +--- + +# 持久化存储 + +在 [Sealos](https://cloud.sealos.io) +中,容器可以轻松地被创建和销毁。虽然这为部署和管理应用带来了灵活性,但它也带来了数据持久性的挑战。如果应用在容器内部存储数据,那么当容器被销毁时,所有存储在容器内的数据也会丢失。 + +持久化存储可以确保数据存储在容器外部,即使在容器重启或重新部署的情况下也能保证数据不会丢失。**如果你的应用需要保留数据(例如数据库、文件存储系统或任何存储用户数据的服务),一定要使用持久化存储!** + +假设你要部署一个 Nextcloud,Nextcloud 容器的所有数据都存储在 `/var/www/html` 这个目录下,因此我们需要将该目录下的数据通过外挂存储进行持久化。 + +![](./images/persistent-volume.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/set-cert.md b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/set-cert.md new file mode 100644 index 00000000000..05aa054b0f7 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/app-launchpad/set-cert.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 8 +keywords: [自定义域名证书, Sealos, 应用管理, cert-manager, Kubernetes, Ingress, TLS Secret, CNAME设置, 证书配置, 域名访问] +description: 学习如何在Sealos平台上为自定义域名设置证书,解决cert-manager签发失败问题。包括创建TLS Secret、修改Ingress配置等步骤,确保安全访问您的应用。 +--- + +# 设置自定义域名证书 + +在「应用管理」中成功设置自定义域名,但是无法访问域名并显示证书不安全。 这是因为 cert-manager 没有成功签发证书。为了解决这个问题,我们可以手动设置证书。 + +首先,确认在云厂商中成功设置 CNAME,并且下载域名对应的证书。 + +打开「应用管理」,设置自定义域名。 + +![](./images/set-cert1.png) + +打开「终端」,依次执行以下命令。 + +```bash +# 用证书文件信息创建 tls.crt(使用证书文件信息替换掉 xxxx) +cat > tls.crt < tls.key <的最大连接数 | +| max_wal_size | 设置WAL文件的最大大小 | +| min_wal_size | 设置WAL文件的最小大小 | +| max_worker_processes | 设置PostgreSQL可以启动
的最大后台进程数 | +| shared_buffers | 设置PostgreSQL可以启动
的最大后台进程数 | + +**常见的mysql参数**: + +| 参数名 | 描述 | +|-------------------------|----------------| +| innodb_buffer_pool_size | 设置InnoDB缓冲池的大小 | +| max_connections | 允许的最大并发连接数 | +| query_cache_size | 查询缓存的大小 | +| thread_cache_size | 线程缓存的大小 | +| max_allowed_packet | 最大数据包大小 | +| innodb_log_file_size | InnoDB日志文件的大小 | + +**常见的mongo参数**: + +| 参数名 | 描述 | +|-------------------------|----------| +| storage.dbPath | 数据文件存放路径 | +| storage.journal.enabled | 启用日志 | +| net.port | 服务器端口 | +| net.bindIp | 绑定的IP地址 | + +**常见的redis参数**: + +| 参数名 | 描述 | +|------------------|-----------| +| maxclients | 最大客户端连接数 | +| maxmemory | 最大内存使用量 | +| maxmemory-policy | 内存淘汰策略 | +| appendonly | AOF持久化开关 | +| appendfsync | AOF文件刷新频率 | + +4. **应用pg-config.yaml**: + +```bash +$ kubectl apply -f pg-config.yaml +``` + +![config_4](./imgs/config_4.png) + +5. **检查pg-config.yaml是否应用成功**: + +```bash +# OpsRequest中对应的状态为Succeed且pod对应的状态为Running则说明配置应用成功 +$ kubectl get OpsRequest +$ kubectl get pod +``` + +![config_5](./imgs/config_5.png) + +6. **进入数据库查看配置是否生效**: + +```bash +$ show max_connections; +``` + +![config_6](./imgs/config_6.png) +![config_7](./imgs/config_7.png) + diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_1.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_1.png new file mode 100644 index 00000000000..d8c8c62be3a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_2.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_2.png new file mode 100644 index 00000000000..4bd234485bf Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_3.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_3.png new file mode 100644 index 00000000000..1f6d2ff3383 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_4.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_4.png new file mode 100644 index 00000000000..02f9a61eddd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_5.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_5.png new file mode 100644 index 00000000000..412e0bbe7fc Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_6.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_6.png new file mode 100644 index 00000000000..5f49dd84f12 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_7.png b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_7.png new file mode 100644 index 00000000000..88f930a876f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/config-docs/imgs/config_7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/database.md b/docs/5.0/i18n/zh-Hans/user-guide/database/database.md new file mode 100644 index 00000000000..6f898fe1803 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/database/database.md @@ -0,0 +1,211 @@ +--- +sidebar_position: 0 +keywords: [Sealos数据库, 数据库集群部署, PostgreSQL, MySQL, 数据库连接, 数据库备份, 数据库迁移, 数据库高可用, 可视化管理, 外网访问] +description: Sealos提供强大的数据库集群部署管理工具,支持多种数据库类型,具备弹性伸缩、备份、监控、迁移和高可用等功能,轻松实现数据库的快速部署和高效管理。 +--- + +# 数据库 + +数据库是一个应用的核心组成,Sealos 提供了一个数据库集群部署管理工具,可以帮助你快速部署数据库集群。目前支持 +MySQL、PostgreSQL、MongoDB、Redis、Kafka 等。目前数据库支持如下特性。 + ++ 弹性伸缩 ++ 支持多版本、多类型数据库 ++ 数据库连接:一键连接、外网访问 ++ 数据库备份:手动备份、自动备份 ++ 数据库监控:资源、状态、性能监控 ++ 数据库迁移:公网迁移、文件迁移 ++ 数据库高可用:支持多个 数据库 实例 ++ 可视化数据库管理:新建、删除、更新 、暂停、重启 数据库 + +## 快速开始 + +只需 6 步即可部署和访问一个 PostgreSQL 数据库。 + +1、打开 Sealos 桌面,点击数据库。 + +![start_1](./imgs/start_1.png) + +2、点击新建集群。 + +![start_2](./imgs/start_2.png) + +3、填写数据库名并选择对应的数据库和参数。 + +![start_3](./imgs/start_3.png) + +4、点击部署。 + +![start_4](./imgs/start_4.png) + +5、查看数据库详情信息。 + +![start_5](./imgs/start_5.png) + +6、数据库详情界面。 + +![start_6](./imgs/start_6.png) + +![start_7](./imgs/start_7.png) + +![start_8](./imgs/start_8.png) + +![start_9](./imgs/start_9.png) + +![start_10](./imgs/start_10.png) + +![start_11](./imgs/start_11.png) + +![start_12](./imgs/start_12.png) + +## 数据库连接 + +### 一键连接 + +1、进入数据库,点击连接。 + +![connect_1](./imgs/connect_1.png) + +2、在终端操作数据库。 + +![connect_2](./imgs/connect_2.png) + +### 外网访问 + +1、进入 数据库 ,开启外网访问。 + +![connect_3](./imgs/connect_3.png) + +2、确认开启。 + +![connect_4](./imgs/connect_4.png) + +3、复制数据库连接信息。 + +![connect_5](./imgs/connect_5.png) + +4、在数据库连接工具中连接数据库。 + +![connect_6](./imgs/connect_6.png) + +![connect_7](./imgs/connect_7.png) + +## 数据库备份 + +### 手动备份 + +1、进入数据库备份界面,点击备份。 + +![backup_1](./imgs/backup_1.png) + +2、填写备份信息,开始备份。 + +![backup_2](./imgs/backup_2.png) + +3、查看备份状态。 + +![backup_3](./imgs/backup_3.png) + +![backup_4](./imgs/backup_4.png) + +### 自动备份 + +1、进入数据库备份界面,点击备份。 + +![backup_5](./imgs/backup_5.png) + +2、开启自动备份,填写备份信息。 + +![backup_6](./imgs/backup_6.png) + +## 数据库迁移 + +以 MySQL 数据库为例,介绍 数据库迁移 的过程。 + +### 公网迁移 + +公网迁移涉及两个数据库:源数据库、目标数据库。源数据库是迁移的数据来源,目标数据库是迁移的数据目的地。以下介绍中以本地数据库做为源数据库进行演示。 + +1、进入目标数据库,连接目标数据库。 + +![migration_1](./imgs/migration_1.png) + +2、在终端界面中创建对应的 database(如果已经存在对应的 database,则跳过这一步)。 + +![migration_2](./imgs/migration_2.png) + +```bash +# 创建数据库sql语句,示例: +$ create database testmysql; +``` + +3、进入目标数据库公网迁移界面,点击迁移按钮。 + +![migration_3](./imgs/migration_3.png) + +4、查看迁移配置信息。 + +![migration_4](./imgs/migration_4.png) + +复制迁移配置信息。 + +```bash +# 设置配置信息sql语句,示例: +$ set global binlog_format=ROW; +$ set binlog_row_image ='FULL'; +``` + +5、在源数据库中执行设置配置信息(MySQL、Postgres 需要手动配置信息,Mongo 不需要进行配置)。 + +```bash +# 设置配置信息sql语句,示例: +$ set global binlog_format=ROW; +$ set binlog_row_image ='FULL'; +``` + +![migration_5](./imgs/migration_5.png) + +6、进入目标数据库,填写源数据库的迁移信息,要迁移哪些表,并填写要迁移到目标数据库中哪个 database。 + +![migration_6](./imgs/migration_6.png) + +如果需要持续从源数据库迁移数据,可开启高级配置中的持续迁移。 + +![migration_7](./imgs/migration_7.png) + +7、查看迁移任务信息。 + +![migration_8](./imgs/migration_8.png) + +8、进入目标数据库,连接目标数据库,检查迁移数据是否完整。 + +![migration_9](./imgs/migration_9.png) + +### 文件迁移 + +1、进入目标数据库,连接目标数据库。 + +![migration_10](./imgs/migration_10.png) + +2、在终端界面中创建对应的 database(如果已经存在对应的 database,则跳过这一步)。 + +```bash +# 创建数据库sql语句,示例: +$ create database testmysql; +``` + +![migration_11](./imgs/migration_11.png) + +3、上传迁移文件、填写数据库名,开始迁移。 + +![migration_12](./imgs/migration_12.png) + +4、文件迁移中,等待迁移结果。 + +![migration_13](./imgs/migration_13.png) + +![migration_14](./imgs/migration_14.png) + +5、连接数据库,检查迁移数据是否完整。 + +![migration_15](./imgs/migration_15.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_1.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_1.png new file mode 100644 index 00000000000..8c9e8c50867 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_2.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_2.png new file mode 100644 index 00000000000..02f239da516 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_3.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_3.png new file mode 100644 index 00000000000..e0d5dca8c2e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_4.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_4.png new file mode 100644 index 00000000000..58c37d7c5d2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_5.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_5.png new file mode 100644 index 00000000000..8c9e8c50867 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_6.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_6.png new file mode 100644 index 00000000000..48b20cf2b8c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/backup_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_1.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_1.png new file mode 100644 index 00000000000..52c6879b4d2 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_2.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_2.png new file mode 100644 index 00000000000..76215ce1c9a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_3.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_3.png new file mode 100644 index 00000000000..0a205d4a362 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_4.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_4.png new file mode 100644 index 00000000000..a1a4366d15c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_5.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_5.png new file mode 100644 index 00000000000..0b4a3b398f7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_6.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_6.png new file mode 100644 index 00000000000..3125cbb7bf1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_7.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_7.png new file mode 100644 index 00000000000..e8bce07c9cd Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/connect_7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_1.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_1.png new file mode 100644 index 00000000000..d5527ccf511 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_10.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_10.png new file mode 100644 index 00000000000..d5527ccf511 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_10.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_11.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_11.png new file mode 100644 index 00000000000..89525529685 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_12.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_12.png new file mode 100644 index 00000000000..12561fb4eba Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_12.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_13.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_13.png new file mode 100644 index 00000000000..074b4882b95 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_13.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_14.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_14.png new file mode 100644 index 00000000000..409e77e907a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_14.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_15.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_15.png new file mode 100644 index 00000000000..54589726b67 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_15.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_2.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_2.png new file mode 100644 index 00000000000..89525529685 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_3.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_3.png new file mode 100644 index 00000000000..2bc1d55549e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_4.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_4.png new file mode 100644 index 00000000000..9a49e93f1b6 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_5.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_5.png new file mode 100644 index 00000000000..e9b0d128758 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_6.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_6.png new file mode 100644 index 00000000000..271c5bafd8b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_7.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_7.png new file mode 100644 index 00000000000..77841165996 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_8.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_8.png new file mode 100644 index 00000000000..3202d5031fb Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_8.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_9.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_9.png new file mode 100644 index 00000000000..54589726b67 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/migration_9.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_1.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_1.png new file mode 100644 index 00000000000..1282c5c85d7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_10.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_10.png new file mode 100644 index 00000000000..6e10d9cedd0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_10.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_11.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_11.png new file mode 100644 index 00000000000..633705ae905 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_12.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_12.png new file mode 100644 index 00000000000..f08ae8c081d Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_12.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_2.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_2.png new file mode 100644 index 00000000000..016fe962470 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_3.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_3.png new file mode 100644 index 00000000000..f687bb3cda4 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_4.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_4.png new file mode 100644 index 00000000000..175419decad Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_5.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_5.png new file mode 100644 index 00000000000..da9edd9ca8c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_6.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_6.png new file mode 100644 index 00000000000..e61a8d5befb Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_7.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_7.png new file mode 100644 index 00000000000..63aeada4ce9 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_8.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_8.png new file mode 100644 index 00000000000..8e2d489183a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_8.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_9.png b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_9.png new file mode 100644 index 00000000000..cbb8d4a36ce Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/database/imgs/start_9.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-1.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-1.png new file mode 100644 index 00000000000..ae364749ff7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-2.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-2.png new file mode 100644 index 00000000000..fd26d149699 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-3.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-3.png new file mode 100644 index 00000000000..bf6d3a713e1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-4.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-4.png new file mode 100644 index 00000000000..1d051c97977 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-5.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-5.png new file mode 100644 index 00000000000..2c090d3eb5c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-6.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-6.png new file mode 100644 index 00000000000..80f11b12ecc Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-7.png b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-7.png new file mode 100644 index 00000000000..f3446edd301 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/images/kubepanel-7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/kubepanel.md b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/kubepanel.md new file mode 100644 index 00000000000..a24bd8518e0 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/kubepanel/kubepanel.md @@ -0,0 +1,44 @@ +--- +keywords: [Kubepanel, Kubernetes IDE, 集群管理, 资源可视化, Sealos, 部署资源, Workload, Config, Network, Storage] +description: Kubepanel是一款用户友好的Kubernetes IDE,提供图形界面管理集群、实时监控和资源可视化。本文介绍如何使用Kubepanel查看和部署Kubernetes资源。 +--- + +# Kubepanel + +Kubepanel 是一个款 Kubernetes IDE(集成开发环境)。它提供了一个用户友好的图形界面来管理 Kubernetes +集群,具有实时监控和资源可视化管理的功能。它旨在使 Kubernetes 更加易于访问和管理,即使对于那些不太熟悉 Kubernetes +命令行工具的人也是如此。 + +## 快速开始 + +打开 Sealos 桌面,点击 Kubepanel。 + +![](images/kubepanel-1.png) + +### 查看资源 + +Kubepanel 内可以查看 Workload、Config、Network 和 Storage 资源。 + +![](images/kubepanel-2.png) + +### 部署资源 + +点击➕加号。 + +![](images/kubepanel-3.png) + +需要先选择一个模板,然后才可以编写资源 YAML。 + +![](images/kubepanel-4.png) + +这里选择了 Deployment 模板,点击 Create 创建 Deployment 资源。 + +![](images/kubepanel-5.png) + +创建成功后,可以在 Workload/Deployments 中看到该 Deployment 资源。 + +![](images/kubepanel-6.png) + +也支持对资源进行删除或者更新操作。 + +![](images/kubepanel-7.png) diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/1.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/1.png new file mode 100644 index 00000000000..5b728e6ba75 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/10.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/10.png new file mode 100644 index 00000000000..ce6822c8da0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/10.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/11.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/11.png new file mode 100644 index 00000000000..b303afd8c8f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/11.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/12.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/12.png new file mode 100644 index 00000000000..c392cf2cad7 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/12.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/13.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/13.png new file mode 100644 index 00000000000..e3cc905cd04 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/13.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/14.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/14.png new file mode 100644 index 00000000000..33ed05150a0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/14.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/15.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/15.png new file mode 100644 index 00000000000..c1da8b15896 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/15.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/16.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/16.png new file mode 100644 index 00000000000..d696f401914 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/16.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/17.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/17.png new file mode 100644 index 00000000000..e7a88fb904f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/17.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/2.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/2.png new file mode 100644 index 00000000000..b512a3ae81e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/3.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/3.png new file mode 100644 index 00000000000..b628c0ef664 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/4.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/4.png new file mode 100644 index 00000000000..51c5c50eb83 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/5.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/5.png new file mode 100644 index 00000000000..ff565585d89 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/6.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/6.png new file mode 100644 index 00000000000..47ae1c00d7e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/7.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/7.png new file mode 100644 index 00000000000..0d81b2eb3ef Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/7.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/8.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/8.png new file mode 100644 index 00000000000..eecf2147932 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/8.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/9.png b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/9.png new file mode 100644 index 00000000000..6ba91e30a63 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/images/9.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/objectstorage.md b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/objectstorage.md new file mode 100644 index 00000000000..71327df3183 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/objectstorage/objectstorage.md @@ -0,0 +1,209 @@ +--- +keywords: [对象存储, Sealos, 存储桶, 文件上传, SDK访问, 静态托管, 访问权限, Go Client, Java Client, 公共读写] +description: 探索Sealos对象存储服务:文件管理、权限控制、SDK集成和静态托管。轻松上传、下载文件,自定义访问权限,并使用Go和Java SDK实现高效存储操作。 +--- + +# 对象存储 + +对象存储是 Sealos 内置的对象存储服务,主要用于存储和管理非结构化数据。 + +目前对象存储具备以下功能: + +- 上传文件到存储桶; +- 从存储桶下载文件; +- 公开存储桶的访问权限; +- 使用 SDK 访问存储桶; +- 监控存储桶资源指标; +- 静态托管。 + +## 快速开始 + +打开 Sealos 桌面,点击对象存储。 + +![](./images/1.png) + +### 上传文件 + +点击创建存储桶。 + +![](./images/2.png) + +输入存储桶的名字,设置存储桶的权限。 + +存储桶权限说明: + +- private:私有桶,不开放访问; +- publicRead:共享存储桶,开放公共读功能; +- publicReadwrite:共享存储桶,开放公共读写功能。 + +![](./images/3.png) + +存储桶创建成功。 + +![](./images/4.png) + +上传文件。 + +![](./images/5.png) + +上传文件成功。 + +![](./images/6.png) + +## 公开存储桶的访问权限 + +点击编辑。 + +![](./images/7.png) + +设置存储桶权限为 publicRead,点击应用。 + +![](./images/8.png) + +复制文件链接。 + +![](./images/9.png) + +粘贴到浏览器地址栏访问文件。 + +![](./images/10.png) + +## 查看访问密钥配置 + +对象存储用户由唯一的 Access Key(用户名)和对应的 Secret Key(密码)组成。Internal 为对象存储的内部访问地址,External +为对象存储的外部访问地址。 + +![](./images/11.png) + +## 使用 SDK 访问存储桶 + +SDK 访问存储桶需要三个参数:AccessKey、SecretKey、Endpoint。参数都在访问密钥中,Internal 是内网地址 Endpoint,External 是外网地址 +Endpoint。如果需要使用 Region 参数,默认使用 us-east-1。 + +### Go Client SDK + +详细文档参考:https://min.io/docs/minio/linux/developers/go/API.html + +例子:使用 Go Client SDK 上传 style.css 文件到 sv3dd7u4-test 存储桶,将 Endpoint 设置为外网地址 External。如果服务部署在当前 +K8s 集群内,可以将 Endpoint 改为内网地址 Internal。 + +```go +package main + +import ( + "context" + "fmt" + "log" + "os" +) +import "github.com/minio/minio-go/v7" +import "github.com/minio/minio-go/v7/pkg/credentials" + +func main() { + endpoint := "objectstorageapi.xxx.xxx.xxx" + accessKey := "xxxxxxxx" + secretKey := "xxxxxxxxxxxxxxxx" + // init minio client + minioClient, err := minio.New(endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKey, secretKey, ""), + }) + if err != nil { + log.Fatalln(err) + } + // get local file + file, err := os.Open("./style.css") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + fileStat, err := file.Stat() + if err != nil { + fmt.Println(err) + return + } + // put object + uploadInfo, err := minioClient.PutObject(context.Background(), "sv3dd7u4-test", "style.css", file, fileStat.Size(), minio.PutObjectOptions{ContentType: "text/css"}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Successfully uploaded bytes: ", uploadInfo) +} +``` + +文件上传成功。 + +![](./images/12.png) + +### Java Client SDK + +详细文档参考:https://min.io/docs/minio/linux/developers/java/API.html + +例子:使用 Java Client SDK 上传 style1.css 文件到 sv3dd7u4-test 存储桶,将 Endpoint 设置为外网地址 External。如果服务部署在当前 +K8s 集群内,可以将 Endpoint 改为内网地址 Internal。 + +```xml + + + io.minio + minio + 8.5.9 + +``` + +```javascript +package org.example; + +import io.minio.MinioClient; +import io.minio.UploadObjectArgs; + +public class FileUploader { + public static void main(String[] args) throws Exception { + + MinioClient minioClient = + MinioClient.builder() + .endpoint("https://objectstorageapi.xxx.xxx.xxx") + .credentials("xxxxxxxx", "xxxxxxxxxxxxxxxx") + .build(); + + + minioClient.uploadObject( + UploadObjectArgs.builder() + .bucket("sv3dd7u4-test") + .object("style1.css") + .filename("src/main/java/org/example/style1.css") + .build()); + + System.out.println("Successfully uploaded bytes."); + } +} +``` + +文件上传成功。 + +![](./images/13.png) + +### 其他语言 SDK 略 + +详细文档参考:https://min.io/docs/minio/linux/developers/minio-drivers.html + +## 静态托管 + +创建一个权限为 publicRead/publicReadwrite 的存储桶,点击打开托管。 + +![](./images/14.png) + +点击地址跳转访问。 + +![](./images/15.png) + +点击自定义域名。 + +![](./images/16.png) + +跳转到应用管理的变更中,可以自定义域名。 + +![](./images/17.png) + diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/cost-center.md b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/cost-center.md new file mode 100644 index 00000000000..8e9e451d895 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/cost-center.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 1 +keywords: [费用中心, Sealos, 账单概览, 资源分析, 计价标准, 开具发票, 成本管理, 云计算费用, 资源配额, 账单明细] +description: Sealos费用中心提供全面的成本管理功能,包括账单概览、资源分析、计价标准等模块,助您轻松掌控云计算支出,优化资源配置。 +--- + +# 费用中心 + +费用中心包含五个模块:账单概览、账单明细、资源分析、计价标准和开具发票。 + +账单概览和账单明细展示账户的总体收支情况和各应用的支出,资源分析显示各资源的支出占比,计价标准解释定价信息,而开具发票模块则支持为充值生成发票。 + +## 快速开始 + +打开 Sealos 桌面,点击费用中心。 + +![](./images/cost-center-1.png) + +### 首页 + +展示了所有可用区的成本趋势图和年度收支图。 + +![](./images/cost-center-2.png) + +### 账单概览和账单明细 + +支持快速查找账单,并支持通过设置时间范围、可用区、工作空间、应用类型和应用名称来筛选。 + +![](./images/cost-center-3.png) + +### 资源分析 + +展示了资源配额和成本分布图,并支持通过设置时间范围、可用区、工作空间、应用类型和应用名称来筛选。 + +![](./images/cost-center-4.png) + +### 计价标准 + +展示了资源定价,并支持通过设置可用区进行筛选。 + +![](./images/cost-center-5.png) + +### 开具发票 + +支持为充值订单申请开具发票。 + +![](./images/cost-center-6.png) \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-1.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-1.png new file mode 100644 index 00000000000..db317fd8511 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-2.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-2.png new file mode 100644 index 00000000000..a497e45e629 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-3.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-3.png new file mode 100644 index 00000000000..ef5cf7fe981 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-4.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-4.png new file mode 100644 index 00000000000..e7c11f0ed0e Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-5.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-5.png new file mode 100644 index 00000000000..cb165121c97 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-6.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-6.png new file mode 100644 index 00000000000..20755ecf55a Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/cost-center/images/cost-center-6.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/system-function.md b/docs/5.0/i18n/zh-Hans/user-guide/system-function/system-function.md new file mode 100644 index 00000000000..db067977bf2 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/system-function/system-function.md @@ -0,0 +1,15 @@ +--- +sidebar_position: 0 +keywords: [Sealos系统功能, 费用中心, 工作空间, 工单系统, 团队协作, 账单管理, 发票开具, 问题反馈] +description: 探索Sealos系统功能:费用中心助您管理账单和发票,工作空间促进团队协作,工单系统便捷提交问题反馈。提升效率,优化协作体验。 +--- + +# 概述 + +Sealos 提供了费用中心、工作空间和工单等系统功能。 + +- 费用中心:查看账单、计价标准和开具发票; + +- 工作空间:通过不同的工作空间进行团队协作与隔离; + +- 工单:提交问题反馈。 \ No newline at end of file diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-1.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-1.png new file mode 100644 index 00000000000..95249c9951f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-2.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-2.png new file mode 100644 index 00000000000..6be4cf87420 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-3.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-3.png new file mode 100644 index 00000000000..225d5ccda85 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-4.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-4.png new file mode 100644 index 00000000000..6eb18871021 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-5.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-5.png new file mode 100644 index 00000000000..23864bd434c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/images/order-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/work-order.md b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/work-order.md new file mode 100644 index 00000000000..d0ac480e237 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/system-function/work-order/work-order.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 3 +keywords: [Sealos工单, 问题反馈, 客户支持, 在线帮助, 故障排除, 用户体验, 技术支持, 问题解决] +description: 了解如何使用Sealos工单系统快速提交问题、获取支持。从创建工单到与客服互动,轻松解决使用过程中遇到的各种问题,提升用户体验。 +--- + +# 工单 + +当您在使用 Sealos 的过程中,遇到任何问题,都可以使用工单提出您的疑问和反馈,我们会尽快为您处理。 + +## 快速开始 + +打开 Sealos 桌面,点击工单。 + +![](./images/order-1.png) + +点击新建工单。 + +![](./images/order-2.png) + +选择问题的类型,上传与问题相关的附件,描述问题的详细情况,最后点击提交工单。 + +![](./images/order-3.png) + +工单提交成后之后,会有🤖机器人客服回答问题,如果觉得机器人的回复无法解决问题,可以点击转人工客服。 + +![](./images/order-4.png) + +点击工单的详情,可以重新进入聊天界面,如果问题已经解决,可以点击关闭工单。 + +![](./images/order-5.png) + diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-1.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-1.png new file mode 100644 index 00000000000..b74972fbefa Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-2.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-2.png new file mode 100644 index 00000000000..2363b30f01b Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-2.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-3.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-3.png new file mode 100644 index 00000000000..7f982cb070c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-3.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-4.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-4.png new file mode 100644 index 00000000000..acefec74b37 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-4.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-5.png b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-5.png new file mode 100644 index 00000000000..2ca33dc27d1 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/images/workspace-5.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/workspace.md b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/workspace.md new file mode 100644 index 00000000000..ea3d8ddfb31 --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/system-function/workspace/workspace.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 2 +keywords: [工作空间, 多租户资源隔离, Sealos, 个人空间, 资源配额, 权限管理, 团队协作, 邀请用户, 角色权限] +description: 探索Sealos工作空间:多租户资源隔离机制,支持团队协作与资源分配。了解如何创建、切换工作空间,邀请用户并管理不同角色权限,提升协作效率。 +--- + +# 工作空间 + +工作空间是一种多租户资源隔离机制,它将一个集群划分为多个独立的工作空间,每个空间都有自己的资源配额和权限。这种机制支持团队协作与资源分配。 + +个人空间是工作空间的一种特殊形式,用户拥有一个与其用户名相同的个人空间。尽管个人空间的资源配额和权限与普通工作空间相同,但它无法被删除,也无法添加其他用户。 + +## 快速开始 + +### 创建工作空间 + +打开 Sealos 桌面,点击个人空间,点击管理工作空间。 + +![](./images/workspace-1.png) + +点击创建工作空间。 + +![](./images/workspace-2.png) + +### 切换工作空间 + +回到 Sealos 界面,点击个人空间,点击 hello 工作空间即可切换到 hello。 + +![](./images/workspace-3.png) + +### 邀请用户 + +在管理工作空间中,点击邀请成员,选择成员的身份权限,点击生成邀请链接,然后将链接发送给其他用户。 + +工作空间中的用户有三种不同的角色,角色和权限的说明如下: + +- 所有者(Owner):所有者拥有工作空间的所有权限,包括删除工作空间、查看/创建/修改工作空间中的所有资源、邀请用户以管理员/开发者身份加入工作空间等。 + +- 管理员(Manager):拥有工作空间的管理权限,包括查看/创建/修改工作空间中的所有资源、邀请用户以开发者身份加入工作空间等。 + +- 开发者(Developer):拥有工作空间的开发权限,包括查看工作空间中的资源状态。 + +![](./images/workspace-4.png) + +### 接受邀请 + +用户收到邀请链接,访问链接,点击接受邀请即可加入工作空间。 + +![](./images/workspace-5.png) diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal-1.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal-1.png new file mode 100644 index 00000000000..f1fcc577c7f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal.png new file mode 100644 index 00000000000..ac1a69448ca Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/database-terminal.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal-1.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal-1.png new file mode 100644 index 00000000000..a94f8582d11 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal.png new file mode 100644 index 00000000000..44fad2374a0 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/nginx-terminal.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-1.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-1.png new file mode 100644 index 00000000000..78ce7eb3f24 Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-1.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-pod.png b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-pod.png new file mode 100644 index 00000000000..bc47999cf4f Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal-pod.png differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal.webp b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal.webp new file mode 100644 index 00000000000..151254f046c Binary files /dev/null and b/docs/5.0/i18n/zh-Hans/user-guide/terminal/images/terminal.webp differ diff --git a/docs/5.0/i18n/zh-Hans/user-guide/terminal/terminal.md b/docs/5.0/i18n/zh-Hans/user-guide/terminal/terminal.md new file mode 100644 index 00000000000..7d5944fd0fc --- /dev/null +++ b/docs/5.0/i18n/zh-Hans/user-guide/terminal/terminal.md @@ -0,0 +1,88 @@ +--- +关键词: [Sealos云操作系统, 终端应用, Kubernetes, 容器操作, 数据库连接, 资源管理, 故障排查, 云端开发] +描述: 探索Sealos云操作系统的强大终端应用:直接操作Kubernetes资源、连接应用容器、一键访问数据库。高效灵活的云端开发体验,助您轻松管理和调试云环境。 +--- + +# 终端 + +终端是 [Sealos](https://cloud.sealos.io) 云操作系统内置的应用,它是一款非常强大的应用,与单机操作系统的终端一样,允许用户与操作系统进行直接交互,用户可以通过键入命令来执行各种操作。 + +![](images/terminal.webp) + +终端的价值在于其高效,灵活和强大的特性。对于许多任务来说,使用终端比使用图形用户界面(GUI)更快更简洁。对于开发者而言,终端是必不可少的工具。使用终端,可以让用户深入理解和控制 Sealos 云操作系统。 + +**每一个用户的终端实际上都运行在 Kubernetes 的一个 Pod 中**,可以在终端中通过以下命令查看: + +![](images/terminal-pod.png) + +## 进入应用容器的终端 + +也可以直接通过终端 App 进入每个应用所在容器的终端。假设你在应用管理中部署了一个应用 Nginx,可以直接进入 Nginx +应用的详情页面,依次点击详情右侧的三个点,再点击「终端」,便进入了 Nginx 应用的终端。 + +![](images/nginx-terminal.png) + +![](images/nginx-terminal-1.png) + +## 终端一键直连数据库 + +还可以在终端中一键直连[数据库 App](../dbprovider/dbprovider.md) 中创建的数据库。 + +进入数据库详情页面,点击左侧的「一键连接」: + +![](images/database-terminal.png) + +就会直接跳转到终端 App 并连接数据库: + +![](images/database-terminal-1.png) + +## 终端直接操作 Kubernetes 资源 + +:::danger + +以下操作需要一定的 Kubernetes 和容器相关知识基础,否则不要轻易操作。 + +::: + +资深 Kubernetes 用户可以直接使用终端来操作 Kubernetes 资源,对于资深用户而言,终端的优势有很多: + ++ 可以批量操作和自动化 ++ 高度灵活性 ++ 可以进行深入的故障排查 + +以下是一些常见的终端中操作 Kubernetes 资源的示例: + +### 查看用户的 Pod 列表 + +```bash +kubectl get pods +``` + +### 创建和管理资源对象 + +```bash +# 使用YAML或JSON文件创建资源 +$ kubectl create -f + +# 使用YAML或JSON文件创建或更新资源 +$ kubectl apply -f + +# 删除指定类型和名称的资源 +$ kubectl delete + +# 查看指定 Deployment 的滚动更新状态 +$ kubectl rollout status deployment/ +``` + +### 故障排查 + +```bash +# 获取指定资源的详细信息,包括事件和状态 +$ kubectl describe + +# 获取指定 Pod 中指定容器的日志 +$ kubectl logs -c + +# 在指定 Pod 中打开一个终端,以便进行调试 +$ kubectl exec -it +``` \ No newline at end of file diff --git a/docs/5.0/img/ai-applications/c++.png b/docs/5.0/img/ai-applications/c++.png new file mode 100644 index 00000000000..f21cf1e1b2d Binary files /dev/null and b/docs/5.0/img/ai-applications/c++.png differ diff --git a/docs/5.0/img/ai-applications/python.png b/docs/5.0/img/ai-applications/python.png new file mode 100644 index 00000000000..485d3f04b62 Binary files /dev/null and b/docs/5.0/img/ai-applications/python.png differ diff --git a/docs/5.0/img/ai-applications/sealos4-run-k8s-2.png b/docs/5.0/img/ai-applications/sealos4-run-k8s-2.png new file mode 100644 index 00000000000..4c139126058 Binary files /dev/null and b/docs/5.0/img/ai-applications/sealos4-run-k8s-2.png differ diff --git a/docs/5.0/img/ai-applications/sealos4-run-k8s-3.png b/docs/5.0/img/ai-applications/sealos4-run-k8s-3.png new file mode 100644 index 00000000000..79208c3fc11 Binary files /dev/null and b/docs/5.0/img/ai-applications/sealos4-run-k8s-3.png differ diff --git a/docs/5.0/img/ai-applications/sealos4-run-k8s.png b/docs/5.0/img/ai-applications/sealos4-run-k8s.png new file mode 100644 index 00000000000..4e2f8f750c2 Binary files /dev/null and b/docs/5.0/img/ai-applications/sealos4-run-k8s.png differ diff --git a/docs/5.0/img/app-launchpad-1-zh.jpg b/docs/5.0/img/app-launchpad-1-zh.jpg new file mode 100644 index 00000000000..56c9a434ddc Binary files /dev/null and b/docs/5.0/img/app-launchpad-1-zh.jpg differ diff --git a/docs/5.0/img/app-launchpad-1.jpg b/docs/5.0/img/app-launchpad-1.jpg new file mode 100644 index 00000000000..c93e8368db9 Binary files /dev/null and b/docs/5.0/img/app-launchpad-1.jpg differ diff --git a/docs/5.0/img/app-launchpad-zh.png b/docs/5.0/img/app-launchpad-zh.png new file mode 100644 index 00000000000..b9a1af059e1 Binary files /dev/null and b/docs/5.0/img/app-launchpad-zh.png differ diff --git a/docs/5.0/img/app-launchpad.png b/docs/5.0/img/app-launchpad.png new file mode 100644 index 00000000000..e0afc48fffd Binary files /dev/null and b/docs/5.0/img/app-launchpad.png differ diff --git a/docs/5.0/img/bytebase.webp b/docs/5.0/img/bytebase.webp new file mode 100644 index 00000000000..164aff68ff5 Binary files /dev/null and b/docs/5.0/img/bytebase.webp differ diff --git a/docs/5.0/img/database-zh.jpg b/docs/5.0/img/database-zh.jpg new file mode 100644 index 00000000000..8fb5b1a33e2 Binary files /dev/null and b/docs/5.0/img/database-zh.jpg differ diff --git a/docs/5.0/img/database.jpg b/docs/5.0/img/database.jpg new file mode 100644 index 00000000000..1394172749d Binary files /dev/null and b/docs/5.0/img/database.jpg differ diff --git a/docs/5.0/img/laf-zh.jpg b/docs/5.0/img/laf-zh.jpg new file mode 100644 index 00000000000..457cda0050b Binary files /dev/null and b/docs/5.0/img/laf-zh.jpg differ diff --git a/docs/5.0/img/laf.jpg b/docs/5.0/img/laf.jpg new file mode 100644 index 00000000000..85d7f1ccd0e Binary files /dev/null and b/docs/5.0/img/laf.jpg differ diff --git a/docs/5.0/img/metering/metering-1.png b/docs/5.0/img/metering/metering-1.png new file mode 100644 index 00000000000..4b9a6d1e58e Binary files /dev/null and b/docs/5.0/img/metering/metering-1.png differ diff --git a/docs/5.0/img/metering/metering-2.png b/docs/5.0/img/metering/metering-2.png new file mode 100644 index 00000000000..380614649ac Binary files /dev/null and b/docs/5.0/img/metering/metering-2.png differ diff --git a/docs/5.0/img/metering/metering-3.png b/docs/5.0/img/metering/metering-3.png new file mode 100644 index 00000000000..696eefab1fb Binary files /dev/null and b/docs/5.0/img/metering/metering-3.png differ diff --git a/docs/5.0/img/metering/metering-4.png b/docs/5.0/img/metering/metering-4.png new file mode 100644 index 00000000000..9acbce58235 Binary files /dev/null and b/docs/5.0/img/metering/metering-4.png differ diff --git a/docs/5.0/img/postgresql.webp b/docs/5.0/img/postgresql.webp new file mode 100644 index 00000000000..5df4a51d09e Binary files /dev/null and b/docs/5.0/img/postgresql.webp differ diff --git a/docs/5.0/img/sealos-app-store-1.jpg b/docs/5.0/img/sealos-app-store-1.jpg new file mode 100644 index 00000000000..9f4d148e453 Binary files /dev/null and b/docs/5.0/img/sealos-app-store-1.jpg differ diff --git a/docs/5.0/img/sealos-app-store-2.jpg b/docs/5.0/img/sealos-app-store-2.jpg new file mode 100644 index 00000000000..df5aeabc8bf Binary files /dev/null and b/docs/5.0/img/sealos-app-store-2.jpg differ diff --git a/docs/5.0/img/sealos-desktop-zh.webp b/docs/5.0/img/sealos-desktop-zh.webp new file mode 100644 index 00000000000..bead9952834 Binary files /dev/null and b/docs/5.0/img/sealos-desktop-zh.webp differ diff --git a/docs/5.0/img/sealos-desktop.webp b/docs/5.0/img/sealos-desktop.webp new file mode 100644 index 00000000000..a35a02d3634 Binary files /dev/null and b/docs/5.0/img/sealos-desktop.webp differ diff --git a/docs/5.0/img/sealos-left-dark.png b/docs/5.0/img/sealos-left-dark.png new file mode 100644 index 00000000000..4893d1b4bd2 Binary files /dev/null and b/docs/5.0/img/sealos-left-dark.png differ diff --git a/docs/5.0/img/sealos-left.png b/docs/5.0/img/sealos-left.png new file mode 100644 index 00000000000..91e67b39b3f Binary files /dev/null and b/docs/5.0/img/sealos-left.png differ diff --git a/docs/5.0/img/sealos-qr-code-300.png b/docs/5.0/img/sealos-qr-code-300.png new file mode 100644 index 00000000000..01c74221563 Binary files /dev/null and b/docs/5.0/img/sealos-qr-code-300.png differ diff --git a/docs/5.0/img/sealos-qr-code.jpg b/docs/5.0/img/sealos-qr-code.jpg new file mode 100644 index 00000000000..a93bda5e93e Binary files /dev/null and b/docs/5.0/img/sealos-qr-code.jpg differ diff --git a/docs/5.0/img/templates-zh.jpg b/docs/5.0/img/templates-zh.jpg new file mode 100644 index 00000000000..a4de6a217cf Binary files /dev/null and b/docs/5.0/img/templates-zh.jpg differ diff --git a/docs/5.0/img/templates.jpg b/docs/5.0/img/templates.jpg new file mode 100644 index 00000000000..62bcc2efbd8 Binary files /dev/null and b/docs/5.0/img/templates.jpg differ diff --git a/docs/5.0/img/terminal-zh.webp b/docs/5.0/img/terminal-zh.webp new file mode 100644 index 00000000000..8f3e086e9fe Binary files /dev/null and b/docs/5.0/img/terminal-zh.webp differ diff --git a/docs/5.0/img/terminal.webp b/docs/5.0/img/terminal.webp new file mode 100644 index 00000000000..60954399596 Binary files /dev/null and b/docs/5.0/img/terminal.webp differ diff --git a/docs/5.0/sidebar-temp.json b/docs/5.0/sidebar-temp.json new file mode 100644 index 00000000000..6af61bd4a5a --- /dev/null +++ b/docs/5.0/sidebar-temp.json @@ -0,0 +1,341 @@ +[ + "Intro", + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "quick-start" + } + ] + }, + { + "type": "category", + "label": "用户文档", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "系统功能", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/system-function" + } + ] + }, + { + "type": "category", + "label": "应用", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/application" + } + ] + }, + { + "type": "category", + "label": "数据库", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/database" + } + ] + }, + { + "type": "category", + "label": "对象存储", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/objectstorage" + } + ] + }, + { + "type": "category", + "label": "定时任务", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/cronjob" + } + ] + }, + { + "type": "category", + "label": "管理与配置", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/control" + } + ] + } + ] + }, + { + "type": "category", + "label": "开发者指南", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "系统设计", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/system-design" + } + ] + }, + { + "type": "category", + "label": "私有化部署", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "category", + "label": "部署Sealos", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/self-hosting/sealos" + } + ] + }, + { + "type": "category", + "label": "K8s 集群生命周期管理", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "category", + "label": "快速开始", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/self-hosting/lifecycle-management/quick-start" + } + ] + }, + { + "type": "category", + "label": "操作说明", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/self-hosting/lifecycle-management/operations" + } + ] + }, + { + "type": "category", + "label": "进阶指南", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/self-hosting/lifecycle-management/advanced-guide" + } + ] + }, + { + "type": "category", + "label": "参考", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/self-hosting/lifecycle-management/reference" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "category", + "label": "Developer Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "category", + "label": "Sealos", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/sealos" + } + ] + }, + { + "type": "category", + "label": "Lifecycle Management", + "link": { + "type": "doc", + "id": "self-hosting/lifecycle-management/lifecycle-management" + }, + "items": [ + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/quick-start" + } + ] + }, + { + "type": "category", + "label": "Operations", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/operations" + } + ] + }, + { + "type": "category", + "label": "Advanced Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/advanced-guide" + } + ] + }, + { + "type": "category", + "label": "Reference", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "self-hosting/lifecycle-management/reference" + } + ] + }, + "self-hosting/lifecycle-management/QA" + ] + } + ] + }, + { + "type": "category", + "label": "资源", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "隐私和服务协议", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": true, + "items": [ + { + "type": "autogenerated", + "dirName": "resources/privacy_and_service_policy" + } + ] + } + ] + } +] \ No newline at end of file diff --git a/docs/5.0/sidebar.json b/docs/5.0/sidebar.json new file mode 100644 index 00000000000..12768635160 --- /dev/null +++ b/docs/5.0/sidebar.json @@ -0,0 +1,201 @@ +{ + "docSidebar": [ + "Intro", + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "doc", + "id": "quick-start/quick-start" + }, + "items": [ + { + "type": "category", + "label": "Examples", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "quick-start/examples" + } + ] + } + ] + }, + { + "type": "category", + "label": "User Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "category", + "label": "System Function", + "link": { + "type": "doc", + "id": "user-guide/system-function/system-function" + }, + "items": [ + "user-guide/system-function/cost-center/cost-center", + "user-guide/system-function/workspace/workspace", + "user-guide/system-function/work-order/work-order" + ] + }, + "user-guide/app-store/app-store", + { + "type": "category", + "label": "App Launchpad", + "link": { + "type": "doc", + "id": "user-guide/app-launchpad/app-launchpad" + }, + "items": [ + "user-guide/app-launchpad/use-app-launchpad", + "user-guide/app-launchpad/update-app", + "user-guide/app-launchpad/add-domain", + "user-guide/app-launchpad/expose-multi-ports", + "user-guide/app-launchpad/environment", + "user-guide/app-launchpad/configmap", + "user-guide/app-launchpad/autoscale", + "user-guide/app-launchpad/persistent-volume", + "user-guide/app-launchpad/set-cert" + ] + }, + { + "type": "category", + "label": "Database", + "link": { + "type": "doc", + "id": "user-guide/database/database" + }, + "items": [ + "user-guide/database/config-docs/config-docs" + ] + }, + "user-guide/objectstorage/objectstorage", + "user-guide/cronjob/cronjob", + "user-guide/terminal/terminal", + "user-guide/kubepanel/kubepanel" + ] + }, + { + "type": "category", + "label": "Developer Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "category", + "label": "Sealos", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/sealos" + } + ] + }, + { + "type": "category", + "label": "System Design", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/system-design" + } + ] + }, + { + "type": "category", + "label": "Kubernetes Lifecycle Management", + "link": { + "type": "doc", + "id": "developer-guide/lifecycle-management/lifecycle-management" + }, + "items": [ + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/lifecycle-management/quick-start" + } + ] + }, + { + "type": "category", + "label": "Operations", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/lifecycle-management/operations" + } + ] + }, + { + "type": "category", + "label": "Advanced Guide", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/lifecycle-management/advanced-guide" + } + ] + }, + { + "type": "category", + "label": "Reference", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "developer-guide/lifecycle-management/reference" + } + ] + }, + "developer-guide/lifecycle-management/QA" + ] + } + ] + }, + { + "type": "doc", + "id": "community", + "label": "Community" + }, + { + "type": "category", + "label": "Master Services Agreement", + "link": { + "type": "generated-index" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "msa" + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/5.0/tmp.json b/docs/5.0/tmp.json new file mode 100644 index 00000000000..32146ee90fe --- /dev/null +++ b/docs/5.0/tmp.json @@ -0,0 +1,227 @@ +[ + "Intro", + { + "type": "category", + "label": "Quick Start", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "quick-start" + } + ] + }, + { + "type": "category", + "label": "User Guide", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "CronJob", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/cronjob" + } + ] + }, + { + "type": "category", + "label": "Object Storage", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/objectstorage" + } + ] + }, + { + "type": "category", + "label": "Application", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "App Launchpad", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/application/app-launchpad" + } + ] + }, + { + "type": "category", + "label": "App Store", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/application/app-store" + } + ] + } + ] + }, + { + "type": "category", + "label": "Control", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "Kubepanel", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/control/kubepanel" + } + ] + }, + { + "type": "category", + "label": "Terminal", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/control/terminal" + } + ] + } + ] + }, + { + "type": "category", + "label": "Database", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "database" + } + ] + }, + { + "type": "category", + "label": "System Function", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "category", + "label": "Introduce", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/system-function/introduce" + } + ] + }, + { + "type": "category", + "label": "Workspace", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/system-function/workspace" + } + ] + }, + { + "type": "category", + "label": "Cost Centor", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/system-function/cost-centor" + } + ] + }, + { + "type": "category", + "label": "Order", + "link": { + "type": "generated-index" + }, + "collapsible": true, + "collapsed": false, + "items": [ + { + "type": "autogenerated", + "dirName": "user-guide/system-function/order" + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/docs/blog/en/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md b/docs/blog/en/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md index d96e2163d28..e605d45b8b4 100644 --- a/docs/blog/en/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md +++ b/docs/blog/en/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md @@ -27,7 +27,7 @@ Upon joining Alibaba, I observed that all databases for delivery purposes were o ## Democratizing Database Expertise on K8s -In the business sector, companies often confront two primary challenges with database management: either their management skills are not robust enough to maximize database potential, or they face significant expenditures in managing their databases. The concept of "[Database on K8s](https://sealos.io/docs/platform-components/dbprovider/)" introduces a standardization that addresses these issues. Such standardization facilitates collaboration and alters the dynamics of productivity and production relationships, leading to a substantial increase in efficiency. This approach empowers teams, even those lacking in specialized skills, to leverage professional capabilities. This is analogous to the distinct roles in agriculture and animal husbandry, where focus in their respective domains enhances overall efficiency and output. +In the business sector, companies often confront two primary challenges with database management: either their management skills are not robust enough to maximize database potential, or they face significant expenditures in managing their databases. The concept of "[Database on K8s](https://sealos.io/docs/guides/dbprovider/)" introduces a standardization that addresses these issues. Such standardization facilitates collaboration and alters the dynamics of productivity and production relationships, leading to a substantial increase in efficiency. This approach empowers teams, even those lacking in specialized skills, to leverage professional capabilities. This is analogous to the distinct roles in agriculture and animal husbandry, where focus in their respective domains enhances overall efficiency and output. The KubeBlocks team is a prime example of this. Their expertise and accumulation of knowledge in database management are likely superior to that of most companies. They have transformed their experiential knowledge into code, crafting controllers that enable other businesses to operate in an exceptionally streamlined manner. K8s plays a crucial role in making this feasible. diff --git a/docs/blog/zh-Hans/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md b/docs/blog/zh-Hans/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md index f17bd4823e8..33401cf0619 100644 --- a/docs/blog/zh-Hans/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md +++ b/docs/blog/zh-Hans/2023/to-run-or-not-to-run-a-database-on-kubernetes/index.md @@ -27,7 +27,7 @@ date: 2023-12-06T10:00 ## 数据库 on K8s:专业能力的普及化 -绝大多数做业务的公司对数据库的处理通常存在两个问题:要么是数据库管理水平一般,无法充分发挥数据库的潜能;要么是每年需要在数据库管理上花费大量成本。[数据库 on K8s](https://sealos.run/docs/platform-components/dbprovider/) 可以让这一切标准化,有了标准,人与人之间才可以协作,生产力改变生产关系,从而大幅提效,让绝大多数不具备专业能力的团队享受到专业能力,本质上分工更明确了,就像农业和畜牧业分离一样,各自专注于自己的领域,从而提高整体的效率和产出。 +绝大多数做业务的公司对数据库的处理通常存在两个问题:要么是数据库管理水平一般,无法充分发挥数据库的潜能;要么是每年需要在数据库管理上花费大量成本。[数据库 on K8s](https://sealos.run/docs/guides/dbprovider/) 可以让这一切标准化,有了标准,人与人之间才可以协作,生产力改变生产关系,从而大幅提效,让绝大多数不具备专业能力的团队享受到专业能力,本质上分工更明确了,就像农业和畜牧业分离一样,各自专注于自己的领域,从而提高整体的效率和产出。 以 KubeBlocks 团队为例,我相信绝大多数公司在数据库层面的积累和专业能力都没有他们强。而且他们将这些实践经验转化为代码,写成了控制器,以极其简单的方式赋能给其他企业。K8s 让这一切成为可能。 diff --git a/docs/website/.gitignore b/docs/website/.gitignore index e83755844c1..fc0deed0a70 100644 --- a/docs/website/.gitignore +++ b/docs/website/.gitignore @@ -26,4 +26,7 @@ yarn-error.log* i18n/zh-Hans/docusaurus-plugin-content-blog i18n/zh-Hans/docusaurus-plugin-content-docs -i18n/zh-Hans/code.json \ No newline at end of file +i18n/zh-Hans/code.json + +/versioned_docs +/versioned_sidebars \ No newline at end of file diff --git a/docs/website/docusaurus.config.js b/docs/website/docusaurus.config.js index 5e38eb1a599..19dc5010ad9 100644 --- a/docs/website/docusaurus.config.js +++ b/docs/website/docusaurus.config.js @@ -1,7 +1,7 @@ require('dotenv').config() const generateAlgoliKey = () => "ce5b8e1e4d0d35ff587caf75ac404df4" -const isChinese = process.env.SEALOS_LANG === "zh-Hans" +const isDomesticSite = process.env.SEALOS_LANG === "zh-Hans" /** @type {import('@docusaurus/types').Config} */ const config = { @@ -32,16 +32,31 @@ const config = { /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { - path: "../4.0/docs", - sidebarPath: require.resolve("./sidebars.js"), + // path: "../5.0/docs", + // sidebarPath: require.resolve("./sidebars.js"), // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: ({ versionDocsDirPath, docPath, locale }) => - "https://github.com/labring/sealos/tree/main/docs/4.0/" + + "https://github.com/labring/sealos/tree/main/docs/5.0/" + (locale === "en" ? `${versionDocsDirPath}` : `i18n/${locale}`) + `/${docPath}`, editLocalizedFiles: false, editCurrentVersion: false, + // version + includeCurrentVersion: false, + lastVersion: '4.0.0', + versions: { + '4.0.0': { + label: '4.0.0', + path: '', + banner: 'none' + }, + '5.0.0': { + label: '5.0.0', + path: '5.0.0', + banner: 'none', + } + } }, blog: { path: "../blog/en", @@ -60,34 +75,32 @@ const config = { themeConfig: { // @type {import('@docusaurus/preset-classic').ThemeConfig} metadata: [{ name: 'title', content: 'Sealos by 环界云' }], - ...(!isChinese && { - announcementBar: { - id: 'sealos_tip', - content: ` -
-
如果您是国内用户,请直接访问 👉
-
- 国内官网 -
- - - - - - - - - - - - + announcementBar: { + id: 'sealos_tip', + content: ` +
+
${isDomesticSite ? 'If you are an international user, please visit 👉' : '如果您是国内用户,请直接访问 👉 '}
+
+ ${isDomesticSite ? 'International Site' : '国内官网'}
+ + + + + + + + + + + + +
`, - isCloseable: true, - } - }), + isCloseable: true, + }, algolia: { // Algolia 提供的应用 ID appId: "SLTSB7B9Y0", @@ -146,6 +159,10 @@ const config = { to: "https://fael3z0zfze.feishu.cn/share/base/form/shrcnesSfEK65JZaAf2W6Fwz6Ad", label: "Contact", }, + { + type: 'docsVersionDropdown', + position: 'right', + }, { type: "localeDropdown", position: "right", @@ -229,41 +246,24 @@ const config = { scripts: [ { src: "/wow.min.js", - async: true + async: false }, { src: "/global.js", async: true - } + }, + ...(isDomesticSite ? [{ + src: 'https://hm.baidu.com/hm.js?d8e8ecf669c47dc2512d3f1417e761f9', + async: true, + }] : []) ], headTags: [ { tagName: 'meta', attributes: { name: 'baidu-site-verification', - content: 'codeva-gAHDaifnOq', + content: 'codeva-IaVFkVUuDD', }, - }, - { - tagName: 'meta', - attributes: { - name: 'baidu-site-verification', - content: 'codeva-E1X5UKtV9p', - }, - }, - { - tagName: 'meta', - attributes: { - name: 'description', - content: '高效管理你的云原生应用程序,像使用个人电脑一样在 Kubernetes 上一键安装编程语言、低代码开发平台、WordPress、数据库、AI 软件和 IM 软件。', - } - }, - { - tagName: 'meta', - attributes: { - name: 'keywords', - content: 'Sealos, K8s, 云操作系统, 低代码开发平台, 数据库', - } } ], plugins: [ diff --git a/docs/website/package.json b/docs/website/package.json index 821e4a51786..215e34a7951 100644 --- a/docs/website/package.json +++ b/docs/website/package.json @@ -1,20 +1,19 @@ { "name": "sealos-site", - "version": "0.0.0", + "version": "5.0.0", "private": true, "scripts": { - "sync-zh-files": "mkdir -p i18n/zh-Hans/docusaurus-plugin-content-docs/current && cp -r ../4.0/i18n/zh-Hans/* i18n/zh-Hans/docusaurus-plugin-content-docs/current/ && cp ../4.0/i18n/zh-Hans/current.json i18n/zh-Hans/docusaurus-plugin-content-docs/current.json && cp ../4.0/code.json i18n/zh-Hans/code.json && mkdir -p i18n/zh-Hans/docusaurus-plugin-content-blog && cp -r ../blog/zh-Hans/* i18n/zh-Hans/docusaurus-plugin-content-blog/ && cp ../blog/zh-Hans/options.json i18n/zh-Hans/docusaurus-plugin-content-blog/options.json", - "docusaurus": "docusaurus", - "start": "yarn sync-zh-files && tsc && docusaurus start", - "start-zh": "yarn write-translations-zh && tsc && docusaurus start --locale zh-Hans", - "build": "yarn sync-zh-files && tsc && docusaurus build", - "swizzle": "yarn sync-zh-files && docusaurus swizzle", - "deploy": "yarn sync-zh-files && docusaurus deploy", - "clear": "yarn sync-zh-files && docusaurus clear", - "serve": "yarn sync-zh-files && docusaurus serve", - "write-translations-en": "yarn sync-zh-files && docusaurus write-translations --locale en", - "write-translations-zh": "yarn sync-zh-files && docusaurus write-translations --locale zh-Hans", - "write-heading-ids": "yarn sync-zh-files && docusaurus write-heading-ids" + "sync-docs": "node scripts/sync-docs.js", + "start": "yarn sync-docs && docusaurus start", + "start-zh": "yarn sync-docs && docusaurus start --locale zh-Hans", + "build": "yarn sync-docs && tsc && docusaurus build", + "swizzle": "yarn sync-docs && docusaurus swizzle", + "deploy": "yarn sync-docs && docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations-en": "yarn sync-docs && docusaurus write-translations --locale en", + "write-translations-zh": "yarn sync-docs && docusaurus write-translations --locale zh-Hans", + "write-heading-ids": "yarn sync-docs && docusaurus write-heading-ids" }, "dependencies": { "@docusaurus/core": "^2.4.3", @@ -53,4 +52,4 @@ "last 1 safari version" ] } -} +} \ No newline at end of file diff --git a/docs/website/scripts/sync-docs.js b/docs/website/scripts/sync-docs.js new file mode 100644 index 00000000000..cf3f7c95d6f --- /dev/null +++ b/docs/website/scripts/sync-docs.js @@ -0,0 +1,97 @@ +// scripts/sync-docs.js +const fs = require('fs-extra') +const path = require('path') + +const versions = ['5.0.0', '4.0.0'] +const websiteDir = path.resolve(__dirname, '..') +const rootDir = path.resolve(websiteDir, '..') + +async function generateVersionsJson () { + const versionsJsonPath = path.join(websiteDir, 'versions.json') + await fs.writeJson(versionsJsonPath, versions, { spaces: 2 }) +} + +function safeJoin (base, ...parts) { + const joined = [base, ...parts].join(path.sep) + const normalized = path.normalize(joined) + + const normalizedBase = path.normalize(base) + if (!normalized.startsWith(normalizedBase) || normalized === normalizedBase) { + throw new Error('Path traversal attempt blocked') + } + + return normalized +} + +async function syncDocs () { + try { + // Remove specified directories + const dirsToRemove = [ + 'i18n/zh-Hans/docusaurus-plugin-content-blog', + 'i18n/zh-Hans/docusaurus-plugin-content-docs', + 'versioned_docs', + 'versioned_sidebars' + ].map(dir => safeJoin(websiteDir, dir)) + + await Promise.all(dirsToRemove.map(dir => fs.remove(dir))) + + for (const version of versions) { + const shortVersion = version.slice(0, 3) + + // Sync English docs + await fs.copy( + path.join(rootDir, shortVersion, 'docs'), + path.join(websiteDir, 'versioned_docs', `version-${version}`) + ) + + // Sync Chinese docs + await fs.copy( + path.join(rootDir, shortVersion, 'i18n', 'zh-Hans'), + path.join(websiteDir, 'i18n/zh-Hans/docusaurus-plugin-content-docs', `version-${version}`) + ) + + // Copy sidebar files + const sidebarPaths = [ + { + src: path.join(rootDir, shortVersion, 'sidebar.json'), + dest: path.join(websiteDir, 'versioned_sidebars', `version-${version}-sidebars.json`) + }, + { + src: path.join(rootDir, shortVersion, 'i18n', 'zh-Hans', 'sidebar.json'), + dest: path.join(websiteDir, 'i18n/zh-Hans/docusaurus-plugin-content-docs', `version-${version}.json`) + } + ] + + for (const { src, dest } of sidebarPaths) { + if (await fs.pathExists(src)) { + await fs.copy(src, dest) + } + } + } + + // Sync code.json + await fs.copy( + path.join(rootDir, '5.0/code.json'), + path.join(websiteDir, 'i18n/zh-Hans/code.json') + ) + + // Sync blog content + await fs.copy( + path.join(rootDir, 'blog/zh-Hans'), + path.join(websiteDir, 'i18n/zh-Hans/docusaurus-plugin-content-blog') + ) + + await generateVersionsJson() + console.log(`All documents synchronized successfully: + - Synced docs for versions: ${versions.join(', ')} + - Updated English and Chinese documentation + - Copied code.json and sidebar files + - Synced blog content + - Generated versions.json`) + + } catch (err) { + console.error('Error during synchronization:', err) + } +} + +syncDocs() \ No newline at end of file diff --git a/docs/website/sidebars.js b/docs/website/sidebars.js deleted file mode 100644 index 1d66ee339a7..00000000000 --- a/docs/website/sidebars.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - -const sidebar = require('../4.0/sidebar.json') - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - docSidebar: sidebar -} - -module.exports = sidebars diff --git a/docs/website/src/hooks/useWindow.ts b/docs/website/src/hooks/useWindow.ts index ba09a6260bf..9a1a6aa628c 100644 --- a/docs/website/src/hooks/useWindow.ts +++ b/docs/website/src/hooks/useWindow.ts @@ -1,6 +1,12 @@ import { useEffect, useState } from 'react'; import useIsBrowser from '@docusaurus/useIsBrowser'; +interface SemParams { + bd_vid: string; + keywords: string; + s: string; +} + export default function useWindow() { const isBrowser = useIsBrowser(); const [screenWidth, setScreenWidth] = useState(isBrowser ? document.body.clientWidth : 1440); @@ -8,12 +14,15 @@ export default function useWindow() { isBrowser ? document.documentElement.lang : 'en' ); const [cloudUrl, setCloudUrl] = useState('https://cloud.sealos.io'); - const [bd_vid, setBdId] = useState(''); + const [semParams, setSemParams] = useState({ bd_vid: '', keywords: '', s: '' }); useEffect(() => { if (!isBrowser) return; - let bd_vid = sessionStorage.getItem('bd_vid'); - if (bd_vid) setBdId(bd_vid); + const storedParams = sessionStorage.getItem('sealos_sem'); + if (storedParams) { + const parsedParams = JSON.parse(storedParams); + setSemParams((prevParams) => ({ ...prevParams, ...parsedParams })); + } }, [isBrowser]); useEffect(() => { @@ -41,6 +50,6 @@ export default function useWindow() { screenWidth, currentLanguage, cloudUrl, - bd_vid + semParams }; } diff --git a/docs/website/src/pages/components/Capability/index.tsx b/docs/website/src/pages/components/Capability/index.tsx index 26e05fc3c2b..093e275f718 100644 --- a/docs/website/src/pages/components/Capability/index.tsx +++ b/docs/website/src/pages/components/Capability/index.tsx @@ -36,7 +36,7 @@ const i18nObj = { const Capability = ({ isPc }: { isPc: boolean }) => { const isBrowser = useIsBrowser(); - const { screenWidth, currentLanguage, cloudUrl, bd_vid } = useWindow(); + const { screenWidth, currentLanguage, cloudUrl, semParams } = useWindow(); useLayoutEffect(() => { // @ts-ignore nextline @@ -67,7 +67,7 @@ const Capability = ({ isPc }: { isPc: boolean }) => {

{i18nObj.appMan}

{i18nObj.appManagement_introduce}

{i18nObj.Explore} {'>'} @@ -87,7 +87,10 @@ const Capability = ({ isPc }: { isPc: boolean }) => {
{i18nObj.database}
{i18nObj.database_introduce}
-
+ {i18nObj.Explore} {'>'} {

{i18nObj.appMan}

{i18nObj.appManagement_introduce}

- + {i18nObj.Explore} {'>'} @@ -146,7 +152,10 @@ const Capability = ({ isPc }: { isPc: boolean }) => {
{i18nObj.database}
{i18nObj.database_introduce}
- + {i18nObj.Explore} {'>'} Docs, - to: '/docs/Intro' + to: '/docs/5.0.0/Intro' }, { key: 'appstore', @@ -51,7 +51,7 @@ const i18nObj = { const HomeHeader = ({ isPc }: { isPc: boolean }) => { const [stars, setStars] = useState(10000); const isBrowser = useIsBrowser(); - const { cloudUrl, bd_vid } = useWindow(); + const { cloudUrl, semParams } = useWindow(); const { i18n: { currentLocale, defaultLocale } @@ -130,8 +130,7 @@ const HomeHeader = ({ isPc }: { isPc: boolean }) => { {currentLocale === 'en' ? (

Sealos is the cloud OS for deploying, managing and scaling your applications  - in seconds - , not minutes, not hours.  + in seconds, not minutes, not hours.  Use Sealos as easily as your own PC!

) : ( @@ -141,7 +140,11 @@ const HomeHeader = ({ isPc }: { isPc: boolean }) => { 部署、管理和扩展应用的云操作系统。就像使用个人电脑一样! )} - + {i18nObj.startNow}
@@ -196,7 +199,11 @@ const HomeHeader = ({ isPc }: { isPc: boolean }) => { {i18nMap[currentLocale].label} )} - + {i18nObj.startNow}
@@ -220,8 +227,7 @@ const HomeHeader = ({ isPc }: { isPc: boolean }) => { {currentLocale === 'en' ? (

Sealos is the cloud OS for deploying, managing and scaling your applications  - in seconds - , not minutes, not hours.  + in seconds, not minutes, not hours.  Use Sealos as easily as your own PC!

) : ( @@ -232,7 +238,7 @@ const HomeHeader = ({ isPc }: { isPc: boolean }) => { )} - + ); diff --git a/docs/website/src/pages/index.tsx b/docs/website/src/pages/index.tsx index bde9a7d7dfc..7e5c5ebef25 100644 --- a/docs/website/src/pages/index.tsx +++ b/docs/website/src/pages/index.tsx @@ -13,10 +13,12 @@ import HomeUserBy from './components/UserBy'; import './index.scss'; import Head from '@docusaurus/Head'; import SaleBanner from '../components/SaleBanner'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; const Home = () => { - const { screenWidth, currentLanguage } = useWindow(); + const { screenWidth } = useWindow(); const isPc = useMemo(() => screenWidth > PC_MIN_WIDTH, [screenWidth]); + const { i18n } = useDocusaurusContext(); useEffect(() => { const loadUmamiScript = () => { @@ -27,11 +29,6 @@ const Home = () => { script1.setAttribute('data-website-id', 'e5a8009f-7cb6-4841-9522-d23b96216b7a'); script1.async = true; document.head.appendChild(script1); - - const scriptBaidu = document.createElement('script'); - scriptBaidu.src = 'https://hm.baidu.com/hm.js?508769a0373e6443cbdf6fa135104b4b'; - scriptBaidu.async = true; - document.head.appendChild(scriptBaidu); } else { const script2 = document.createElement('script'); script2.src = 'https://umami.cloud.sealos.io/oishii'; @@ -45,18 +42,46 @@ const Home = () => { useEffect(() => { const urlParams = new URLSearchParams(window.location.search); - const bd_vidValue = urlParams.get('bd_vid'); - sessionStorage.setItem('bd_vid', bd_vidValue); + const params: Record = {}; + + const bd_vid = urlParams.get('bd_vid'); + if (bd_vid) params.bd_vid = bd_vid; + + const k = urlParams.get('k'); + if (k) params.keywords = k; + + const s = urlParams.get('s'); + if (s) params.s = s; + + if (Object.keys(params).length > 0) { + sessionStorage.setItem('sealos_sem', JSON.stringify(params)); + } }, []); const HomeRender = (
- {currentLanguage === 'en' + {i18n.currentLocale === 'en' ? 'Sealos' : 'Sealos: 专为云原生开发打造的以 K8s 为内核的云操作系统'} + +