From f0a22dd2229e1ef5af0ce4c40b3a9585aadb00bf Mon Sep 17 00:00:00 2001 From: cannarelladev Date: Tue, 24 Oct 2023 09:26:02 +0200 Subject: [PATCH] Renaming example, improving testbed documentation --- .markdownlintignore | 3 +- apis/nodecore/v1alpha1/flavour_types.go | 9 ++ .../v1alpha1/zz_generated.deepcopy.go | 8 -- apis/reservation/v1alpha1/contract_types.go | 9 ++ .../reservation/v1alpha1/reservation_types.go | 7 +- .../reservation/v1alpha1/transaction_types.go | 7 + .../v1alpha1/zz_generated.deepcopy.go | 16 --- .../crds/nodecore.fluidos.eu_flavours.yaml | 34 ++++- .../reservation.fluidos.eu_contracts.yaml | 35 ++++- .../reservation.fluidos.eu_reservations.yaml | 12 +- .../reservation.fluidos.eu_transactions.yaml | 26 +++- examples/kind/README.md | 92 ------------- pkg/utils/resourceforge/forge.go | 23 ++-- testbed/kind/README.md | 121 ++++++++++++++++++ .../kind/consumer/cluster-multi-worker.yaml | 0 .../kind/consumer/values.yaml | 0 .../kind/metrics-server.yaml | 0 .../kind/provider/cluster-multi-worker.yaml | 0 .../kind/provider/values.yaml | 0 {examples => testbed}/kind/setup.sh | 0 20 files changed, 258 insertions(+), 144 deletions(-) delete mode 100644 examples/kind/README.md create mode 100644 testbed/kind/README.md rename {examples => testbed}/kind/consumer/cluster-multi-worker.yaml (100%) rename {examples => testbed}/kind/consumer/values.yaml (100%) rename {examples => testbed}/kind/metrics-server.yaml (100%) rename {examples => testbed}/kind/provider/cluster-multi-worker.yaml (100%) rename {examples => testbed}/kind/provider/values.yaml (100%) rename {examples => testbed}/kind/setup.sh (100%) diff --git a/.markdownlintignore b/.markdownlintignore index e9a3bdc..9ef8faf 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,2 +1,3 @@ deployments -docs/_legacy \ No newline at end of file +docs/_legacy +testbed \ No newline at end of file diff --git a/apis/nodecore/v1alpha1/flavour_types.go b/apis/nodecore/v1alpha1/flavour_types.go index 6212af1..9cb70d3 100644 --- a/apis/nodecore/v1alpha1/flavour_types.go +++ b/apis/nodecore/v1alpha1/flavour_types.go @@ -146,6 +146,15 @@ type FlavourStatus struct { //+kubebuilder:object:root=true //+kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Provider ID",type=string,JSONPath=`.spec.providerID` +// +kubebuilder:printcolumn:name="Type",type=string,JSONPath=`.spec.type` +// +kubebuilder:printcolumn:name="CPU",type=string,priority=1,JSONPath=`.spec.characteristics.cpu` +// +kubebuilder:printcolumn:name="Memory",type=string,priority=1,JSONPath=`.spec.characteristics.memory` +// +kubebuilder:printcolumn:name="Owner Name",type=string,priority=1,JSONPath=`.spec.owner.nodeID` +// +kubebuilder:printcolumn:name="Owner Domain",type=string,priority=1,JSONPath=`.spec.owner.domain` +// +kubebuilder:printcolumn:name="Available",type=boolean,JSONPath=`.spec.optionalFields.availability` +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + // Flavour is the Schema for the flavours API type Flavour struct { metav1.TypeMeta `json:",inline"` diff --git a/apis/nodecore/v1alpha1/zz_generated.deepcopy.go b/apis/nodecore/v1alpha1/zz_generated.deepcopy.go index 4f86197..1651f69 100644 --- a/apis/nodecore/v1alpha1/zz_generated.deepcopy.go +++ b/apis/nodecore/v1alpha1/zz_generated.deepcopy.go @@ -169,14 +169,6 @@ func (in *Flavour) DeepCopy() *Flavour { return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Flavour) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlavourList) DeepCopyInto(out *FlavourList) { *out = *in diff --git a/apis/reservation/v1alpha1/contract_types.go b/apis/reservation/v1alpha1/contract_types.go index cab5cd8..fbea2fe 100644 --- a/apis/reservation/v1alpha1/contract_types.go +++ b/apis/reservation/v1alpha1/contract_types.go @@ -72,6 +72,15 @@ type ContractStatus struct { //+kubebuilder:object:root=true //+kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Flavour ID",type=string,JSONPath=`.spec.flavour.metadata.name` +// +kubebuilder:printcolumn:name="Buyer Name",type=string,JSONPath=`.spec.buyer.nodeID` +// +kubebuilder:printcolumn:name="Buyer Domain",type=string,priority=1,JSONPath=`.spec.buyer.domain` +// +kubebuilder:printcolumn:name="Seller Name",type=string,JSONPath=`.spec.seller.nodeID` +// +kubebuilder:printcolumn:name="Seller Domain",type=string,priority=1,JSONPath=`.spec.seller.domain` +// +kubebuilder:printcolumn:name="Transaction ID",type=string,priority=1,JSONPath=`.spec.transactionID` +// +kubebuilder:printcolumn:name="Buyer Liqo ID",type=string,priority=1,JSONPath=`.spec.buyerClusterID` +// +kubebuilder:printcolumn:name="Expiration Time",type=string,priority=1,JSONPath=`.spec.expirationTime` + // Contract is the Schema for the contracts API type Contract struct { metav1.TypeMeta `json:",inline"` diff --git a/apis/reservation/v1alpha1/reservation_types.go b/apis/reservation/v1alpha1/reservation_types.go index 9d11237..8e67dad 100644 --- a/apis/reservation/v1alpha1/reservation_types.go +++ b/apis/reservation/v1alpha1/reservation_types.go @@ -79,11 +79,12 @@ type ReservationStatus struct { // +kubebuilder:printcolumn:name="Solver ID",type=string,JSONPath=`.spec.solverID` // +kubebuilder:printcolumn:name="Reserve",type=boolean,JSONPath=`.spec.reserve` // +kubebuilder:printcolumn:name="Purchase",type=boolean,JSONPath=`.spec.purchase` -// +kubebuilder:printcolumn:name="Seller",type=string,JSONPath=`.spec.seller.name` +// +kubebuilder:printcolumn:name="Seller Name",type=string,JSONPath=`.spec.seller.nodeID` +// +kubebuilder:printcolumn:name="Seller Domain",type=string,priority=1,JSONPath=`.spec.buyer.domain` // +kubebuilder:printcolumn:name="Peering Candidate",type=string,priority=1,JSONPath=`.spec.peeringCandidate.name` // +kubebuilder:printcolumn:name="Transaction ID",type=string,JSONPath=`.status.transactionID` -// +kubebuilder:printcolumn:name="Reserve Phase",type=string,priority=1,JSONPath=`.status.reservePhase.phase` -// +kubebuilder:printcolumn:name="Purchase Phase",type=string,priority=1,JSONPath=`.status.purchasePhase.phase` +// +kubebuilder:printcolumn:name="Reserve Phase",type=string,priority=1,JSONPath=`.status.reservePhase` +// +kubebuilder:printcolumn:name="Purchase Phase",type=string,priority=1,JSONPath=`.status.purchasePhase` // +kubebuilder:printcolumn:name="Contract Name",type=string,JSONPath=`.status.contract.name` // +kubebuilder:printcolumn:name="Status",type=string,JSONPath=`.status.phase.phase` // +kubebuilder:printcolumn:name="Message",type=string,priority=1,JSONPath=`.status.phase.message` diff --git a/apis/reservation/v1alpha1/transaction_types.go b/apis/reservation/v1alpha1/transaction_types.go index 3b65bc6..0338cde 100644 --- a/apis/reservation/v1alpha1/transaction_types.go +++ b/apis/reservation/v1alpha1/transaction_types.go @@ -47,6 +47,13 @@ type TransactionStatus struct { //+kubebuilder:object:root=true //+kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Flavour ID",type="string",JSONPath=".spec.flavourID" +// +kubebuilder:printcolumn:name="Buyer Name",type="string",JSONPath=".spec.buyer.nodeID" +// +kubebuilder:printcolumn:name="Buyer IP",type="string",priority=1,JSONPath=".spec.buyer.ip" +// +kubebuilder:printcolumn:name="Buyer Domain",type="string",priority=1,JSONPath=".spec.buyer.domain" +// +kubebuilder:printcolumn:name="Cluster ID",type="string",JSONPath=".spec.clusterID" +// +kubebuilder:printcolumn:name="Start Time",type="string",JSONPath=".spec.startTime" + // Transaction is the Schema for the transactions API type Transaction struct { metav1.TypeMeta `json:",inline"` diff --git a/apis/reservation/v1alpha1/zz_generated.deepcopy.go b/apis/reservation/v1alpha1/zz_generated.deepcopy.go index bbcfeef..b039010 100644 --- a/apis/reservation/v1alpha1/zz_generated.deepcopy.go +++ b/apis/reservation/v1alpha1/zz_generated.deepcopy.go @@ -41,14 +41,6 @@ func (in *Contract) DeepCopy() *Contract { return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Contract) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContractList) DeepCopyInto(out *ContractList) { *out = *in @@ -281,14 +273,6 @@ func (in *Transaction) DeepCopy() *Transaction { return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Transaction) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TransactionList) DeepCopyInto(out *TransactionList) { *out = *in diff --git a/deployments/node/crds/nodecore.fluidos.eu_flavours.yaml b/deployments/node/crds/nodecore.fluidos.eu_flavours.yaml index 43d2954..f49c8ec 100644 --- a/deployments/node/crds/nodecore.fluidos.eu_flavours.yaml +++ b/deployments/node/crds/nodecore.fluidos.eu_flavours.yaml @@ -14,7 +14,36 @@ spec: singular: flavour scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .spec.providerID + name: Provider ID + type: string + - jsonPath: .spec.type + name: Type + type: string + - jsonPath: .spec.characteristics.cpu + name: CPU + priority: 1 + type: string + - jsonPath: .spec.characteristics.memory + name: Memory + priority: 1 + type: string + - jsonPath: .spec.owner.nodeID + name: Owner Name + priority: 1 + type: string + - jsonPath: .spec.owner.domain + name: Owner Domain + priority: 1 + type: string + - jsonPath: .spec.optionalFields.availability + name: Available + type: boolean + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: Flavour is the Schema for the flavours API @@ -236,5 +265,4 @@ spec: type: object served: true storage: true - subresources: - status: {} + subresources: {} diff --git a/deployments/node/crds/reservation.fluidos.eu_contracts.yaml b/deployments/node/crds/reservation.fluidos.eu_contracts.yaml index 593493f..42e796c 100644 --- a/deployments/node/crds/reservation.fluidos.eu_contracts.yaml +++ b/deployments/node/crds/reservation.fluidos.eu_contracts.yaml @@ -14,7 +14,37 @@ spec: singular: contract scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .spec.flavour.metadata.name + name: Flavour ID + type: string + - jsonPath: .spec.buyer.nodeID + name: Buyer Name + type: string + - jsonPath: .spec.buyer.domain + name: Buyer Domain + priority: 1 + type: string + - jsonPath: .spec.seller.nodeID + name: Seller Name + type: string + - jsonPath: .spec.seller.domain + name: Seller Domain + priority: 1 + type: string + - jsonPath: .spec.transactionID + name: Transaction ID + priority: 1 + type: string + - jsonPath: .spec.buyerClusterID + name: Buyer Liqo ID + priority: 1 + type: string + - jsonPath: .spec.expirationTime + name: Expiration Time + priority: 1 + type: string + name: v1alpha1 schema: openAPIV3Schema: description: Contract is the Schema for the contracts API @@ -418,5 +448,4 @@ spec: type: object served: true storage: true - subresources: - status: {} + subresources: {} diff --git a/deployments/node/crds/reservation.fluidos.eu_reservations.yaml b/deployments/node/crds/reservation.fluidos.eu_reservations.yaml index 0e84480..e026631 100644 --- a/deployments/node/crds/reservation.fluidos.eu_reservations.yaml +++ b/deployments/node/crds/reservation.fluidos.eu_reservations.yaml @@ -24,8 +24,12 @@ spec: - jsonPath: .spec.purchase name: Purchase type: boolean - - jsonPath: .spec.seller.name - name: Seller + - jsonPath: .spec.seller.nodeID + name: Seller Name + type: string + - jsonPath: .spec.buyer.domain + name: Seller Domain + priority: 1 type: string - jsonPath: .spec.peeringCandidate.name name: Peering Candidate @@ -34,11 +38,11 @@ spec: - jsonPath: .status.transactionID name: Transaction ID type: string - - jsonPath: .status.reservePhase.phase + - jsonPath: .status.reservePhase name: Reserve Phase priority: 1 type: string - - jsonPath: .status.purchasePhase.phase + - jsonPath: .status.purchasePhase name: Purchase Phase priority: 1 type: string diff --git a/deployments/node/crds/reservation.fluidos.eu_transactions.yaml b/deployments/node/crds/reservation.fluidos.eu_transactions.yaml index ec04673..4fe1b38 100644 --- a/deployments/node/crds/reservation.fluidos.eu_transactions.yaml +++ b/deployments/node/crds/reservation.fluidos.eu_transactions.yaml @@ -14,7 +14,28 @@ spec: singular: transaction scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .spec.flavourID + name: Flavour ID + type: string + - jsonPath: .spec.buyer.nodeID + name: Buyer Name + type: string + - jsonPath: .spec.buyer.ip + name: Buyer IP + priority: 1 + type: string + - jsonPath: .spec.buyer.domain + name: Buyer Domain + priority: 1 + type: string + - jsonPath: .spec.clusterID + name: Cluster ID + type: string + - jsonPath: .spec.startTime + name: Start Time + type: string + name: v1alpha1 schema: openAPIV3Schema: description: Transaction is the Schema for the transactions API @@ -131,5 +152,4 @@ spec: type: object served: true storage: true - subresources: - status: {} + subresources: {} diff --git a/examples/kind/README.md b/examples/kind/README.md deleted file mode 100644 index 7e3937f..0000000 --- a/examples/kind/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# - -

- -

FLUIDOS Node - KIND Installation

-

- -## Getting Started - -This guide will help you to install a FLUIDOS Node on a Kubernetes cluster using KIND (Kubernetes in Docker). This is the easiest way to install FLUIDOS Node on a local machine. - -This guide has been made only for testing purposes. If you want to install FLUIDOS Node on a production environment, please follow the [official installation guide](/docs/installation/installation.md) - -## What will be installed - -This guide will create two different Kubernetes clusters: - -* **fluidos-consumer**: This cluster will act as a consumer of the FLUIDOS Node. It will be used to deploy a `solver` example CR which will simulate an Intent resolution request. Through the REAR Protocol it will be able to communicate with the Provider cluster and to receive matching Flavours, reserving the one that best fits the request and purchasing it. - -* **fluidos-provider**: This cluster will act as a provider of the FLUIDOS Node. It will offer its own Flavours on the specific request made by the consumer, reserving and selling it. - -### Prerequisites - -* [Docker](https://docs.docker.com/get-docker/) -* [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -* [KIND](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) -* [Helm](https://helm.sh/docs/intro/install/) - -### Installation - -* Clone the repository - -```sh -git clone https://github.com/fluidos-project/node.git -``` - -* Move into the KIND Example folder - -```sh -cd examples/kind -``` - -* Launch the `setup.sh` script - -```sh -. ./setup.sh -``` - -* Wait for the script to finish. It will take some minutes. - -* When the script has finished, you can check the status of the pods with the following command: - -```sh -kubectl get pods -n fluidos -``` - -* You should see 3 pods running on the `fluidos-consumer` cluster and 3 pods running on the `fluidos-provider` cluster: - -* `node-local-reaource-manager-` -* `node-rear-manager-` -* `node-rear-controller-` - -### Usage - -Now lets try to deploy a `solver` example CR on the `fluidos-consumer` cluster. - -* Open a new terminal on the repo and move into the `deployments/samples` folder - -```sh -cd deployments/samples -``` - -* Set the `KUBECONFIG` environment variable to the `fluidos-consumer` cluster - -```sh -export KUBECONFIG=../../examples/kind/consumer/config -``` - -* Deploy the `solver` CR - -```sh -kubectl apply -f solver.yaml -``` - -* Check the result of the deployment - -```sh -kubectl get solver -n fluidos -``` - -* The output should be something like -`` diff --git a/pkg/utils/resourceforge/forge.go b/pkg/utils/resourceforge/forge.go index f76bbef..e391fb0 100644 --- a/pkg/utils/resourceforge/forge.go +++ b/pkg/utils/resourceforge/forge.go @@ -135,7 +135,8 @@ func ForgeContract(flavour nodecorev1alpha1.Flavour, transaction models.Transact } return nil }(), - ExpirationTime: time.Now().Add(flags.EXPIRATION_CONTRACT).Format(time.RFC3339), + ExpirationTime: time.Now().Add(flags.EXPIRATION_CONTRACT).Format(time.RFC3339), + ExtraInformation: nil, }, Status: reservationv1alpha1.ContractStatus{ Phase: nodecorev1alpha1.PhaseStatus{ @@ -298,24 +299,24 @@ func ForgeContractFromObj(contract models.Contract) *reservationv1alpha1.Contrac } // ForgeTransactionFromObj creates a transaction from a Transaction object -func ForgeTransactionFromObj(reservation *models.Transaction) *reservationv1alpha1.Transaction { +func ForgeTransactionFromObj(transaction *models.Transaction) *reservationv1alpha1.Transaction { return &reservationv1alpha1.Transaction{ ObjectMeta: metav1.ObjectMeta{ - Name: reservation.TransactionID, + Name: transaction.TransactionID, Namespace: flags.FLUIDOS_NAMESPACE, }, Spec: reservationv1alpha1.TransactionSpec{ - FlavourID: reservation.FlavourID, - StartTime: reservation.StartTime, + FlavourID: transaction.FlavourID, + StartTime: transaction.StartTime, Buyer: nodecorev1alpha1.NodeIdentity{ - Domain: reservation.Buyer.Domain, - IP: reservation.Buyer.IP, - NodeID: reservation.Buyer.NodeID, + Domain: transaction.Buyer.Domain, + IP: transaction.Buyer.IP, + NodeID: transaction.Buyer.NodeID, }, - ClusterID: reservation.ClusterID, + ClusterID: transaction.ClusterID, Partition: func() *reservationv1alpha1.Partition { - if reservation.Partition != nil { - return parseutil.ParsePartitionFromObj(reservation.Partition) + if transaction.Partition != nil { + return parseutil.ParsePartitionFromObj(transaction.Partition) } return nil }(), diff --git a/testbed/kind/README.md b/testbed/kind/README.md new file mode 100644 index 0000000..ad44a29 --- /dev/null +++ b/testbed/kind/README.md @@ -0,0 +1,121 @@ +# + +

+ +

FLUIDOS Node - Testbed (KIND)

+

+ +## Getting Started + +This guide will help you to install a FLUIDOS Node **Testbed** using KIND (Kubernetes in Docker). This is the easiest way to install FLUIDOS Node on a local machine. + +This guide has been made only for testing purposes. If you want to install FLUIDOS Node on a production environment, please follow the [official installation guide](/docs/installation/installation.md) + +## What will be installed + +This guide will create two different Kubernetes clusters: + +* **fluidos-consumer**: This cluster will act as a consumer of the FLUIDOS Node. It will be used to deploy a `solver` example CR which will simulate an Intent resolution request. Through the REAR Protocol it will be able to communicate with the Provider cluster and to receive matching Flavours, reserving the one that best fits the request and purchasing it. + +* **fluidos-provider**: This cluster will act as a provider of the FLUIDOS Node. It will offer its own Flavours on the specific request made by the consumer, reserving and selling it. + +### Prerequisites + +* [Docker](https://docs.docker.com/get-docker/) +* [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +* [KIND](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) +* [Helm](https://helm.sh/docs/intro/install/) + +### Installation + +1) Clone the repository + +```sh +git clone https://github.com/fluidos-project/node.git +``` + +2) Move into the KIND Example folder + +```sh +cd examples/kind +``` + +3) Launch the `setup.sh` script + +```sh +. ./setup.sh +``` + +4) Wait for the script to finish. It will take some minutes. + +5) When the script has finished, you can check the status of the pods with the following command: + +```sh +kubectl get pods -n fluidos +``` + +6) You should see 3 pods running on the `fluidos-consumer` cluster and 3 pods running on the `fluidos-provider` cluster: + +* `node-local-reaource-manager-` +* `node-rear-manager-` +* `node-rear-controller-` + +7) You can also check the status of the generated flavours with the following command: + +```sh +k get flavours.nodecore.fluidos.eu -n fluidos +``` + +The result should be something like this: + +``` +NAME PROVIDER ID TYPE CPU MEMORY OWNER NAME OWNER DOMAIN AVAILABLE AGE +-k8s-fluidos- kc1pttf3vl k8s-fluidos 4963020133n 26001300Ki kc1pttf3vl fluidos.eu true 168m +-k8s-fluidos- kc1pttf3vl k8s-fluidos 4954786678n 25966964Ki kc1pttf3vl fluidos.eu true 168m +``` + +### Usage + +Now lets try to deploy a `solver` example CR on the `fluidos-consumer` cluster. + +1) Open a new terminal on the repo and move into the `deployments/samples` folder + +```sh +cd deployments/samples +``` + +2) Set the `KUBECONFIG` environment variable to the `fluidos-consumer` cluster + +```sh +export KUBECONFIG=../../examples/kind/consumer/config +``` + +3) Deploy the `solver` CR + +```sh +kubectl apply -f solver.yaml +``` + +4) Check the result of the deployment + +```sh +kubectl get solver -n fluidos +``` + +The result should be something like this: + +``` +NAMESPACE NAME INTENT ID FIND CANDIDATE RESERVE AND BUY PEERING CANDIDATE PHASE RESERVING PHASE PEERING PHASE STATUS MESSAGE AGE +fluidos solver-sample intent-sample true true false Solved Solved Solved No need to enstablish a peering 5s +``` + +5) Other resources have been created, you can check them with the following commands: + +```sh +kubectl get flavours.nodecore.fluidos.eu -n fluidos +kubectl get discoveries.advertisement.fluidos.eu -n fluidos +kubectl get reservations.reservation.fluidos.eu -n fluidos +kubectl get contracts.reservation.fluidos.eu -n fluidos +kubectl get peeringcandidates.advertisement.fluidos.eu -n fluidos +kubectl get transactions.reservation.fluidos.eu -n fluidos +``` diff --git a/examples/kind/consumer/cluster-multi-worker.yaml b/testbed/kind/consumer/cluster-multi-worker.yaml similarity index 100% rename from examples/kind/consumer/cluster-multi-worker.yaml rename to testbed/kind/consumer/cluster-multi-worker.yaml diff --git a/examples/kind/consumer/values.yaml b/testbed/kind/consumer/values.yaml similarity index 100% rename from examples/kind/consumer/values.yaml rename to testbed/kind/consumer/values.yaml diff --git a/examples/kind/metrics-server.yaml b/testbed/kind/metrics-server.yaml similarity index 100% rename from examples/kind/metrics-server.yaml rename to testbed/kind/metrics-server.yaml diff --git a/examples/kind/provider/cluster-multi-worker.yaml b/testbed/kind/provider/cluster-multi-worker.yaml similarity index 100% rename from examples/kind/provider/cluster-multi-worker.yaml rename to testbed/kind/provider/cluster-multi-worker.yaml diff --git a/examples/kind/provider/values.yaml b/testbed/kind/provider/values.yaml similarity index 100% rename from examples/kind/provider/values.yaml rename to testbed/kind/provider/values.yaml diff --git a/examples/kind/setup.sh b/testbed/kind/setup.sh similarity index 100% rename from examples/kind/setup.sh rename to testbed/kind/setup.sh