diff --git a/.github/workflows/generate-chart-readme.yml b/.github/workflows/generate-chart-readme.yml index 34e0df87..7c63a2a6 100644 --- a/.github/workflows/generate-chart-readme.yml +++ b/.github/workflows/generate-chart-readme.yml @@ -58,6 +58,7 @@ jobs: - name: Execute readme-generator-for-helm run: | + pwd && ls -Rah readme-generator-for-helm/bin/index.js -r $(cat prepared-inputs | grep README) -v $(cat prepared-inputs | grep values) - name: Output generated README.md diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 03fca4b3..b282ca4c 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -41,6 +41,9 @@ jobs: - name: Unit test run: | - alias kubectl='microk8s kubectl' - alias helm='microk8s helm3' + snap alias microk8s.kubectl kubectl + snap alias microk8s.helm3 helm + + # alias kubectl='microk8s kubectl' + # alias helm='microk8s helm3' make test \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index b1fcb70c..f5b30e9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,20 +2,36 @@ ## Changes Since Last Release +### Changed defaults / behaviours +- ... + +### New Features & Functionality +- Add autocompletion for uninstall command. +- Add validation for missing callable. +- ... + +## Bug Fixes +- Remove VirtualObjects and Templates from the list of CRDs whose finalizers can be forcibly deleted (they have no finalizers). +- ... + + +## 1.0.42 \[2023-06-27\] + ### Changed defaults / behaviours - Moved charts from `charts/{category}` to `examples/apps`. This allows to have the apps and the test-cases on the same directory. Additionally, that - means that chart releasing is no longer part of the frisbee release -- which shouldn't have been the case in the first place. -- Renamed template to be in the format 'frisbee.system...' and 'frisbee.apps'. This, however, warrants a new release because - the renamed systems templates affect the controller. +means that chart releasing is no longer part of the frisbee release -- which shouldn't have been the case in the first place. +- Renamed template to be in the format 'frisbee.system...' and 'frisbee.apps'. This, however, warrants a new release because +the renamed systems templates affect the controller. - ... ### New Features & Functionality - ... ## Bug Fixes -- Stalled cached files were used in reporting. Update the cached files every time we run the report command. +- Stalled cached files were used in reporting. Update the cached files every time we run the report command. - ... + ## 1.0.41 \[2023-06-22\] ### Changed defaults / behaviours diff --git a/Dockerfile b/Dockerfile index b6680d6a..5e41c4ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,23 @@ # Build the Frisbee operator binary FROM golang:1.19 as builder + +ENV GOOS=linux +ENV GOARCH=amd64 +ENV CGO_ENABLED=0 +ENV GOPROXY=direct +ENV GOSUMDB=off + WORKDIR /workspace # Copy the Go Modules manifests COPY go.mod go.mod COPY go.sum go.sum # cache deps before building and copying source so that we don't need to re-download as much # and so that source changes don't invalidate our downloaded layer -RUN go mod download +RUN go mod download + +# go env -w GOPROXY=direct + #go env -w GOSUMDB=off # Copy the go source COPY ./cmd/manager/main.go main.go @@ -16,7 +26,7 @@ COPY controllers/ controllers/ COPY pkg/ pkg/ # Build -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o /manager main.go +RUN go build -a -o /manager main.go # Use alpine as minimal base image to package the Frisbee operator binary # We use a non-root user setup. diff --git a/README.md b/README.md index df36a5df..a9cc569f 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,23 @@ To learn more about Frisbee, check the **[QuickStart](https://frisbee.dev/docs/q our **[Website](https://frisbee.dev)**. +## Use-Cases and Testing Patterns + +In declarative testing, a test scenario focuses on what to accomplish rather than on the imperative details of how to manipulate the state of an application under test and verify the final application state against an expected state. + +This approach not make tests more *readable, maintainable, and reproducible*, but it also help devops in identifying testing patterns. + +Here, you can see some testing patterns we have identified across different application domains. + +👉 [Databases](./examples/patterns/databases) + +👉 [Federated Learning](./examples/patterns/federated-learning) + +👉 [HPC](./examples/patterns/hpc) + +👉 [CI](./examples/patterns/ci) + + ## Getting Started @@ -227,24 +244,9 @@ Finally, Frisbee provides an advanced functionality for auto-generating reports kubectl-frisbee report test demo-326 ~/frisbee-reports --pdf --force ``` -This will create report on `~/frisbee/reports` directory including the pdf from Grafana. - - -## Use-Cases and Testing Patterns - -In declarative testing, a test scenario focuses on what to accomplish rather than on the imperative details of how to manipulate the state of an application under test and verify the final application state against an expected state. - -This approach not make tests more *readable, maintainable, and reproducible*, but it also help devops in identifying testing patterns. - -Here, you can see some testing patterns we have identified across different application domains. - -👉 [Databases](./examples/patterns/databases) - -👉 [Federated Learning](./examples/patterns/federated-learning) +This will create report on `~/frisbee-reports` directory including the pdf from Grafana. -👉 [HPC](./examples/patterns/hpc) -👉 [CI](./examples/patterns/ci) ## Features diff --git a/api/v1alpha1/crd_call.go b/api/v1alpha1/crd_call.go index c613f390..851d5de7 100644 --- a/api/v1alpha1/crd_call.go +++ b/api/v1alpha1/crd_call.go @@ -51,7 +51,7 @@ type MatchOutputs struct { type CallSpec struct { // Callable is the name of the endpoint that will be called // +kubebuilder:validation:minlength=1 - Callable string `json:"callable,omitempty"` + Callable string `json:"callable"` // Services is a list of services that will be stopped. // +kubebuilder:validation:minimum=1 diff --git a/api/v1alpha1/crd_service.go b/api/v1alpha1/crd_service.go index 0d77041b..4bcbb952 100644 --- a/api/v1alpha1/crd_service.go +++ b/api/v1alpha1/crd_service.go @@ -35,40 +35,6 @@ type Service struct { Status ServiceStatus `json:"status,omitempty"` } -// NIC specifies the capabilities of the emulated network interface. -type NIC struct { - Rate string `json:"rate,omitempty"` - - Latency string `json:"latency,omitempty"` -} - -// Disk specifies the capabilities of the emulated storage device. -type Disk struct { - // ReadBPS limits read rate (bytes per second) - ReadBPS string `json:"readbps,omitempty"` - - // ReadIOPS limits read rate (IO per second) - ReadIOPS string `json:"readiops,omitempty"` - - // WriteBPS limits write rate (bytes per second) - WriteBPS string `json:"writebps,omitempty"` - - // WriteIOPS limits write rate (IO per second) - WriteIOPS string `json:"writeiops,omitempty"` -} - -// Resources specifies limitations as to how the container will access host resources. -type Resources struct { - // +optional - Memory string `json:"memory,omitempty"` - // +optional - CPU string `json:"cpu,omitempty"` - // +optional - NIC *NIC `json:"nic,omitempty"` - // +optional - Disk *Disk `json:"disk,omitempty"` -} - type SetField struct { // Field is the path to the field whose value will be replaced. // Examples: Containers.0.Ports.0 diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 820178e0..484165ff 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -674,21 +674,6 @@ func (in *DeleteSpec) DeepCopy() *DeleteSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Disk) DeepCopyInto(out *Disk) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Disk. -func (in *Disk) DeepCopy() *Disk { - if in == nil { - return nil - } - out := new(Disk) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DistParamsPareto) DeepCopyInto(out *DistParamsPareto) { *out = *in @@ -914,21 +899,6 @@ func (in *MatchOutputs) DeepCopy() *MatchOutputs { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NIC) DeepCopyInto(out *NIC) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NIC. -func (in *NIC) DeepCopy() *NIC { - if in == nil { - return nil - } - out := new(NIC) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in Parameters) DeepCopyInto(out *Parameters) { { @@ -1037,31 +1007,6 @@ func (in *ResourceDistributionSpec) DeepCopy() *ResourceDistributionSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Resources) DeepCopyInto(out *Resources) { - *out = *in - if in.NIC != nil { - in, out := &in.NIC, &out.NIC - *out = new(NIC) - **out = **in - } - if in.Disk != nil { - in, out := &in.Disk, &out.Disk - *out = new(Disk) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Resources. -func (in *Resources) DeepCopy() *Resources { - if in == nil { - return nil - } - out := new(Resources) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Scenario) DeepCopyInto(out *Scenario) { *out = *in diff --git a/charts/platform/crds/frisbee.dev_calls.yaml b/charts/platform/crds/frisbee.dev_calls.yaml index ec0b9e1a..dd9361fd 100644 --- a/charts/platform/crds/frisbee.dev_calls.yaml +++ b/charts/platform/crds/frisbee.dev_calls.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: calls.frisbee.dev spec: group: frisbee.dev @@ -177,6 +178,7 @@ spec: type: integer type: object required: + - callable - services type: object status: diff --git a/charts/platform/crds/frisbee.dev_cascades.yaml b/charts/platform/crds/frisbee.dev_cascades.yaml index 43b7e9da..a27f0389 100644 --- a/charts/platform/crds/frisbee.dev_cascades.yaml +++ b/charts/platform/crds/frisbee.dev_cascades.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: cascades.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/crds/frisbee.dev_chaos.yaml b/charts/platform/crds/frisbee.dev_chaos.yaml index 50d72dc2..207df7ea 100644 --- a/charts/platform/crds/frisbee.dev_chaos.yaml +++ b/charts/platform/crds/frisbee.dev_chaos.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: chaos.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/crds/frisbee.dev_clusters.yaml b/charts/platform/crds/frisbee.dev_clusters.yaml index 3598e13a..5cb663e5 100644 --- a/charts/platform/crds/frisbee.dev_clusters.yaml +++ b/charts/platform/crds/frisbee.dev_clusters.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: clusters.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/crds/frisbee.dev_scenarios.yaml b/charts/platform/crds/frisbee.dev_scenarios.yaml index c8b96397..a53652f4 100644 --- a/charts/platform/crds/frisbee.dev_scenarios.yaml +++ b/charts/platform/crds/frisbee.dev_scenarios.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: scenarios.frisbee.dev spec: group: frisbee.dev @@ -226,6 +227,7 @@ spec: type: integer type: object required: + - callable - services type: object cascade: diff --git a/charts/platform/crds/frisbee.dev_services.yaml b/charts/platform/crds/frisbee.dev_services.yaml index 57046848..0d44a87e 100644 --- a/charts/platform/crds/frisbee.dev_services.yaml +++ b/charts/platform/crds/frisbee.dev_services.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: services.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/crds/frisbee.dev_templates.yaml b/charts/platform/crds/frisbee.dev_templates.yaml index 30b49183..d4cfd8aa 100644 --- a/charts/platform/crds/frisbee.dev_templates.yaml +++ b/charts/platform/crds/frisbee.dev_templates.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: templates.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/crds/frisbee.dev_virtualobjects.yaml b/charts/platform/crds/frisbee.dev_virtualobjects.yaml index e64fb465..ce451c85 100644 --- a/charts/platform/crds/frisbee.dev_virtualobjects.yaml +++ b/charts/platform/crds/frisbee.dev_virtualobjects.yaml @@ -3,7 +3,8 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.0 + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null name: virtualobjects.frisbee.dev spec: group: frisbee.dev diff --git a/charts/platform/templates/rbac/role.yaml b/charts/platform/templates/rbac/role.yaml index 4725bb59..b20d6f61 100644 --- a/charts/platform/templates/rbac/role.yaml +++ b/charts/platform/templates/rbac/role.yaml @@ -2,6 +2,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: + creationTimestamp: null name: frisbee rules: - apiGroups: diff --git a/charts/system/templates/chaos/network-partition.yml b/charts/system/templates/chaos/network-partition.yml index a796ef28..6d0c8df9 100644 --- a/charts/system/templates/chaos/network-partition.yml +++ b/charts/system/templates/chaos/network-partition.yml @@ -38,7 +38,7 @@ spec: apiVersion: frisbee.dev/v1alpha1 kind: Template metadata: - name: system.chaos.network.partition.scenario + name: frisbee.system.chaos.network.partition.scenario spec: inputs: scenario: "default" @@ -66,13 +66,13 @@ spec: {{.Release.Namespace}}: [{{"{{.inputs.parameters.source}}"}}] --- -# system.chaos.network.partition.namespace will separate the target service from every other service in the namespace, +# frisbee.system.chaos.network.partition.namespace will separate the target service from every other service in the namespace, # including the monitoring stack and other services irrelevant to frisbee. If the namespace is not specified, the # installation namespace will be used. apiVersion: frisbee.dev/v1alpha1 kind: Template metadata: - name: system.chaos.network.partition.namespace + name: frisbee.system.chaos.network.partition.namespace spec: inputs: parameters: diff --git a/cmd/kubectl-frisbee/commands/common/kubectl-wrapper.go b/cmd/kubectl-frisbee/commands/common/kubectl-wrapper.go index 208a630d..a033e1b2 100644 --- a/cmd/kubectl-frisbee/commands/common/kubectl-wrapper.go +++ b/cmd/kubectl-frisbee/commands/common/kubectl-wrapper.go @@ -620,9 +620,13 @@ const ( // ForceDelete iterates the Frisbee CRDs and remove its finalizers. func ForceDelete(testName string) error { - crds := []string{Services, Clusters, Chaos, Cascades, VirtualObjects, Calls, Templates, Scenarios} + // CRDS without finalizers: + // VirtualObjects + // Templates - for _, crd := range crds { + crdsWithFinalizers := []string{Services, Clusters, Chaos, Cascades, Calls, Scenarios} + + for _, crd := range crdsWithFinalizers { resourceQuery := []string{"get", crd, "-o", "jsonpath='{.items[*].metadata.name}'"} // get all resources of the given Kind diff --git a/cmd/kubectl-frisbee/commands/uninstall.go b/cmd/kubectl-frisbee/commands/uninstall.go index 8985d183..44501f59 100644 --- a/cmd/kubectl-frisbee/commands/uninstall.go +++ b/cmd/kubectl-frisbee/commands/uninstall.go @@ -26,12 +26,16 @@ import ( "github.com/spf13/cobra" ) -type PlatformUninstallOptions struct { +func UninstallCmdCompletion(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return common.CompleteFlags(cmd, args, toComplete) +} + +type UninstallOptions struct { RepositoryCache string DeleteTests, DeleteOperator, DeleteCRDS, DeleteCache, All bool } -func PopulatePlatformUninstallFlags(cmd *cobra.Command, options *PlatformUninstallOptions) { +func UninstallFlags(cmd *cobra.Command, options *UninstallOptions) { cmd.Flags().BoolVar(&options.DeleteTests, "tests", false, "delete frisbee tests") cmd.Flags().BoolVar(&options.DeleteOperator, "operator", false, "delete frisbee operator") cmd.Flags().BoolVar(&options.DeleteCRDS, "crds", false, "delete frisbee crds") @@ -43,12 +47,13 @@ func PopulatePlatformUninstallFlags(cmd *cobra.Command, options *PlatformUninsta } func NewUninstallCmd() *cobra.Command { - var options PlatformUninstallOptions + var options UninstallOptions cmd := &cobra.Command{ - Use: "uninstall", - Short: "Uninstall Frisbee from current kubectl context", - Aliases: []string{"un", "purge"}, + Use: "uninstall", + Short: "Uninstall Frisbee from current kubectl context", + Aliases: []string{"un", "purge"}, + ValidArgsFunction: UninstallCmdCompletion, PersistentPreRun: func(cmd *cobra.Command, args []string) { env.Logo() ui.SetVerbose(env.Default.Debug) @@ -119,7 +124,7 @@ func NewUninstallCmd() *cobra.Command { } }, } - PopulatePlatformUninstallFlags(cmd, &options) + UninstallFlags(cmd, &options) return cmd } diff --git a/controllers/common/controller.go b/controllers/common/controller.go index 117c1d99..7e1a409c 100644 --- a/controllers/common/controller.go +++ b/controllers/common/controller.go @@ -103,6 +103,8 @@ func Reconcile(parentCtx context.Context, r Reconciler, req ctrl.Request, obj cl /*-- make the calling controller to return --*/ *requeue = true + logger := r.WithValues("req", req) + /*--------------------------------------------------- * Retrieve CR by name *---------------------------------------------------*/ @@ -115,11 +117,11 @@ func Reconcile(parentCtx context.Context, r Reconciler, req ctrl.Request, obj cl return Stop(r, req) } + logger.Error(err, "Unable to find requested object") + return RequeueWithError(r, req, err) } - logger := r.WithValues("obj", client.ObjectKeyFromObject(obj)) - /*--------------------------------------------------- * Set Finalizers for CR *---------------------------------------------------*/ @@ -139,7 +141,7 @@ func Reconcile(parentCtx context.Context, r Reconciler, req ctrl.Request, obj cl retryCond := func(ctx context.Context) (done bool, err error) { if err := Update(ctx, r, obj); err != nil { // Retry - logger.Info("Retry to add finalizer", "obj", obj, "Err", err) + logger.Info("Retry to add finalizer", "err", err) return false, nil } @@ -182,7 +184,7 @@ func Reconcile(parentCtx context.Context, r Reconciler, req ctrl.Request, obj cl retryCond := func(ctx context.Context) (done bool, err error) { if err := Update(ctx, r, obj); err != nil { - logger.Info("Retry to remove finalizer", "obj", obj, "Err", err) + logger.Info("Retry to remove finalizer", "err", err) // Retry return false, nil @@ -210,25 +212,39 @@ func Reconcile(parentCtx context.Context, r Reconciler, req ctrl.Request, obj cl // Update will update the metadata and the spec of the Object. If there is a conflict, it will retry again. func Update(ctx context.Context, reconciler Reconciler, obj client.Object) error { - reconciler.Info("OO UpdtMeta", - "obj", client.ObjectKeyFromObject(obj), - "version", obj.GetResourceVersion(), - ) + logger := reconciler.WithValues("obj", client.ObjectKeyFromObject(obj)) + + logger.Info("OO UpdtMeta", "version", obj.GetResourceVersion()) + + err := reconciler.GetClient().Update(ctx, obj) + if k8errors.IsNotFound(err) { + logger.Info("Object Not found. Skip Update()") - return reconciler.GetClient().Update(ctx, obj) + return nil + } + + return err } // UpdateStatus will update the status of the Object. If there is a conflict, it will retry again. func UpdateStatus(ctx context.Context, reconciler Reconciler, obj client.Object) error { + logger := reconciler.WithValues("obj", client.ObjectKeyFromObject(obj)) + statusAwre, ok := obj.(v1alpha1.ReconcileStatusAware) if ok { - reconciler.Info("OO UpdtStatus", - "obj", client.ObjectKeyFromObject(obj), + logger.Info("OO UpdtStatus", "phase", statusAwre.GetReconcileStatus().Phase, "version", obj.GetResourceVersion(), ) - return reconciler.GetClient().Status().Update(ctx, obj) + err := reconciler.GetClient().Status().Update(ctx, obj) + if k8errors.IsNotFound(err) { + logger.Info("Object Not found. Skip UpdateStatus()") + + return nil + } + + return err } return errors.Errorf("object '%s' of GKV '%s' is not status aware", diff --git a/docs/api.html b/docs/api.html index d0df1333..1cf94424 100644 --- a/docs/api.html +++ b/docs/api.html @@ -16,1427 +16,1552 @@ ---

Packages:

frisbee.dev/v1alpha1

-

Package v1alpha1 contains API Schema definitions for the Frisbee v1alpha1 API group

+

Package v1alpha1 contains API Schema definitions for the Frisbee v1alpha1 API group

Resource Types:

Action

- (Appears on:ScenarioSpec) +(Appears on:ScenarioSpec)

-

Action is a step in a workflow that defines a particular part of a testing process.

+

Action is a step in a workflow that defines a particular part of a testing process.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- action
- - - ActionType - - -
-

ActionType refers to a category of actions that can be associated with a specific controller.

-
- name
- - string - -
-

Name is a unique identifier of the action

-
- depends
- - - WaitSpec - - -
- (Optional) -

DependsOn defines the conditions for the execution of this action

-
- assert
- - - ConditionalExpr - - -
- (Optional) -

Assert defines the conditions that must be maintained after the action has been started. - If the evaluation of the condition is false, the Scenario will abort immediately.

-
- EmbedActions
- - - EmbedActions - - -
-

- (Members of EmbedActions are embedded into this type.) -

-
FieldDescription
+action
+ + +ActionType + + +
+

ActionType refers to a category of actions that can be associated with a specific controller.

+
+name
+ +string + +
+

Name is a unique identifier of the action

+
+depends
+ + +WaitSpec + + +
+(Optional) +

DependsOn defines the conditions for the execution of this action

+
+assert
+ + +ConditionalExpr + + +
+(Optional) +

Assert defines the conditions that must be maintained after the action has been started. +If the evaluation of the condition is false, the Scenario will abort immediately.

+
+EmbedActions
+ + +EmbedActions + + +
+

+(Members of EmbedActions are embedded into this type.) +

+

ActionType - (string alias)

+(string alias)

- (Appears on:Action) +(Appears on:Action)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
ValueDescription

"Call"

ActionCall starts a remote process execution, from the controller to the targeted services.

-

"Cascade"

ActionCascade injects multiple failures into the running system.

-

"Chaos"

ActionChaos injects failures into the running system.

-

"Cluster"

ActionCluster creates multiple services running in a shared context.

-

"Delete"

ActionDelete deletes a created Frisbee resource (i.e services, clusters,).

-

"Service"

ActionService creates a new service.

-
ValueDescription

"Call"

ActionCall starts a remote process execution, from the controller to the targeted services.

+

"Cascade"

ActionCascade injects multiple failures into the running system.

+

"Chaos"

ActionChaos injects failures into the running system.

+

"Cluster"

ActionCluster creates multiple services running in a shared context.

+

"Delete"

ActionDelete deletes a created Frisbee resource (i.e services, clusters,).

+

"Service"

ActionService creates a new service.

+

Call

-

Call is the Schema for the Call API.

+

Call is the Schema for the Call API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - CallSpec - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- callable
- - string - -
-

Callable is the name of the endpoint that will be called

-
- services
- - []string - -
-

Services is a list of services that will be stopped.

-
- expect
- - - []MatchOutputs - - -
- (Optional) -

Expect declares a list of expected outputs. The number of expected outputs must be the same - as the number of defined services.

-
- tolerate
- - - TolerateSpec - - -
- (Optional) -

Tolerate specifies the conditions under which the call will fail. If undefined, the call - fails - immediately when a call to service has failed.

-
- until
- - - ConditionalExpr - - -
- (Optional) -

Until defines the conditions under which the CR will stop spawning new jobs. - If used in conjunction with inputs, it will loop over inputs until the conditions are - met.

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the invocations of the callable.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
-
- status
- - - CallStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +CallSpec + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+callable
+ +string + +
+

Callable is the name of the endpoint that will be called

+
+services
+ +[]string + +
+

Services is a list of services that will be stopped.

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +
	Job Scheduling
+
+

Schedule defines the interval between the invocations of the callable.

+
+expect
+ + +[]MatchOutputs + + +
+(Optional) +

Expect declares a list of expected outputs. The number of expected outputs must be the same +as the number of defined services.

+
+suspend
+ +bool + +
+(Optional) +
	Execution Flow
+
+

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+
+tolerate
+ + +TolerateSpec + + +
+(Optional) +

Tolerate specifies the conditions under which the call will fail. If undefined, the call fails +immediately when a call to service has failed.

+
+
+status
+ + +CallStatus + + +
+

CallSpec

- (Appears on:Call, EmbedActions) +(Appears on:Call, EmbedActions)

-

CallSpec defines the desired state of Call.

+

CallSpec defines the desired state of Call.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- callable
- - string - -
-

Callable is the name of the endpoint that will be called

-
- services
- - []string - -
-

Services is a list of services that will be stopped.

-
- expect
- - - []MatchOutputs - - -
- (Optional) -

Expect declares a list of expected outputs. The number of expected outputs must be the same - as the number of defined services.

-
- tolerate
- - - TolerateSpec - - -
- (Optional) -

Tolerate specifies the conditions under which the call will fail. If undefined, the call fails - immediately when a call to service has failed.

-
- until
- - - ConditionalExpr - - -
- (Optional) -

Until defines the conditions under which the CR will stop spawning new jobs. - If used in conjunction with inputs, it will loop over inputs until the conditions are met.

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the invocations of the callable.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
FieldDescription
+callable
+ +string + +
+

Callable is the name of the endpoint that will be called

+
+services
+ +[]string + +
+

Services is a list of services that will be stopped.

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +
	Job Scheduling
+
+

Schedule defines the interval between the invocations of the callable.

+
+expect
+ + +[]MatchOutputs + + +
+(Optional) +

Expect declares a list of expected outputs. The number of expected outputs must be the same +as the number of defined services.

+
+suspend
+ +bool + +
+(Optional) +
	Execution Flow
+
+

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+
+tolerate
+ + +TolerateSpec + + +
+(Optional) +

Tolerate specifies the conditions under which the call will fail. If undefined, the call fails +immediately when a call to service has failed.

+

CallStatus

- (Appears on:Call) +(Appears on:Call)

-

CallStatus defines the observed state of Call.

+

CallStatus defines the observed state of Call.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- queuedJobs
- - - []Callable - - -
- (Optional) -

QueuedJobs is a list of services scheduled for stopping.

-
- scheduledJobs
- - int - -
-

ScheduledJobs points to the next QueuedJobs.

-
- lastScheduleTime
- - - Kubernetes meta/v1.Time - - -
-

LastScheduleTime provide information about the last time a Service was successfully scheduled.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+queuedJobs
+ + +[]Callable + + +
+(Optional) +

QueuedJobs is a list of services scheduled for stopping.

+
+expectedTimeline
+ + +Timeline + + +
+(Optional) +

ExpectedTimeline is the result of evaluating a timeline distribution into specific points in time.

+
+scheduledJobs
+ +int + +
+

ScheduledJobs points to the next QueuedJobs.

+
+lastScheduleTime
+ + +Kubernetes meta/v1.Time + + +
+

LastScheduleTime provide information about the last time a Service was successfully scheduled.

+

Callable

- (Appears on:CallStatus, ServiceSpec) +(Appears on:CallStatus, ServiceSpec)

-

Callable is a script that is executed within the service container, and returns a value. - For example, a callable can be a command for stopping the containers that run in the Pod.

+

Callable is a script that is executed within the service container, and returns a value. +For example, a callable can be a command for stopping the containers that run in the Pod.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- container
- - string - -
-

Container specific the name of the container to which we will run the command

-
- command
- - []string - -
-

Container specifies a command and arguments to stop the targeted container in an application-specific - manner.

-
FieldDescription
+container
+ +string + +
+

Container specific the name of the container to which we will run the command

+
+command
+ +[]string + +
+

Container specifies a command and arguments to stop the targeted container in an application-specific manner.

+

Cascade

-

Cascade is the Schema for the clusters API.

+

Cascade is the Schema for the clusters API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - CascadeSpec - - -
-
-
- - - - - - - - - - - - - -
- GenerateFromTemplate
- - - GenerateFromTemplate - - -
-

- (Members of GenerateFromTemplate are embedded into this type.) -

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the creation of services within the group.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
-
- status
- - - CascadeStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +CascadeSpec + + +
+
+
+ + + + + + + + + + + + + + + + + +
+GenerateObjectFromTemplate
+ + +GenerateObjectFromTemplate + + +
+

+(Members of GenerateObjectFromTemplate are embedded into this type.) +

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +

Schedule defines the interval between the creation of services within the group.

+
+suspend
+ +bool + +
+(Optional) +

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+
+
+status
+ + +CascadeStatus + + +
+

CascadeSpec

- (Appears on:Cascade, EmbedActions) +(Appears on:Cascade, EmbedActions)

-

CascadeSpec defines the desired state of Cascade.

+

CascadeSpec defines the desired state of Cascade.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- GenerateFromTemplate
- - - GenerateFromTemplate - - -
-

- (Members of GenerateFromTemplate are embedded into this type.) -

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the creation of services within the group.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
FieldDescription
+GenerateObjectFromTemplate
+ + +GenerateObjectFromTemplate + + +
+

+(Members of GenerateObjectFromTemplate are embedded into this type.) +

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +

Schedule defines the interval between the creation of services within the group.

+
+suspend
+ +bool + +
+(Optional) +

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+

CascadeStatus

- (Appears on:Cascade) +(Appears on:Cascade)

-

CascadeStatus defines the observed state of Cascade.

+

CascadeStatus defines the observed state of Cascade.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- queuedJobs
- - - []ChaosSpec - - -
- (Optional) -

QueuedJobs is a list of Chaos jobs scheduled for creation by the cascade.

-
- scheduledJobs
- - int - -
-

ScheduledJobs points to the next QueuedJobs.

-
- lastScheduleTime
- - - Kubernetes meta/v1.Time - - -
-

LastScheduleTime provide information about the last time a Chaos job was successfully scheduled.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+queuedJobs
+ + +[]ChaosSpec + + +
+(Optional) +

QueuedJobs is a list of Chaos jobs scheduled for creation by the cascade.

+
+expectedTimeline
+ + +Timeline + + +
+(Optional) +

ExpectedTimeline is the result of evaluating a timeline distribution into specific points in time.

+
+scheduledJobs
+ +int + +
+

ScheduledJobs points to the next QueuedJobs.

+
+lastScheduleTime
+ + +Kubernetes meta/v1.Time + + +
+

LastScheduleTime provide information about the last time a Chaos job was successfully scheduled.

+

Chaos

-

Chaos is the Schema for the chaos API.

+

Chaos is the Schema for the chaos API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - ChaosSpec - - -
-
-
- - - - - -
- raw
- - string - -
-
-
- status
- - - ChaosStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +ChaosSpec + + +
+
+
+ + + + + +
+raw
+ +string + +
+
+
+status
+ + +ChaosStatus + + +
+

ChaosSpec

- (Appears on:CascadeStatus, Chaos, EmbedSpecs) +(Appears on:CascadeStatus, Chaos, EmbedSpecs)

-

ChaosSpec defines the desired state of Chaos.

+

ChaosSpec defines the desired state of Chaos.

- - - - - - - - - - - - + + + + + + + + + + + +
FieldDescription
- raw
- - string - -
-
FieldDescription
+raw
+ +string + +
+

ChaosStatus

- (Appears on:Chaos) +(Appears on:Chaos)

-

ChaosStatus defines the observed state of Chaos.

+

ChaosStatus defines the observed state of Chaos.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- lastScheduleTime
- - - Kubernetes meta/v1.Time - - -
-

LastScheduleTime provide information about the last time a Pod was scheduled.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+lastScheduleTime
+ + +Kubernetes meta/v1.Time + + +
+

LastScheduleTime provide information about the last time a Pod was scheduled.

+

Cluster

-

Cluster is the Schema for the clusters API.

+

Cluster is the Schema for the clusters API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - ClusterSpec - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- GenerateFromTemplate
- - - GenerateFromTemplate - - -
-

- (Members of GenerateFromTemplate are embedded into this type.) -

-
- testData
- - - TestdataVolume - - -
-

TestData defines a volume that will be mounted across the Scenario’s Services.

-
- tolerate
- - - TolerateSpec - - -
- (Optional) -

Tolerate specifies the conditions under which the cluster will fail. If undefined, the - cluster fails - immediately when a service has failed.

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the creation of services in the group.

-
- placement
- - - PlacementSpec - - -
- (Optional) -

Placement defines rules for placing the containers across the available nodes.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does not apply to - already started - executions. Defaults to false.

-
-
- status
- - - ClusterStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +ClusterSpec + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+GenerateObjectFromTemplate
+ + +GenerateObjectFromTemplate + + +
+

+(Members of GenerateObjectFromTemplate are embedded into this type.) +

+
+testData
+ + +TestdataVolume + + +
+(Optional) +

TestData defines a volume that will be mounted across the Scenario’s Services.

+
+defaultDistribution
+ + +DistributionSpec + + +
+(Optional) +

DefaultDistributionSpec pre-calculates a scoped distribution that can be accessed by other entities +using “distribution.name : default”. This default distribution allows us to describe complex relations +across features managed by different entities (e.g, place the largest dataset on the largest node).

+
+resources
+ + +ResourceDistributionSpec + + +
+(Optional) +

Resources defines how a set of resources will be distributed among the cluster’s services.

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +

Schedule defines the interval between the creation of services in the group.

+
+placement
+ + +PlacementSpec + + +
+(Optional) +

Placement defines rules for placing the containers across the available nodes.

+
+suspend
+ +bool + +
+(Optional) +

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+
+tolerate
+ + +TolerateSpec + + +
+(Optional) +

Tolerate forces the Controller to continue in spite of failed jobs.

+
+
+status
+ + +ClusterStatus + + +
+

ClusterSpec

- (Appears on:Cluster, EmbedActions) +(Appears on:Cluster, EmbedActions)

-

ClusterSpec defines the desired state of Cluster.

+

ClusterSpec defines the desired state of Cluster.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- GenerateFromTemplate
- - - GenerateFromTemplate - - -
-

- (Members of GenerateFromTemplate are embedded into this type.) -

-
- testData
- - - TestdataVolume - - -
-

TestData defines a volume that will be mounted across the Scenario’s Services.

-
- tolerate
- - - TolerateSpec - - -
- (Optional) -

Tolerate specifies the conditions under which the cluster will fail. If undefined, the cluster fails - immediately when a service has failed.

-
- schedule
- - - SchedulerSpec - - -
- (Optional) -

Schedule defines the interval between the creation of services in the group.

-
- placement
- - - PlacementSpec - - -
- (Optional) -

Placement defines rules for placing the containers across the available nodes.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does not apply to already started - executions. Defaults to false.

-
FieldDescription
+GenerateObjectFromTemplate
+ + +GenerateObjectFromTemplate + + +
+

+(Members of GenerateObjectFromTemplate are embedded into this type.) +

+
+testData
+ + +TestdataVolume + + +
+(Optional) +

TestData defines a volume that will be mounted across the Scenario’s Services.

+
+defaultDistribution
+ + +DistributionSpec + + +
+(Optional) +

DefaultDistributionSpec pre-calculates a scoped distribution that can be accessed by other entities +using “distribution.name : default”. This default distribution allows us to describe complex relations +across features managed by different entities (e.g, place the largest dataset on the largest node).

+
+resources
+ + +ResourceDistributionSpec + + +
+(Optional) +

Resources defines how a set of resources will be distributed among the cluster’s services.

+
+schedule
+ + +TaskSchedulerSpec + + +
+(Optional) +

Schedule defines the interval between the creation of services in the group.

+
+placement
+ + +PlacementSpec + + +
+(Optional) +

Placement defines rules for placing the containers across the available nodes.

+
+suspend
+ +bool + +
+(Optional) +

Suspend forces the Controller to stop scheduling any new jobs until it is resumed. Defaults to false.

+
+suspendWhen
+ + +ConditionalExpr + + +
+(Optional) +

SuspendWhen automatically sets Suspend to True, when certain conditions are met.

+
+tolerate
+ + +TolerateSpec + + +
+(Optional) +

Tolerate forces the Controller to continue in spite of failed jobs.

+

ClusterStatus

- (Appears on:Cluster) +(Appears on:Cluster)

-

ClusterStatus defines the observed state of Cluster.

+

ClusterStatus defines the observed state of Cluster.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- queuedJobs
- - - []ServiceSpec - - -
- (Optional) -

QueuedJobs is a list of services scheduled for creation by the cluster.

-
- scheduledJobs
- - int - -
-

ScheduledJobs points to the next QueuedJobs.

-
- lastScheduleTime
- - - Kubernetes meta/v1.Time - - -
-

LastScheduleTime provide information about the last time a Service was successfully scheduled.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+queuedJobs
+ + +[]ServiceSpec + + +
+(Optional) +

QueuedJobs is a list of jobs that the controller has to scheduled.

+
+defaultDistribution
+ +[]float64 + +
+(Optional) +

DefaultDistribution keeps the evaluated expression of GenerateObjectFromTemplate.DefaultDistributionSpec.

+
+expectedTimeline
+ + +Timeline + + +
+(Optional) +

ExpectedTimeline is the result of evaluating a timeline distribution into specific points in time.

+
+scheduledJobs
+ +int + +
+

ScheduledJobs points to the next QueuedJobs.

+
+lastScheduleTime
+ + +Kubernetes meta/v1.Time + + +
+

LastScheduleTime provide information about the last time a Job was successfully scheduled.

+

Component - (string alias)

+(string alias)
- - - - - - - - - - - - - - - - + + + + + + + + + + +
ValueDescription

"SUT"

ComponentSUT is a component that belongs to the system under testing.

-

"SYS"

ComponentSys is a Frisbee component that is necessary for the execution of a test (e.g, Chaos, Grafana, - …)

-
ValueDescription

"SUT"

ComponentSUT is a component that belongs to the system under testing.

+

"SYS"

ComponentSys is a Frisbee component that is necessary for the execution of a test (e.g, Chaos, Grafana, …)

+

ConditionType - (string alias)

+(string alias)
-

ConditionType is a valid value for WorkflowCondition.Type

+

ConditionType is a valid value for WorkflowCondition.Type.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
ValueDescription

"AllJobsAreCompleted"

ConditionAllJobsAreCompleted indicates that all jobs have been successfully completed. - Jobs may refer to actions of a scenario, services of a cluster, chaos events of a cascade, etc.

-

"AllJobsAreScheduled"

ConditionAllJobsAreScheduled indicates that all jobs have been successfully scheduled. - Jobs may refer to actions of a scenario, services of a cluster, chaos events of a cascade, etc.

-

"AssertError"

ConditionAssertionError indicate that an assertion condition is false.

-

"Initialized"

ConditionCRInitialized indicates whether the workflow has been initialized

-

"InvalidStateTransition"

ConditionInvalidStateTransition indicates the transition of a resource into another state. - This is used for debugging.

-

"UnexpectedTermination"

ConditionJobUnexpectedTermination is used for a job that has been unexpectedly terminated. - The termination refers to both Success and Fail.

-
ValueDescription

"AllJobsAreCompleted"

ConditionAllJobsAreCompleted indicates that all jobs have been successfully completed. +Jobs may refer to actions of a scenario, services of a cluster, chaos events of a cascade, etc.

+

"AllJobsAreScheduled"

ConditionAllJobsAreScheduled indicates that all jobs have been successfully scheduled. +Jobs may refer to actions of a scenario, services of a cluster, chaos events of a cascade, etc.

+

"AssertError"

ConditionAssertionError indicate that an assertion condition is false.

+

"Initialized"

ConditionCRInitialized indicates whether the workflow has been initialized.

+

"InvalidStateTransition"

ConditionInvalidStateTransition indicates the transition of a resource into another state. +This is used for debugging.

+

"UnexpectedTermination"

ConditionJobUnexpectedTermination is used for a job that has been unexpectedly terminated. +The termination refers to both Success and Fail.

+

ConditionalExpr

- (Appears on:Action, CallSpec, - GenerateFromTemplate, SchedulerSpec) +(Appears on:Action, CallSpec, CascadeSpec, ClusterSpec, TaskSchedulerSpec)

-

ConditionalExpr is a source of information about whether the state of the workflow after a given time is correct - or not. - This is needed because some scenarios may run in infinite-horizons.

+

ConditionalExpr is a source of information about whether the state of the workflow after a given time is correct or not. +This is needed because some scenarios may run in infinite-horizons.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- metrics
- - - ExprMetrics - - -
- (Optional) -

Metrics set a Grafana alert that will be triggered once the condition is met. - Parsing: - Grafana URL: http://grafana/d/A2EjFbsMk/ycsb-services?editPanel=86 - metrics: A2EjFbsMk/86/Average (Panel/Dashboard/Metric)

-
- state
- - - ExprState - - -
- (Optional) -

State describe the runtime condition that should be met after the action has been executed - Shall be defined using .Lifecycle() methods. The methods account only jobs that are managed by the - object.

-
FieldDescription
+metrics
+ + +ExprMetrics + + +
+(Optional) +

Metrics set a Grafana alert that will be triggered once the condition is met. +Parsing: +Grafana URL: http://grafana/d/A2EjFbsMk/ycsb-services?editPanel=86 +metrics: A2EjFbsMk/86/Average (Panel/Dashboard/Metric)

+
+state
+ + +ExprState + + +
+(Optional) +

State describe the runtime condition that should be met after the action has been executed +Shall be defined using .Lifecycle() methods. The methods account only jobs that are managed by the object.

+

Decorators

- (Appears on:ServiceSpec) +(Appears on:ServiceSpec)

-

Decorators takes-in a PodSpec, add some functionality and returns it.

+

Decorators takes-in a PodSpec, add some functionality and returns it.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- labels
- - map[string]string - -
- (Optional) -
- annotations
- - map[string]string - -
- (Optional) -
- setFields
- - - []SetField - - -
- (Optional) -

SetFields is used to populate fields. Used for dynamic assignment based templated inputs.

-
- resources
- - - Resources - - -
- (Optional) -

Resources specifies limitations as to how the container will access host resources.

-
- telemetry
- - []string - -
- (Optional) -

Telemetry is a list of referenced agents responsible to monitor the Service. - Agents are sidecar services will be deployed in the same Pod as the Service container.

-
FieldDescription
+labels
+ +map[string]string + +
+(Optional) +
+annotations
+ +map[string]string + +
+(Optional) +
+setFields
+ + +[]SetField + + +
+(Optional) +

SetFields is used to populate fields. Used for dynamic assignment based templated inputs.

+
+telemetry
+ +[]string + +
+(Optional) +

Telemetry is a list of referenced agents responsible to monitor the Service. +Agents are sidecar services will be deployed in the same Pod as the Service container.

+
+ingressPort
+ + +Kubernetes networking/v1.ServiceBackendPort + + +
+(Optional) +

IngressPort builds an ingress for making the service’s port accessible outside the Kubernetes cluster.

+

DefaultClassifier

@@ -1445,2135 +1570,2033 @@

DefaultClassifier

DeleteSpec

- (Appears on:EmbedActions) +(Appears on:EmbedActions)

- - - - - - - - - - - - + + + + + + + + + + + +
FieldDescription
- jobs
- - []string - -
-

Jobs is a list of jobs to be deleted. The format is {“kind”:“name”}, e.g, {“service”,“client”}

-
FieldDescription
+jobs
+ +[]string + +
+

Jobs is a list of jobs to be deleted. The format is {“kind”:“name”}, e.g, {“service”,“client”}

+

Disk

- (Appears on:Resources) +(Appears on:Resources)

-

Disk specifies the capabilities of the emulated storage device.

+

Disk specifies the capabilities of the emulated storage device.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- readbps
- - string - -
-

ReadBPS limits read rate (bytes per second)

-
- readiops
- - string - -
-

ReadIOPS limits read rate (IO per second)

-
- writebps
- - string - -
-

WriteBPS limits write rate (bytes per second)

-
- writeiops
- - string - -
-

WriteIOPS limits write rate (IO per second)

-
FieldDescription
+readbps
+ +string + +
+

ReadBPS limits read rate (bytes per second)

+
+readiops
+ +string + +
+

ReadIOPS limits read rate (IO per second)

+
+writebps
+ +string + +
+

WriteBPS limits write rate (bytes per second)

+
+writeiops
+ +string + +
+

WriteIOPS limits write rate (IO per second)

+
-

EmbedActions +

DistParamsPareto

- (Appears on:Action) +(Appears on:DistributionSpec)

+

DistParamsPareto are parameters for the Pareto distribution.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- service
- - - GenerateFromTemplate - - -
- (Optional) -
- cluster
- - - ClusterSpec - - -
- (Optional) -
- chaos
- - - GenerateFromTemplate - - -
- (Optional) -
- cascade
- - - CascadeSpec - - -
- (Optional) -
- delete
- - - DeleteSpec - - -
- (Optional) -
- call
- - - CallSpec - - -
- (Optional) -
FieldDescription
+scale
+ +float64 + +
+
+shape
+ +float64 + +
+
-

EmbedSpecs +

DistributionName +(string alias)

+

+(Appears on:DistributionSpec) +

+
+
+ + + + + + + + + + + + + + + + + + +
ValueDescription

"constant"

DistributionConstant is a fixed distributed with all elements having a probability of 1.

+

"default"

DistributionDefault instructs the controller to use an already evaluated distribution.

+

"normal"

DistributionNormal draws samples from a normal (Gaussian) distribution

+

"pareto"

DistributionPareto draws samples from a Pareto distribution

+

"uniform"

DistributionUniform draws samples from a continuous uniform distribution

+
+

DistributionSpec

- (Appears on:TemplateSpec) +(Appears on:ClusterSpec, ResourceDistributionSpec, TimelineDistributionSpec)

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- service
- - - ServiceSpec - - -
- (Optional) -
- chaos
- - - ChaosSpec - - -
- (Optional) -
FieldDescription
+name
+ + +DistributionName + + +
+
+histogram
+ + +DistParamsPareto + + +
+(Optional) +
-

EphemeralVolumeSpec +

EmbedActions

- (Appears on:Requirements) +(Appears on:Action)

-

EphemeralVolumeSpec defines an ephemeral volume that has the lifetime of a pod, - It’s use for application that need additional storage but don’t care whether - that data is stored persistently across restarts.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- name
- - string - -
-
- spec
- - - Kubernetes core/v1.PersistentVolumeClaimSpec - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- accessModes
- - - []Kubernetes core/v1.PersistentVolumeAccessMode - - -
- (Optional) -

accessModes contains the desired access modes the volume should have. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 -

-
- selector
- - - Kubernetes meta/v1.LabelSelector - - -
- (Optional) -

selector is a label query over volumes to consider for binding.

-
- resources
- - - Kubernetes core/v1.ResourceRequirements - - -
- (Optional) -

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 -

-
- volumeName
- - string - -
- (Optional) -

volumeName is the binding reference to the PersistentVolume backing this claim.

-
- storageClassName
- - string - -
- (Optional) -

storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 -

-
- volumeMode
- - - Kubernetes core/v1.PersistentVolumeMode - - -
- (Optional) -

volumeMode defines what type of volume is required by the claim. - Value of Filesystem is implied when not included in claim spec.

-
- dataSource
- - - Kubernetes core/v1.TypedLocalObjectReference - - -
- (Optional) -

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. - If the AnyVolumeDataSource feature gate is enabled, this field will always have - the same contents as the DataSourceRef field.

-
- dataSourceRef
- - - Kubernetes core/v1.TypedLocalObjectReference - - -
- (Optional) -

dataSourceRef specifies the object from which to populate the volume with data, if a - non-empty - volume is desired. This may be any local 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, 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. - There are two 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. - (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.

-
-
FieldDescription
+service
+ + +GenerateObjectFromTemplate + + +
+(Optional) +
+cluster
+ + +ClusterSpec + + +
+(Optional) +
+chaos
+ + +GenerateObjectFromTemplate + + +
+(Optional) +
+cascade
+ + +CascadeSpec + + +
+(Optional) +
+delete
+ + +DeleteSpec + + +
+(Optional) +
+call
+ + +CallSpec + + +
+(Optional) +
+

EmbedSpecs +

+

+(Appears on:TemplateSpec) +

+
+
+ + + + + + + + + + + + + + + + +
FieldDescription
+service
+ + +ServiceSpec + + +
+(Optional) +
+chaos
+ + +ChaosSpec + + +
+(Optional) +

ExprMetrics - (string alias)

+(string alias)

- (Appears on:ConditionalExpr) +(Appears on:ConditionalExpr)

ExprState - (string alias)

+(string alias)

- (Appears on:ConditionalExpr) +(Appears on:ConditionalExpr)

-

GenerateFromTemplate +

GenerateObjectFromTemplate

- (Appears on:CascadeSpec, ClusterSpec, EmbedActions) +(Appears on:CascadeSpec, ClusterSpec, EmbedActions)

-

GenerateFromTemplate generates a spec by parameterizing the templateRef with the given inputs.

+

GenerateObjectFromTemplate generates a spec by parameterizing the templateRef with the given inputs.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- templateRef
- - string - -
-

TemplateRef refers to a template (e.g, iperf-server).

-
- until
- - - ConditionalExpr - - -
- (Optional) -

Until defines the conditions under which the CR will stop spawning new jobs. - If used in conjunction with inputs, it will loop over inputs until the conditions are met.

-
- instances
- - int - -
- (Optional) -

MaxInstances dictate the number of objects to be created for the CR. - If no inputs are defined, then all instances will be initiated using the default parameters of the - template. - Event used in conjunction with Until, MaxInstances as a max bound.

-
- inputs
- - []map[string]string - -
- (Optional) -

Inputs are list of inputs passed to the objects. - Event used in conjunction with instances, if the number of instances is larger that the number of - inputs, - then inputs are recursively iteration.

-
FieldDescription
+templateRef
+ +string + +
+

TemplateRef refers to a template (e.g, iperf-server).

+
+instances
+ +int + +
+(Optional) +

MaxInstances dictate the number of objects to be created for the CR. +If no inputs are defined, then all instances will be initiated using the default parameters of the template. +Event used in conjunction with Until, MaxInstances as a max bound.

+
+inputs
+ + +[]UserInputs + + +
+(Optional) +

UserParameters is a map of parameters passed to the objects. +Event used in conjunction with instances, if the number of instances is larger that the number of inputs, +then inputs are recursively iteration.

+
-

Inputs +

JobStatus

-

- (Appears on:Scheme, TemplateSpec) -

- - - - - - - - - - - - - -
FieldDescription
- parameters
- - map[string]string - -
-

Parameters are user-set values that are dynamically evaluated

-

Lifecycle

- (Appears on:CallStatus, CascadeStatus, ChaosStatus, - ClusterStatus, ScenarioStatus, - ServiceStatus, TemplateStatus, - VirtualObjectStatus) +(Appears on:CallStatus, CascadeStatus, ChaosStatus, ClusterStatus, ScenarioStatus, ServiceStatus, TemplateStatus, VirtualObjectStatus)

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- phase
- - - Phase - - -
-

Phase is a simple, high-level summary of where the Object is in its lifecycle. - The conditions array, the reason and message fields, and the individual container status - arrays contain more detail about the pod’s status.

-
- reason
- - string - -
- (Optional) -

Reason is A brief CamelCase message indicating details about why the service is in this Phase. - e.g. ‘Evicted’

-
- message
- - string - -
-

Message provides more details for understanding the Reason.

-
- conditions
- - - []Kubernetes meta/v1.Condition - - -
- (Optional) -

Conditions describe sequences of events that warrant the present Phase.

-
FieldDescription
+phase
+ + +Phase + + +
+

Phase is a simple, high-level summary of where the Object is in its lifecycle. +The conditions array, the reason and message fields, and the individual container status +arrays contain more detail about the pod’s status.

+
+reason
+ +string + +
+(Optional) +

Reason is A brief CamelCase message indicating details about why the service is in this Phase. +e.g. ‘Evicted’

+
+message
+ +string + +
+

Message provides more details for understanding the Reason.

+
+conditions
+ + +[]Kubernetes meta/v1.Condition + + +
+(Optional) +

Conditions describe sequences of events that warrant the present Phase.

+
+

ListJobs +

+
+

MatchBy

- (Appears on:ServiceSelector) +(Appears on:ServiceSelector)

-

MatchBy defines the selectors for services. - If the all selectors are empty, all services will be selected.

+

MatchBy defines the selectors for services. +If the all selectors are empty, all services will be selected.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- byName
- - map[string][]string - -
- (Optional) -

ByName is a map of string keys and a set values that used to select services. - The key defines the namespace which services belong, and the values is a set of service names.

-
- byCluster
- - map[string]string - -
- (Optional) -

ByCluster defines the service group where services belong.

-
FieldDescription
+byName
+ +map[string][]string + +
+(Optional) +

ByName is a map of string keys and a set values that used to select services. +The key defines the namespace which services belong, and the values is a set of service names.

+
+byCluster
+ +map[string]string + +
+(Optional) +

ByCluster defines the service group where services belong.

+

MatchOutputs

- (Appears on:CallSpec) +(Appears on:CallSpec)

-

MatchOutputs defined a set of remote command outputs that must be matched. The limit for both Stdout and Stderr - is 1024 characters.

+

MatchOutputs defined a set of remote command outputs that must be matched. The limit for both Stdout and Stderr +is 1024 characters.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- stdout
- - string - -
- (Optional) -

Stdout is a regex that describes the expected output from stdout. It cannot be longer than 1024 - characters.

-
- stderr
- - string - -
- (Optional) -

Stderr is a regex that describes the expected output from stderr. It cannot be longer than 1024 - characters.

-
FieldDescription
+stdout
+ +string + +
+(Optional) +

Stdout is a regex that describes the expected output from stdout. It cannot be longer than 1024 characters.

+
+stderr
+ +string + +
+(Optional) +

Stderr is a regex that describes the expected output from stderr. It cannot be longer than 1024 characters.

+

Mode - (string alias)

+(string alias)

- (Appears on:ServiceSelector) +(Appears on:ServiceSelector)

-

Mode represents the filter for selecting on of many.

+

Mode represents the filter for selecting on of many.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +
ValueDescription

"all"

AllMode represents that the system will select all objects regardless of status - (not ready or not running pods includes). - Use this label carefully.

-

"fixed"

FixedMode represents that the system will select a specific number of running objects.

-

"fixed-percent"

FixedPercentMode to specify a fixed % of a cluster

-

"one"

OneMode represents that the system will select one object randomly.

-

"random-max-percent"

RandomMaxPercentMode to specify a maximum % of a cluster

-
ValueDescription

"all"

AllMode represents that the system will select all objects regardless of status +(not ready or not running pods includes). +Use this label carefully.

+

"fixed"

FixedMode represents that the system will select a specific number of running objects.

+

"fixed-percent"

FixedPercentMode to specify a fixed % of a cluster.

+

"one"

OneMode represents that the system will select one object randomly.

+

"random-max-percent"

RandomMaxPercentMode to specify a maximum % of a cluster.

+

NIC

- (Appears on:Resources) +(Appears on:Resources)

-

NIC specifies the capabilities of the emulated network interface.

+

NIC specifies the capabilities of the emulated network interface.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- rate
- - string - -
-
- latency
- - string - -
-
FieldDescription
+rate
+ +string + +
+
+latency
+ +string + +
+
+

NumberOfJobs +

+
+
+

Parameters +(map[string]*k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1.JSON alias)

+

+(Appears on:TemplateInputs) +

+
+

Phase - (string alias)

+(string alias)

- (Appears on:Lifecycle) +(Appears on:Lifecycle)

-

Phase is a simple, high-level summary of where the Object is in its lifecycle.

+

Phase is a simple, high-level summary of where the Object is in its lifecycle.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +
ValueDescription

"Failed"

PhaseFailed means that at least one job of the CR has terminated in a failure (exited with a - non-zero exit code or was stopped by the system).

-

"Pending"

PhasePending means that the CR has been accepted by the Kubernetes cluster, but one of the child - jobs has not been created. This includes the time waiting for logical dependencies, Ports discovery, - data rewiring, and placement of Pods.

-

"Running"

PhaseRunning means that all the child jobs of a CR have been created, and at least one job - is still running.

-

"Success"

PhaseSuccess means that all jobs in a CR have voluntarily exited, and the system is not going - to restart any of these Jobs.

-

""

PhaseUninitialized means that request is not yet accepted by the controller.

-
ValueDescription

"Failed"

PhaseFailed means that at least one job of the CR has terminated in a failure (exited with a +non-zero exit code or was stopped by the system).

+

"Pending"

PhasePending means that the CR has been accepted by the Kubernetes cluster, but one of the child +jobs has not been created. This includes the time waiting for logical dependencies, Ports discovery, +data rewiring, and placement of Pods.

+

"Running"

PhaseRunning means that all the child jobs of a CR have been created, and at least one job +is still running.

+

"Success"

PhaseSuccess means that all jobs in a CR have voluntarily exited, and the system is not going +to restart any of these Jobs.

+

""

PhaseUninitialized means that request is not yet accepted by the controller.

+

PlacementSpec

- (Appears on:ClusterSpec) +(Appears on:ClusterSpec)

-

PlacementSpec defines rules for placing the containers across the available nodes.

+

PlacementSpec defines rules for placing the containers across the available nodes.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- collocate
- - bool - -
- (Optional) -

Collocate will place all the Services of this Cluster within the same node.

-
- conflictsWith
- - []string - -
-

ConflictsWith points to another Cluster whose Services cannot be located with this one. - For example, this is needed for placing the master nodes on a different failure domain than the slave - nodes.

-
- nodes
- - []string - -
- (Optional) -

Nodes will place all the Services of this Cluster within the specific set of nodes.

-
FieldDescription
+collocate
+ +bool + +
+(Optional) +

Collocate will place all the Services of this Cluster within the same node.

+
+conflictsWith
+ +[]string + +
+

ConflictsWith points to another Cluster whose Services cannot be located with this one. +For example, this is needed for placing the master nodes on a different failure domain than the slave nodes.

+
+nodes
+ +[]string + +
+(Optional) +

Nodes will place all the Services of this Cluster within the specific set of nodes.

+

ReconcileStatusAware

-

Requirements +

ResourceDistribution +([]k8s.io/api/core/v1.ResourceList alias)

+
+
+

ResourceDistributionSpec

- (Appears on:ServiceSpec) +(Appears on:ClusterSpec)

-

Requirements points to Kinds and their respective configurations required for the Service operation. - For example, this field can be used to create PVCs dedicated to this service.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- persistentVolumeClaim
- - - EphemeralVolumeSpec - - -
- (Optional) -

EphemeralVolume creates an ephemeral volume type.

-
- ingressBackend
- - - Kubernetes networking/v1.IngressBackend - - -
- (Optional) -

Ingress makes An API object that manages external access to the services in a cluster, typically - HTTP.

-
FieldDescription
+total
+ + +Kubernetes core/v1.ResourceList + + +
+

TotalResources defines the total resources that will be distributed among the cluster’s services.

+
+distribution
+ + +DistributionSpec + + +
+

DistributionSpec defines how the TotalResources will be assigned to resources.

+

Resources

-

- (Appears on:Decorators) -

-

Resources specifies limitations as to how the container will access host resources.

+

Resources specifies limitations as to how the container will access host resources.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- memory
- - string - -
- (Optional) -
- cpu
- - string - -
- (Optional) -
- nic
- - - NIC - - -
- (Optional) -
- disk
- - - Disk - - -
- (Optional) -
FieldDescription
+memory
+ +string + +
+(Optional) +
+cpu
+ +string + +
+(Optional) +
+nic
+ + +NIC + + +
+(Optional) +
+disk
+ + +Disk + + +
+(Optional) +

Scenario

-

Scenario is the Schema for the Scenarios API.

+

Scenario is the Schema for the Scenarios API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - ScenarioSpec - - -
-
-
- - - - - - - - - - - - - -
- testData
- - - TestdataVolume - - -
-

TestData defines a volume that will be mounted across the Scenario’s Services.

-
- actions
- - - []Action - - -
-

Actions are the tasks that will be taken.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
-
- status
- - - ScenarioStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +ScenarioSpec + + +
+
+
+ + + + + + + + + + + + + +
+testData
+ + +TestdataVolume + + +
+

TestData defines a volume that will be mounted across the Scenario’s Services.

+
+actions
+ + +[]Action + + +
+

Actions are the tasks that will be taken.

+
+suspend
+ +bool + +
+(Optional) +

Suspend flag tells the controller to suspend subsequent executions, it does +not apply to already started executions. Defaults to false.

+
+
+status
+ + +ScenarioStatus + + +
+

ScenarioSpec

- (Appears on:Scenario) +(Appears on:Scenario)

-

ScenarioSpec defines the desired state of Scenario.

+

ScenarioSpec defines the desired state of Scenario.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- testData
- - - TestdataVolume - - -
-

TestData defines a volume that will be mounted across the Scenario’s Services.

-
- actions
- - - []Action - - -
-

Actions are the tasks that will be taken.

-
- suspend
- - bool - -
- (Optional) -

Suspend flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. Defaults to false.

-
FieldDescription
+testData
+ + +TestdataVolume + + +
+

TestData defines a volume that will be mounted across the Scenario’s Services.

+
+actions
+ + +[]Action + + +
+

Actions are the tasks that will be taken.

+
+suspend
+ +bool + +
+(Optional) +

Suspend flag tells the controller to suspend subsequent executions, it does +not apply to already started executions. Defaults to false.

+

ScenarioStatus

- (Appears on:Scenario) +(Appears on:Scenario)

-

ScenarioStatus defines the observed state of Scenario.

+

ScenarioStatus defines the observed state of Scenario.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- scheduledJobs
- - []string - -
- (Optional) -

ScheduledJobs is a list of references to the names of executed actions.

-
- grafanaEndpoint
- - string - -
-

GrafanaEndpoint points to the local Grafana instance

-
- prometheusEndpoint
- - string - -
-

PrometheusEndpoint points to the local Prometheus instance

-
- dataviewerEndpoint
- - string - -
-

Dataviewer points to the local Dataviewer instance

-
-

SchedulerSpec -

+ + +Field +Description + + + + + +Lifecycle
+ + +Lifecycle + + + +

- (Appears on:CallSpec, CascadeSpec, ClusterSpec) +(Members of Lifecycle are embedded into this type.)

-
-

SchedulerSpec defines information about schedule of the chaos experiment. - The scheduler will schedule up to spec.GenerateFromTemplate.Instances or spec.GenerateFromTemplate.Until.

-
- - - - - - - - - - - - - - - - - - - - - -
FieldDescription
- cron
- - string - -
- (Optional) -

Cron defines a cron job rule.

-

Some rule examples: - “0 30 * * * *” means to “Every hour on the half hour” - “@hourly” means to “Every hour” - “@every 1h30m” means to “Every hour thirty”

-

More rule info: https://godoc.org/github.com/robfig/cron -

-
- startingDeadlineSeconds
- - int64 - -
- (Optional) -

StartingDeadlineSeconds is an optional deadline in seconds for starting the job if it misses scheduled - time for any reason. if we miss this deadline, we’ll just wait till the next scheduled time

-
- event
- - - ConditionalExpr - - -
- (Optional) -

Event schedules a new every when an event has happened.

-
-

Scheme -

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
FieldDescription
- scenario
- - string - -
-

Scenario returns the name of the scenario that invokes the template.

-
- namespace
- - string - -
-

Returns the namespace where the scenario is running

-
- spec
- - []byte - -
-

Spec is the body whose Inputs.Parameters will be expanded.

-
-
- -
-
- inputs
- - - Inputs - - -
- (Optional) -

Inputs are dynamic fields that populate the spec.

-
+scheduledJobs
+ +[]string + +
+(Optional) +

ScheduledJobs is a list of references to the names of executed actions.

+
+grafanaEndpoint
+ +string + +
+

GrafanaEndpoint points to the local Grafana instance

+
+prometheusEndpoint
+ +string + +
+

PrometheusEndpoint points to the local Prometheus instance

+
+dataviewerEndpoint
+ +string + +
+

Dataviewer points to the local Dataviewer instance

+

Service

-

Service is the Schema for the services API.

+

Service is the Schema for the services API.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - ServiceSpec - - -
-
-
- - - - - - - - - - - - - - - - - -
- decorators
- - - Decorators - - -
- (Optional) -
- requirements
- - - Requirements - - -
- (Optional) -
- callables
- - - map[string]./api/v1alpha1.Callable - - -
- (Optional) -
- PodSpec
- - - Kubernetes core/v1.PodSpec - - -
-

- (Members of PodSpec are embedded into this type.) -

- (Optional) -
-
- status
- - - ServiceStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +ServiceSpec + + +
+
+
+ + + + + + + + + + + + + +
+decorators
+ + +Decorators + + +
+(Optional) +
+callables
+ + +map[string]./api/v1alpha1.Callable + + +
+(Optional) +
+PodSpec
+ + +Kubernetes core/v1.PodSpec + + +
+

+(Members of PodSpec are embedded into this type.) +

+
+
+status
+ + +ServiceStatus + + +
+

ServiceSelector

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- match
- - - MatchBy - - -
- (Optional) -

Match contains the rules to select target

-
- mode
- - - Mode - - -
- (Optional) -

Mode defines which of the selected services to use. If undefined, all() is used - Supported mode: one / all / fixed / fixed-percent / random-max-percent

-
- value
- - string - -
- (Optional) -

Value is required when the mode is set to FixedPodMode / FixedPercentPodMod / - RandomMaxPercentPodMod. - If FixedPodMode, provide an integer of pods to do chaos action. - If FixedPercentPodMod, provide a number from 0-100 to specify the percent of pods the - server can do chaos action. - IF RandomMaxPercentPodMod, provide a number from 0-100 to specify the max percent of pods - to do chaos action

-
- macro
- - string - -
- (Optional) -

Macro abstract selector parameters into a structured string (e.g, .cluster.master.all). Every parsed - field is - represents an inner structure of the selector. - In case of invalid macro, the selector will return empty results. - Macro conflicts with any other parameter.

-
FieldDescription
+match
+ + +MatchBy + + +
+(Optional) +

Match contains the rules to select target

+
+mode
+ + +Mode + + +
+(Optional) +

Mode defines which of the selected services to use. If undefined, all() is used +Supported mode: one / all / fixed / fixed-percent / random-max-percent

+
+value
+ +string + +
+(Optional) +

Value is required when the mode is set to FixedPodMode / FixedPercentPodMod / RandomMaxPercentPodMod. +If FixedPodMode, provide an integer of pods to do chaos action. +If FixedPercentPodMod, provide a number from 0-100 to specify the percent of pods the server can do chaos action. +IF RandomMaxPercentPodMod, provide a number from 0-100 to specify the max percent of pods to do chaos action

+
+macro
+ +string + +
+(Optional) +

Macro abstract selector parameters into a structured string (e.g, .cluster.master.all). Every parsed field is +represents an inner structure of the selector. +In case of invalid macro, the selector will return empty results. +Macro conflicts with any other parameter.

+

ServiceSpec

- (Appears on:ClusterStatus, EmbedSpecs, Service) +(Appears on:ClusterStatus, EmbedSpecs, Service)

-

ServiceSpec defines the desired state of Service.

+

ServiceSpec defines the desired state of Service.

- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- decorators
- - - Decorators - - -
- (Optional) -
- requirements
- - - Requirements - - -
- (Optional) -
- callables
- - - map[string]./api/v1alpha1.Callable - - -
- (Optional) -
- PodSpec
- - - Kubernetes core/v1.PodSpec - - -
-

- (Members of PodSpec are embedded into this type.) -

- (Optional) -
FieldDescription
+decorators
+ + +Decorators + + +
+(Optional) +
+callables
+ + +map[string]./api/v1alpha1.Callable + + +
+(Optional) +
+PodSpec
+ + +Kubernetes core/v1.PodSpec + + +
+

+(Members of PodSpec are embedded into this type.) +

+

ServiceStatus

- (Appears on:Service) +(Appears on:Service)

-

ServiceStatus defines the observed state of Service.

+

ServiceStatus defines the observed state of Service.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- lastScheduleTime
- - - Kubernetes meta/v1.Time - - -
-

LastScheduleTime provide information about the last time a Pod was scheduled.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+lastScheduleTime
+ + +Kubernetes meta/v1.Time + + +
+

LastScheduleTime provide information about the last time a Pod was scheduled.

+

SetField

- (Appears on:Decorators) +(Appears on:Decorators)

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- field
- - string - -
-

Field is the path to the field whose value will be replaced. - Examples: Containers.0.Ports.0

-
- value
- - string - -
-
FieldDescription
+field
+ +string + +
+

Field is the path to the field whose value will be replaced. +Examples: Containers.0.Ports.0

+
+value
+ +string + +
+

StateAggregationFunctions

-

StateAggregationFunctions is a set of aggregation functions for managing the lifecycle of different - resources.

+

StateAggregationFunctions is a set of aggregation functions for managing the lifecycle of different resources.

+

TaskSchedulerSpec +

+

+(Appears on:CallSpec, CascadeSpec, ClusterSpec) +

+
+

TaskSchedulerSpec determines the conditions for creating new tasks of a Job. +The scheduler will schedule up to spec.GenerateObjectFromTemplate.Instances or spec.GenerateObjectFromTemplate.Until.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+sequential
+ +bool + +
+

Sequential schedules a new task once the previous task is complete.

+
+startingDeadlineSeconds
+ +int64 + +
+(Optional) +

StartingDeadlineSeconds is an optional deadline in seconds for starting the job if it misses scheduled +time for any reason. if we miss this deadline, we’ll just wait till the next scheduled time

+
+cron
+ +string + +
+(Optional) +

Cron defines a cron job rule.

+

Some rule examples: +“0 30 * * * *” means to “Every hour on the half hour” +“@hourly” means to “Every hour” +“@every 1h30m” means to “Every hour thirty”

+

More rule info: https://godoc.org/github.com/robfig/cron

+
+timeline
+ + +TimelineDistributionSpec + + +
+(Optional) +

Timeline schedules new tasks deterministically, based on predefined times that honors the underlying distribution. +Multiple tasks may run concurrently.

+
+event
+ + +ConditionalExpr + + +
+(Optional) +

Event schedules new tasks in a non-deterministic manner, based on system-driven events. +Multiple tasks may run concurrently.

+

Template

-

Template is the Schema for the templates API

+

Template is the Schema for the templates API

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - TemplateSpec - - -
-
-
- - - - - - - - - -
- inputs
- - - Inputs - - -
- (Optional) -

Inputs are dynamic fields that populate the spec.

-
- EmbedSpecs
- - - EmbedSpecs - - -
-

- (Members of EmbedSpecs are embedded into this type.) -

-

EmbedSpecs point to the Frisbee specs that can be templated.

-
-
- status
- - - TemplateStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +TemplateSpec + + +
+
+
+ + + + + + + + + +
+inputs
+ + +TemplateInputs + + +
+(Optional) +

Inputs are dynamic fields that populate the spec.

+
+EmbedSpecs
+ + +EmbedSpecs + + +
+

+(Members of EmbedSpecs are embedded into this type.) +

+

EmbedSpecs point to the Frisbee specs that can be templated.

+
+
+status
+ + +TemplateStatus + + +
+
+

TemplateInputs +

+

+(Appears on:TemplateSpec) +

+
+
+ + + + + + + + + + + + + + + + + + + + +
FieldDescription
+parameters
+ + +Parameters + + +
+(Optional) +

Parameters are user-set values that are dynamically evaluated

+
+namespace
+ +string + +
+(Optional) +

Namespace returns the namespace from which the template is called from.

+
+scenario
+ +string + +
+(Optional) +

Scenario returns the scenario from which the template is called from.

+

TemplateSpec

- (Appears on:Template) +(Appears on:Template)

-

TemplateSpec defines the desired state of Template

+

TemplateSpec defines the desired state of Template.

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- inputs
- - - Inputs - - -
- (Optional) -

Inputs are dynamic fields that populate the spec.

-
- EmbedSpecs
- - - EmbedSpecs - - -
-

- (Members of EmbedSpecs are embedded into this type.) -

-

EmbedSpecs point to the Frisbee specs that can be templated.

-
FieldDescription
+inputs
+ + +TemplateInputs + + +
+(Optional) +

Inputs are dynamic fields that populate the spec.

+
+EmbedSpecs
+ + +EmbedSpecs + + +
+

+(Members of EmbedSpecs are embedded into this type.) +

+

EmbedSpecs point to the Frisbee specs that can be templated.

+

TemplateStatus

- (Appears on:Template) +(Appears on:Template)

-

TemplateStatus defines the observed state of Template

+

TemplateStatus defines the observed state of Template.

- - - - - - - - - - - - + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+

TestdataVolume

- (Appears on:ClusterSpec, ScenarioSpec) +(Appears on:ClusterSpec, ScenarioSpec) +

+
+
+ + + + + + + + + + + + + + + + + +
FieldDescription
+volume
+ + +Kubernetes core/v1.PersistentVolumeClaimVolumeSource + + +
+
+globalNamespace
+ +bool + +
+(Optional) +

GlobalNamespace if disabled, all containers see the name root directory. If enabled, each container +sees its own namespace.

+
+

Timeline +([]k8s.io/apimachinery/pkg/apis/meta/v1.Time alias)

+

+(Appears on:CallStatus, CascadeStatus, ClusterStatus) +

+
+
+

TimelineDistributionSpec +

+

+(Appears on:TaskSchedulerSpec)

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- volume
- - - Kubernetes core/v1.PersistentVolumeClaimVolumeSource - - -
-
- globalNamespace
- - bool - -
- (Optional) -

GlobalNamespace if disabled, all containers see the name root directory. If enabled, each container - sees its own namespace.

-
FieldDescription
+total
+ + +Kubernetes meta/v1.Duration + + +
+

TotalDuration defines the total duration within which events will happen.

+
+distribution
+ + +DistributionSpec + + +
+

DistributionSpec defines how the TotalDuration will be divided into time-based events.

+

TolerateSpec

- (Appears on:CallSpec, ClusterSpec) +(Appears on:CallSpec, ClusterSpec)

-

TolerateSpec specifies the system’s ability to continue operating despite failures or malfunctions. - If tolerate is enable, the cluster will remain “alive” even if some services have failed. - Such failures are likely to happen as part of a Chaos experiment.

+

TolerateSpec specifies the system’s ability to continue operating despite failures or malfunctions. +If tolerate is enable, the cluster will remain “alive” even if some services have failed. +Such failures are likely to happen as part of a Chaos experiment.

- - - - - - - - - - - - + + + + + + + + + + + +
FieldDescription
- failedJobs
- - int - -
- (Optional) -

FailedJobs indicate the number of services that may fail before the cluster fails itself.

-
FieldDescription
+failedJobs
+ +int + +
+(Optional) +

FailedJobs indicate the number of services that may fail before the cluster fails itself.

+
+

UserInputs +(map[string]*k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1.JSON alias)

+

+(Appears on:GenerateObjectFromTemplate) +

+
+

VirtualObject

-

VirtualObject is a CRD without a dedicated controller. Practically, it is just an entry in the Kubernetes API - that is used as placeholder for action like Delete and Call.

+

VirtualObject is a CRD without a dedicated controller. Practically, it is just an entry in the Kubernetes API +that is used as placeholder for action like Delete and Call.

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- metadata
- - - Kubernetes meta/v1.ObjectMeta - - -
- Refer to the Kubernetes API documentation for the fields of the - metadata field. -
- spec
- - - VirtualObjectSpec - - -
-
-
- -
-
- status
- - - VirtualObjectStatus - - -
-
FieldDescription
+metadata
+ + +Kubernetes meta/v1.ObjectMeta + + +
+Refer to the Kubernetes API documentation for the fields of the +metadata field. +
+spec
+ + +VirtualObjectSpec + + +
+
+
+ +
+
+status
+ + +VirtualObjectStatus + + +
+

VirtualObjectSpec

- (Appears on:VirtualObject) +(Appears on:VirtualObject)

VirtualObjectStatus

- (Appears on:VirtualObject) +(Appears on:VirtualObject)

- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
FieldDescription
- Lifecycle
- - - Lifecycle - - -
-

- (Members of Lifecycle are embedded into this type.) -

-
- data
- - map[string]string - -
- (Optional) -

Data contains the configuration data. - Each key must consist of alphanumeric characters, ‘-’, ‘_’ or ‘.’. - Values with non-UTF-8 byte sequences must use the BinaryData field. - The keys stored in Data must not overlap with the keys in - the BinaryData field, this is enforced during validation process.

-
FieldDescription
+Lifecycle
+ + +Lifecycle + + +
+

+(Members of Lifecycle are embedded into this type.) +

+
+data
+ +map[string]string + +
+(Optional) +

Data contains the configuration data. +Each key must consist of alphanumeric characters, ‘-’, ‘_’ or ‘.’. +Values with non-UTF-8 byte sequences must use the BinaryData field. +The keys stored in Data must not overlap with the keys in +the BinaryData field, this is enforced during validation process.

+

WaitSpec

- (Appears on:Action) +(Appears on:Action)

- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
FieldDescription
- running
- - []string - -
- (Optional) -

Running waits for the given groups to be running

-
- success
- - []string - -
- (Optional) -

Success waits for the given groups to be succeeded

-
- after
- - - Kubernetes meta/v1.Duration - - -
- (Optional) -

After is the time offset since the beginning of this action.

-
FieldDescription
+running
+ +[]string + +
+(Optional) +

Running waits for the given groups to be running

+
+success
+ +[]string + +
+(Optional) +

Success waits for the given groups to be succeeded

+
+after
+ + +Kubernetes meta/v1.Duration + + +
+(Optional) +

After is the time offset since the beginning of this action.

+

- Generated with gen-crd-api-reference-docs - on git commit 3e6ca05. +Generated with gen-crd-api-reference-docs +on git commit 1b9af175.

diff --git a/embed.go b/embed.go index 057c6969..457e8026 100644 --- a/embed.go +++ b/embed.go @@ -51,9 +51,9 @@ func UpdateLocalFiles(static embed.FS, installationDir string) error { return nil } - /* - Open and inspect embedded file. - */ + /*--------------------------------------------------- + * Open and inspect embedded file. + *---------------------------------------------------*/ f, err := static.Open(path) if err != nil { return errors.Wrapf(err, "cannot open embedded file '%s'", path) @@ -64,9 +64,9 @@ func UpdateLocalFiles(static embed.FS, installationDir string) error { return errors.Wrapf(err, "cannot stat embedded file '%s'", path) } - /* - Duplicate the embedded file into installation dir. - */ + /*--------------------------------------------------- + * Duplicate the embedded file into installation dir. + *---------------------------------------------------*/ switch { case fInfo.Mode().IsRegular(): localInfo, err := os.Stat(path) diff --git a/examples/apps/fedbed/examples/all_combined.yml b/examples/apps/fedbed/examples/all_combined.yml deleted file mode 100644 index 500f133e..00000000 --- a/examples/apps/fedbed/examples/all_combined.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -apiVersion: frisbee.dev/v1alpha1 -kind: Scenario -metadata: - name: all-combined -spec: - actions: - # Step 0: Cache the downloaded dataset to the host (for multi-host setups, the host may change across executions) - - action: Service - name: cifar10-download - service: - templateRef: fl.datasets.cifar10.download - inputs: - - { cache: "/tmp/dataset" } - - # Step 1: Create FedBed server - - action: Service - name: server - service: - templateRef: frisbee.apps.fedbed.server - inputs: - - { min_fit_clients: 3 } - - # Step 2: Create FedBed clients - - action: Cluster - name: clients - depends: { running: [ server ], success: [ cifar10-download ] } - cluster: - templateRef: frisbee.apps.fedbed.client-shared-dataset - inputs: - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 0 } - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 0 } - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 0 } - resources: - total: { memory: 500Mi } - distribution: { name: uniform } - - # Teardown - - action: Delete - name: teardown - depends: { success: [ clients ] } - delete: - jobs: [server ] diff --git a/examples/apps/fedbed/examples/cached-dataset.yml b/examples/apps/fedbed/examples/cached-dataset.yml deleted file mode 100644 index 38cb0a5a..00000000 --- a/examples/apps/fedbed/examples/cached-dataset.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -apiVersion: frisbee.dev/v1alpha1 -kind: Scenario -metadata: - name: cached-dataset -spec: - actions: - # Step 0: Cache the downloaded dataset to the host (for multi-host setups, the host may change across executions) - - action: Service - name: cifar10-download - service: - templateRef: fl.datasets.cifar10.download - inputs: - - { cache: "/tmp/dataset" } - - # Step 1: Create FedBed server - - action: Service - name: server - service: - templateRef: frisbee.apps.fedbed.server - inputs: - - { min_fit_clients: 3 } - - # Step 2: Create FedBed clients - - action: Cluster - name: clients - depends: { running: [ server ], success: [ cifar10-download ] } - cluster: - templateRef: frisbee.apps.fedbed.client-shared-dataset - inputs: - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 0 } - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 1 } - - { fl_server: server, dataset: fl.datasets.cifar10, backend: "pytorch", total_nodes: 3, node_id: 2 } - - # Teardown - - action: Delete - name: teardown - depends: { success: [ clients ] } - delete: - jobs: [server ] diff --git a/examples/apps/fedbed/templates/client-with-annotations.yaml b/examples/apps/fedbed/templates/client-with-annotations.yaml deleted file mode 100644 index a8e440c3..00000000 --- a/examples/apps/fedbed/templates/client-with-annotations.yaml +++ /dev/null @@ -1,98 +0,0 @@ ---- -apiVersion: frisbee.dev/v1alpha1 -kind: Template -metadata: - name: frisbee.apps.fedbed.client-annotation -spec: - inputs: - parameters: - fl_server: "server" - backend: "pytorch" - total_nodes: 1 - node_id: 0 - - dataset: "MNIST" - dataset_distribution: flat - - training_setsize: 60000 - test_setsize: 10000 - service: -# decorators: - # telemetry: - # - frisbee.system.telemetry.resources - - volumes: - - name: varlog - emptyDir: {} - - containers: - - name: main - image: icsforth/fedbed:latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: varlog - mountPath: /var/log - env: - - name: FL_SERVER - value: {{"{{.inputs.parameters.fl_server}}" | quote }} - - name: FL_BACKEND - value: {{"{{.inputs.parameters.backend}}" | quote }} - - name: FL_NUM_OF_THREADS - value: "1" - - - name: FL_DATASET - value: {{"{{.inputs.parameters.dataset}}" | quote }} - - name: FL_DATASET_RANDOM - value: "False" - - name: FL_DATASET_DISTRIBUTION - value: {{"{{.inputs.parameters.dataset_distribution}}" | quote }} - - name: FL_DATASET_DISTRIBUTION_PARAMETERS - value: '{"random_state":1}' - - # Are these values really needed here? - - name: FL_NODES - value: {{"{{.inputs.parameters.total_nodes}}" | quote}} - - name: FL_NODE_ID - value: {{"{{.inputs.parameters.node_id}}" | quote}} - - - name: FL_TRAINING_SET_SIZE - value: {{"{{.inputs.parameters.training_setsize}}" | quote}} - - name: FL_TEST_SET_SIZE - value: {{"{{.inputs.parameters.test_setsize}}" | quote}} - - command: - - /bin/bash # Run shell - - -c # Read from string - - | # Multi-line str - set -eu - cut -d ' ' -f 4 /proc/self/stat > /dev/shm/app # Sidecar: use it for entering the cgroup - - python client.py |& tee -a /var/log/client.log - - - name: annotator # push events to grafana - image: alpine/curl:latest - volumeMounts: - - name: varlog - mountPath: /var/log - command: - - /bin/sh # Run shell - - -c # Read from string - - | # Multi-line str - set -eux - - export logfile=/var/log/client.log - export GRAFANA=http://${GRAFANA_SERVICE_HOST}:${GRAFANA_SERVICE_PORT} - - # Wait a bit for the log file to become ready - sleep 10 - - echo "Tail tailing the log ${logfile} for events" - - tail -f ${logfile} | grep "ChannelConnectivity" | while read line ; do - echo -e "new event: $line" - annotation=\'{\"tags\":[\"app\"],\"text\":\"$line\"}\' - - curl -s -H "Content-Type: application/json" -X POST -d ${annotation} ${GRAFANA}/api/annotations - - echo -e "\n--" - done diff --git a/examples/apps/fedbed/templates/client-with-shared-dataset.yaml b/examples/apps/fedbed/templates/client-with-shared-dataset.yaml deleted file mode 100644 index c99176a6..00000000 --- a/examples/apps/fedbed/templates/client-with-shared-dataset.yaml +++ /dev/null @@ -1,61 +0,0 @@ ---- -apiVersion: frisbee.dev/v1alpha1 -kind: Template -metadata: - name: frisbee.apps.fedbed.client-shared-dataset -spec: - inputs: - parameters: - fl_server: "server" - backend: "pytorch" - dataset: "fl.dataset.cifar10" - dataset_distribution: flat - total_nodes: 10 - node_id: 0 - service: - decorators: - telemetry: - - frisbee.system.telemetry.resources - - volumes: - - name: dataset - persistentVolumeClaim: - claimName: {{"{{.inputs.parameters.dataset}}" | quote}} - - containers: - - name: main - image: icsforth/fedbed:latest - volumeMounts: - - name: dataset - mountPath: /data/{{"{{.inputs.parameters.backend}}"}}/cifar10 - env: - - name: FL_SERVER - value: {{"{{.inputs.parameters.fl_server}}" | quote }} - - name: FL_BACKEND - value: {{"{{.inputs.parameters.backend}}" | quote }} - - name: FL_NUM_OF_THREADS - value: "1" - - # Are these values really needed here? - - name: FL_NODES - value: {{"{{.inputs.parameters.total_nodes}}" | quote}} - - name: FL_NODE_ID - value: {{"{{.inputs.parameters.node_id}}" | quote}} - - name: FL_DATASET_DISTRIBUTION - value: {{"{{.inputs.parameters.dataset_distribution}}" | quote }} - - name: FL_DATASET_DISTRIBUTION_PARAMETERS - value: "{}" - - name: FL_DATASET_RANDOM - value: "false" - - command: - - /bin/sh # Run shell - - -c # Read from string - - | # Multi-line str - set -eux - cut -d ' ' -f 4 /proc/self/stat > /dev/shm/app # Sidecar: use it for entering the cgroup - - # do it like that until I find a better way to go from fl.dataset.cifar10 to cifar10. - FL_DATASET=$(basename {{"{{.inputs.parameters.dataset}}"}}) - - python client.py \ No newline at end of file diff --git a/examples/apps/fedbed/templates/client.yaml b/examples/apps/fedbed/templates/client.yaml index 97b6fd2d..f7240cb2 100644 --- a/examples/apps/fedbed/templates/client.yaml +++ b/examples/apps/fedbed/templates/client.yaml @@ -7,11 +7,11 @@ spec: inputs: parameters: fl_server: "server" # also server1 server2 - backend: "pytorch" + backend: "pytorch" # "pytorch_mobilenetv2", "tensorflow" total_nodes: 1 node_id: 0 - dataset: "MNIST" + dataset: "MNIST" # "CIFAR10" dataset_distribution: flat training_setsize: 60000 @@ -23,8 +23,7 @@ spec: containers: - name: main - image: icsforth/fedbed:latest - imagePullPolicy: IfNotPresent + image: {{.Values.client.image}} env: - name: FL_BACKEND value: {{"{{.inputs.parameters.backend}}" | quote }} diff --git a/examples/apps/fedbed/templates/server.yaml b/examples/apps/fedbed/templates/server.yaml index af525ac9..d864f46d 100644 --- a/examples/apps/fedbed/templates/server.yaml +++ b/examples/apps/fedbed/templates/server.yaml @@ -12,8 +12,8 @@ spec: # should be used with FL_EVAL_DATASET dataset_eval: "true" - dataset: "MNIST" - backend: "pytorch" + dataset: "MNIST" # "CIFAR10" + backend: "pytorch" # "pytorch_mobilenetv2", "tensorflow" service: decorators: telemetry: @@ -28,8 +28,7 @@ spec: # Run the FL-server # - name: main - image: icsforth/fedbed:latest - imagePullPolicy: IfNotPresent + image: {{.Values.server.image}} env: - name: FL_STRATEGY value: FedAvg diff --git a/examples/apps/fedbed/values.yaml b/examples/apps/fedbed/values.yaml index e69de29b..d2a0883a 100644 --- a/examples/apps/fedbed/values.yaml +++ b/examples/apps/fedbed/values.yaml @@ -0,0 +1,10 @@ +## @section Fedbed Configuration parameters + +## @param server.image Fedbed server's image version. +server: + image: fogemulator/testfedbed:latest # alt: icsforth/fedbed:latest + + +## @param client.image Fedbed client's image version. +client: + image: fogemulator/testfedbed:latest # alt: icsforth/fedbed:latest \ No newline at end of file diff --git a/examples/patterns/federated-learning/ml-backend/install.sh b/examples/patterns/federated-learning/ml-backend/install.sh index f8132635..b319f3e1 100755 --- a/examples/patterns/federated-learning/ml-backend/install.sh +++ b/examples/patterns/federated-learning/ml-backend/install.sh @@ -22,4 +22,4 @@ kubectl-frisbee submit test "${NAMESPACE}" "${SCENARIO}" "${DEPENDENCIES[@]}" -- sleep 10 # Report the scenario -kubectl-frisbee report test "${NAMESPACE}" "${REPORTS}" --pdf --data --aggregated-pdf --wait +kubectl-frisbee report test "${NAMESPACE}" "${REPORTS}" --pdf --data --aggregated-pdf --wait \ No newline at end of file diff --git a/examples/patterns/federated-learning/ml-backend/manifest.yml b/examples/patterns/federated-learning/ml-backend/manifest.yml index e22a4d20..f649451e 100644 --- a/examples/patterns/federated-learning/ml-backend/manifest.yml +++ b/examples/patterns/federated-learning/ml-backend/manifest.yml @@ -13,7 +13,7 @@ spec: service: templateRef: frisbee.apps.fedbed.server inputs: - - { dataset: "MNIST", backend: "tensorflow" } # Change values here + - { dataset: "MNIST", backend: "pytorch", dataset_eval: "false" } # Change values here # Step 2: Create FedBed clients - action: Cluster @@ -22,7 +22,7 @@ spec: cluster: templateRef: frisbee.apps.fedbed.client inputs: - - { fl_server: server, dataset: "MNIST", backend: "tensorflow" } # Change values here + - { fl_server: server, dataset: "MNIST", backend: "pytorch" } # Change values here # Teardown - action: Delete diff --git a/go.sum b/go.sum deleted file mode 100644 index 41035dde..00000000 --- a/go.sum +++ /dev/null @@ -1,475 +0,0 @@ -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/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= -github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -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/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/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/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/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs= -github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -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/chromedp/cdproto v0.0.0-20210526005521-9e51b9051fd0/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= -github.com/chromedp/cdproto v0.0.0-20210706234513-2bc298e8be7f h1:lg5k1KAxmknil6Z19LaaeiEs5Pje7hPzRfyWSSnWLP0= -github.com/chromedp/cdproto v0.0.0-20210706234513-2bc298e8be7f/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= -github.com/chromedp/chromedp v0.7.3 h1:FvgJICfjvXtDX+miuMUY0NHuY8zQvjS/TcEQEG6Ldzs= -github.com/chromedp/chromedp v0.7.3/go.mod h1:9gC521Yzgrk078Ulv6KIgG7hJ2x9aWrxMBBobTFk30A= -github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= -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/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 h1:tjT4Jp4gxECvsJcYpAMtW2I3YqzBTPuB67OejxXs86s= -github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= -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/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= -github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= -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/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/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/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/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/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA= -github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.1.0-rc.5 h1:QOAag7FoBaBYYHRqzqkhhd8fq5RTubvI4v3Ft/gDVVQ= -github.com/gobwas/ws v1.1.0-rc.5/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= -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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -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.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/golanghelper/grafana-webhook v0.0.0-20180512191629-e0da26114467 h1:DnF9W578LCjX1kkx1hXBL8JxXezy072pI+KnpHW8IeI= -github.com/golanghelper/grafana-webhook v0.0.0-20180512191629-e0da26114467/go.mod h1:onNhXydWQdZbHwKW/oonFMB7SiywIwTbBxbVZeGjK8o= -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/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/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-20230426061923-93006964c1fc h1:AGDHt781oIcL4EFk7cPnvBUYTwU8BEU6GDTO3ZMn1sE= -github.com/google/pprof v0.0.0-20230426061923-93006964c1fc/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -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/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI= -github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosimple/slug v1.1.1/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0= -github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= -github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= -github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= -github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= -github.com/grafana-tools/sdk v0.0.0-20220919052116-6562121319fc h1:PXZQA2WCxe85Tnn+WEvr8fDpfwibmEPgfgFEaC87G24= -github.com/grafana-tools/sdk v0.0.0-20220919052116-6562121319fc/go.mod h1:AHHlOEv1+GGQ3ktHMlhuTUwo3zljV3QJbC0+8o2kn+4= -github.com/grafana/grafana-api-golang-client v0.21.1 h1:39Nqvk5qPBpdrA+uF8sThIGCD9DDbYsJLbOo2WN0g5U= -github.com/grafana/grafana-api-golang-client v0.21.1/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -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/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.11/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/imroc/req/v3 v3.35.0 h1:JDtg+sFB0HVc4S3TcAsm7Mf7rsiwf4f/edAlYDAGg8Q= -github.com/imroc/req/v3 v3.35.0/go.mod h1:zWuou7ZZtPLp/gmMj58jARgZuhKlEdb2gLxDeNfWpCA= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jaytaylor/go-find v0.0.0-20230430153105-548b1a88d19c h1:oLDOlDlJDBdu8u+SIkV7LX/LLxi53WF7lrYwEFMz7vs= -github.com/jaytaylor/go-find v0.0.0-20230430153105-548b1a88d19c/go.mod h1:ElSW1BUW7B3IAYRO1wj5EyJMMwZA82TEFdVJiIbUkXo= -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/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/kubeshop/testkube v1.11.22 h1:s/NO53UHCFtA6tOm/uvcL4kZowe04HenU79j7mBGPmM= -github.com/kubeshop/testkube v1.11.22/go.mod h1:l0bUlm4JctrmEdV9u4V8LxkzjJvfQYA0NINcaSaCMhY= -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.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -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/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -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/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= -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.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/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.34.0 h1:OvOJ9LFjTySgwOTYUZmNoq0FzVicP8YujpV0kB7m2lU= -github.com/quic-go/quic-go v0.34.0/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= -github.com/r3labs/diff/v3 v3.0.1 h1:CBKqf3XmNRHXKmdU7mZP1w7TV0pDyVCis1AUHtA4Xtg= -github.com/r3labs/diff/v3 v3.0.1/go.mod h1:f1S9bourRbiM66NskseyUdo0fTmEE0qKrikYJX63dgo= -github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -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/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -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= -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.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -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/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -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/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.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/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -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.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 h1:5llv2sWeaMSnA3w2kS57ouQQ4pudlXrR0dCgw51QK9o= -golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -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/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.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.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.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -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.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -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/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-20190222072716-a9d3bda3a223/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-20191008105621-543471e840be/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-20201207223542-d4d67f95c62d/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-20210525143221-35b2ab0089ea/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-20210630005230-0f9fa26af87c/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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.1/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.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -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= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= -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= -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= -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/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/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.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= -k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= -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.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= -k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.2 h1:vDLSeuYvCHKeoQRhCXjxXO45nHVv2Ip4Fe0MfioMrhE= -k8s.io/client-go v0.27.2/go.mod h1:tY0gVmUsHrAmjzHX9zs7eCjxcBsf8IiNe7KQ52biTcQ= -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.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-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= -k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU= -sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= -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= diff --git a/hack/pdf-exporter/long-dashboards.js b/hack/pdf-exporter/long-dashboards.js index 99178bea..48d58e21 100644 --- a/hack/pdf-exporter/long-dashboards.js +++ b/hack/pdf-exporter/long-dashboards.js @@ -43,7 +43,7 @@ const auth_header = 'Basic ' + new Buffer.from(auth_string).toString('base64'); // the same value as in page.pdf() below. The height is not important await page.setViewport({ width: width_px, - height: 6000, + height: 8000, deviceScaleFactor: scaleFactor, isMobile: false })