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