From b2d1e8f7f0bce57225abd5fdd003d00e38518e9c Mon Sep 17 00:00:00 2001 From: cannarelladev Date: Mon, 16 Oct 2023 14:54:26 +0200 Subject: [PATCH] improved resources structures and coherence, fixed some bugs, added support for discovery without selector --- .github/workflows/build.yaml | 192 +++++++++++++----- .gitignore | 2 +- Makefile | 4 +- .../advertisement/v1alpha1/discovery_types.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 7 +- apis/nodecore/v1alpha1/common.go | 4 +- apis/nodecore/v1alpha1/solver_types.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 6 +- apis/reservation/v1alpha1/contract_types.go | 2 +- .../reservation/v1alpha1/reservation_types.go | 2 +- .../reservation/v1alpha1/transaction_types.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 18 +- cmd/rear-controller/main.go | 29 ++- deployments/node/Chart.yaml | 6 +- deployments/node/README.md | 19 +- .../crds/nodecore.fluidos.eu_solvers.yaml | 1 - .../fluidos-rear-controller-ClusterRole.yaml | 8 + deployments/node/fluidos-0.1.0.tgz | Bin 0 -> 15442 bytes deployments/node/index.yaml | 14 ++ deployments/node/node-0.0.1.tgz | Bin 0 -> 15721 bytes deployments/node/robots.tx | 2 + .../fluidos-local-resource-manager-rbac.yaml | 1 - .../fluidos-rear-controller-rbac.yaml | 1 - .../templates/fluidos-rear-manager-rbac.yaml | 1 - deployments/node/values.yaml | 14 +- examples/kind/consumer/values.yaml | 6 +- examples/kind/setup.sh | 4 + pkg/rear-controller/gateway/client.go | 62 ++++-- pkg/rear-controller/gateway/gateway.go | 82 +++++++- pkg/rear-controller/gateway/provider.go | 49 +++-- pkg/rear-controller/gateway/services.go | 32 ++- pkg/rear-controller/gateway/utils.go | 10 +- .../grpc/liqo-resource-manager.go | 16 +- pkg/rear-controller/grpc/service.go | 4 +- pkg/rear-manager/solver_controller.go | 10 +- pkg/utils/common/common.go | 38 ++-- pkg/utils/consts/consts.go | 2 + pkg/utils/flags/flags.go | 1 + pkg/utils/models/gateway.go | 2 +- pkg/utils/models/models.go | 52 ++--- pkg/utils/models/reservation.go | 18 +- pkg/utils/parseutil/parseutil.go | 128 ++++-------- pkg/utils/resourceforge/forge.go | 98 +++++---- 43 files changed, 628 insertions(+), 325 deletions(-) create mode 100644 deployments/node/fluidos-0.1.0.tgz create mode 100644 deployments/node/index.yaml create mode 100644 deployments/node/node-0.0.1.tgz create mode 100644 deployments/node/robots.tx diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7dbf1c7..5460079 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -2,7 +2,7 @@ name: Build Pipeline on: push: tags: - - 'v*' + - "v*" branches: - main @@ -23,52 +23,52 @@ jobs: architectures: ${{ steps.configure.outputs.architectures }} pr-number: ${{ steps.configure.outputs.pr-number }} steps: - - name: Get the version - id: get_version - run: echo "VERSION=$(echo $GITHUB_REF | cut -d / -f 3)" >> $GITHUB_OUTPUT - if: startsWith(github.ref, 'refs/tags/v') - - name: Configure - id: configure - run: | - # The ref of the commit to checkout (do not use the merge commit if repository dispatch) - if [ "${{ github.event_name }}" == "repository_dispatch" ]; then - echo "master=false" >> $GITHUB_OUTPUT - echo "architectures=linux/amd64" >> $GITHUB_OUTPUT - echo "commit-ref=${{ github.event.client_payload.pull_request.head.sha }}" >> $GITHUB_OUTPUT - echo "pr-number=${{ github.event.client_payload.github.payload.issue.number }}" >> $GITHUB_OUTPUT - elif [ "${{ steps.get_version.outputs.VERSION }}" != "" ]; then - echo "master=false" >> $GITHUB_OUTPUT - echo "architectures=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT - echo "commit-ref=${{ steps.get_version.outputs.VERSION }}" >> $GITHUB_OUTPUT - else - echo "master=true" >> $GITHUB_OUTPUT - echo "architectures=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT - echo "commit-ref=${{ github.sha }}" >> $GITHUB_OUTPUT - fi - - # The suffix to append to the repository name if not triggered by a push for a release - ([[ "${{ steps.get_version.outputs.VERSION }}" == "" ]] && \ - echo "repo-suffix=-ci" || - echo "repo-suffix=") >> $GITHUB_OUTPUT - - if [ "${{ github.event_name }}" != "repository_dispatch" ]; then - echo "repo-name=${{ github.repository }}" >> $GITHUB_OUTPUT - else - echo "repo-name=${{ github.event.client_payload.github.payload.repository.full_name }}" >> $GITHUB_OUTPUT - fi - - # Since we are using a repository-dispatch event, we have to explicitly set a run check. We initialize it to a "pending" state. -# - uses: octokit/request-action@v2.x -# name: "Initialize run check to 'pending (For PR-only)" -# with: -# route: POST /repos/${{ github.repository }}/statuses/${{ steps.configure.outputs.commit-ref }} -# state: "pending" -# description: "Component build status" -# context: "Components building" -# target_url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# if: ${{ github.event_name == 'repository_dispatch' }} + - name: Get the version + id: get_version + run: echo "VERSION=$(echo $GITHUB_REF | cut -d / -f 3)" >> $GITHUB_OUTPUT + if: startsWith(github.ref, 'refs/tags/v') + - name: Configure + id: configure + run: | + # The ref of the commit to checkout (do not use the merge commit if repository dispatch) + if [ "${{ github.event_name }}" == "repository_dispatch" ]; then + echo "master=false" >> $GITHUB_OUTPUT + echo "architectures=linux/amd64" >> $GITHUB_OUTPUT + echo "commit-ref=${{ github.event.client_payload.pull_request.head.sha }}" >> $GITHUB_OUTPUT + echo "pr-number=${{ github.event.client_payload.github.payload.issue.number }}" >> $GITHUB_OUTPUT + elif [ "${{ steps.get_version.outputs.VERSION }}" != "" ]; then + echo "master=false" >> $GITHUB_OUTPUT + echo "architectures=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT + echo "commit-ref=${{ steps.get_version.outputs.VERSION }}" >> $GITHUB_OUTPUT + else + echo "master=true" >> $GITHUB_OUTPUT + echo "architectures=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT + echo "commit-ref=${{ github.sha }}" >> $GITHUB_OUTPUT + fi + + # The suffix to append to the repository name if not triggered by a push for a release + ([[ "${{ steps.get_version.outputs.VERSION }}" == "" ]] && \ + echo "repo-suffix=-ci" || + echo "repo-suffix=") >> $GITHUB_OUTPUT + + if [ "${{ github.event_name }}" != "repository_dispatch" ]; then + echo "repo-name=${{ github.repository }}" >> $GITHUB_OUTPUT + else + echo "repo-name=${{ github.event.client_payload.github.payload.repository.full_name }}" >> $GITHUB_OUTPUT + fi + + # Since we are using a repository-dispatch event, we have to explicitly set a run check. We initialize it to a "pending" state. + # - uses: octokit/request-action@v2.x + # name: "Initialize run check to 'pending (For PR-only)" + # with: + # route: POST /repos/${{ github.repository }}/statuses/${{ steps.configure.outputs.commit-ref }} + # state: "pending" + # description: "Component build status" + # context: "Components building" + # target_url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # if: ${{ github.event_name == 'repository_dispatch' }} build: permissions: @@ -81,9 +81,9 @@ jobs: fail-fast: false matrix: component: - - rear-manager - - rear-controller - - local-resource-manager + - rear-manager + - rear-controller + - local-resource-manager steps: - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 @@ -140,4 +140,94 @@ jobs: - name: Move cache run: | rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache \ No newline at end of file + mv /tmp/.buildx-cache-new /tmp/.buildx-cache + + post-build: + runs-on: ubuntu-latest + needs: [build, configure] + steps: + # Since we are using a repository-dispatch event, we have to explicitly set a run check. We update it to the actual status. + - uses: octokit/request-action@v2.x + name: "Set the PR check status (For PR-only)" + with: + route: POST /repos/${{ github.repository }}/statuses/${{ needs.configure.outputs.commit-ref }} + state: "${{ needs.build.result }}" + description: "Component build status" + context: "Components building" + target_url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + env: + GITHUB_TOKEN: ${{ secrets.CI_TOKEN }} + if: ${{ !cancelled() && github.event_name == 'repository_dispatch' }} + + release: + runs-on: ubuntu-latest + needs: [build, configure] + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + # The changelog generation requires the entire history + fetch-depth: 0 + ref: "${{ needs.configure.outputs.commit-ref }}" + repository: "${{ needs.configure.outputs.repo-name }}" + persist-credentials: false + + - name: Get the latest Fluidos release + uses: pozetroninc/github-action-get-latest-release@v0.7.0 + id: last-release + with: + repository: ${{ github.repository }} + excludes: prerelease, draft + + - name: Configure Git + run: | + git config user.name "adamjensenbot" + git config user.email "adamjensenbot@users.noreply.github.com" + + - name: Install Helm + uses: azure/setup-helm@v3 + with: + version: v3.8.1 + + - name: Parse semver string + id: semver_parser + uses: booxmedialtd/ws-action-parse-semver@v1 + with: + input_string: "${{ needs.configure.outputs.commit-ref }}" + version_extractor_regex: "v(.*)$" + + - name: Download chart releaser + run: | + curl -sSL "https://github.com/helm/chart-releaser/releases/download/v1.4.0/chart-releaser_1.4.0_linux_amd64.tar.gz" | tar -xz + + - name: Package helm chart + run: | + # the output should be in the .cr-release-packages since cr index expects to find it there to create the helm index + helm package deployments/node --version "${{ needs.configure.outputs.commit-ref }}" --app-version "${{ needs.configure.outputs.commit-ref }}" --destination .cr-release-packages + + # we need to upload only helm artifacts first, to make the index updater to work + - uses: ncipollo/release-action@v1 + with: + artifacts: ".cr-release-packages/*" + generateReleaseNotes: true + token: ${{ secrets.CI_TOKEN }} + allowUpdates: true + tag: ${{ needs.configure.outputs.commit-ref }} + name: ${{ needs.configure.outputs.commit-ref }} + prerelease: ${{ steps.semver_parser.outputs.prerelease != '' }} + + - name: Update Helm index + run: | + repo=$(cut -d '/' -f 2 <<< "$GITHUB_REPOSITORY") + owner=$(cut -d '/' -f 1 <<< "$GITHUB_REPOSITORY") + + # Update index and push to github pages + ./cr index \ + --owner "$owner" \ + --git-repo "$repo" \ + --release-name-template "${{ needs.configure.outputs.commit-ref }}" \ + --token "${{ secrets.GITHUB_TOKEN }}" \ + --index-path index.yaml \ + --pages-index-path index.yaml \ + --push diff --git a/.gitignore b/.gitignore index 5a698c7..9caa221 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ config *.swp *.swo *~ -*.tgz +#*.tgz .vscode .devcontainer .DS_Store diff --git a/Makefile b/Makefile index 88d8cca..2189fd2 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ rbacs: controller-gen # Install gci if not available gci: ifeq (, $(shell which gci)) - @go install github.com/daixiang0/gci@v0.11.0 + @go install github.com/daixiang0/gci@v0.11.2 GCI=$(GOBIN)/gci else GCI=$(shell which gci) @@ -59,7 +59,7 @@ fmt: gci addlicense # Install golangci-lint if not available golangci-lint: ifeq (, $(shell which golangci-lint)) - @go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.53.3 + @go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.2 GOLANGCILINT=$(GOBIN)/golangci-lint else GOLANGCILINT=$(shell which golangci-lint) diff --git a/apis/advertisement/v1alpha1/discovery_types.go b/apis/advertisement/v1alpha1/discovery_types.go index d92b888..744a322 100644 --- a/apis/advertisement/v1alpha1/discovery_types.go +++ b/apis/advertisement/v1alpha1/discovery_types.go @@ -32,7 +32,7 @@ type DiscoverySpec struct { // This is the FlavourSelector that describes the characteristics of the intent that the solver is looking to satisfy // This pattern corresponds to what has been defined in the REAR Protocol to do a discovery with a selector - Selector nodecorev1alpha1.FlavourSelector `json:"selector"` + Selector *nodecorev1alpha1.FlavourSelector `json:"selector"` // This flag indicates that needs to be enstablished a subscription to the provider in case a match is found. // In order to have periodic updates of the status of the matching Flavour diff --git a/apis/advertisement/v1alpha1/zz_generated.deepcopy.go b/apis/advertisement/v1alpha1/zz_generated.deepcopy.go index f479f32..9d747cb 100644 --- a/apis/advertisement/v1alpha1/zz_generated.deepcopy.go +++ b/apis/advertisement/v1alpha1/zz_generated.deepcopy.go @@ -19,6 +19,7 @@ package v1alpha1 import ( + nodecorev1alpha1 "github.com/fluidos-project/node/apis/nodecore/v1alpha1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -84,7 +85,11 @@ func (in *DiscoveryList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DiscoverySpec) DeepCopyInto(out *DiscoverySpec) { *out = *in - in.Selector.DeepCopyInto(&out.Selector) + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(nodecorev1alpha1.FlavourSelector) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiscoverySpec. diff --git a/apis/nodecore/v1alpha1/common.go b/apis/nodecore/v1alpha1/common.go index f340480..4dfab3f 100644 --- a/apis/nodecore/v1alpha1/common.go +++ b/apis/nodecore/v1alpha1/common.go @@ -45,9 +45,9 @@ type NodeIdentity struct { } // toString() returns a string representation of the GenericRef. -func (r GenericRef) toString() string { +/* func (r GenericRef) toString() string { if r.Namespace != "" { return r.Namespace + "/" + r.Name } return r.Name -} +} */ diff --git a/apis/nodecore/v1alpha1/solver_types.go b/apis/nodecore/v1alpha1/solver_types.go index 22accff..533ed98 100644 --- a/apis/nodecore/v1alpha1/solver_types.go +++ b/apis/nodecore/v1alpha1/solver_types.go @@ -80,7 +80,7 @@ type RangeSelector struct { type SolverSpec struct { // Selector contains the flavour requirements for the solver. - Selector FlavourSelector `json:"selector"` + Selector *FlavourSelector `json:"selector,omitempty"` // IntentID is the ID of the intent that the Node Orchestrator is trying to solve. // It is used to link the solver with the intent. diff --git a/apis/nodecore/v1alpha1/zz_generated.deepcopy.go b/apis/nodecore/v1alpha1/zz_generated.deepcopy.go index 4ea1249..4f86197 100644 --- a/apis/nodecore/v1alpha1/zz_generated.deepcopy.go +++ b/apis/nodecore/v1alpha1/zz_generated.deepcopy.go @@ -495,7 +495,11 @@ func (in *SolverList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SolverSpec) DeepCopyInto(out *SolverSpec) { *out = *in - in.Selector.DeepCopyInto(&out.Selector) + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(FlavourSelector) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SolverSpec. diff --git a/apis/reservation/v1alpha1/contract_types.go b/apis/reservation/v1alpha1/contract_types.go index 7e2dd65..cab5cd8 100644 --- a/apis/reservation/v1alpha1/contract_types.go +++ b/apis/reservation/v1alpha1/contract_types.go @@ -41,7 +41,7 @@ type ContractSpec struct { // The partition represents the dimension of the resources sold/bought. // So it will reflect the dimension of the resources allocated on the remote cluster and reflected on the local virtual node. - Partition Partition `json:"partition,omitempty"` + Partition *Partition `json:"partition,omitempty"` // This is the Node identity of the buyer FLUIDOS Node. Buyer nodecorev1alpha1.NodeIdentity `json:"buyer"` diff --git a/apis/reservation/v1alpha1/reservation_types.go b/apis/reservation/v1alpha1/reservation_types.go index 2c1b837..4705be0 100644 --- a/apis/reservation/v1alpha1/reservation_types.go +++ b/apis/reservation/v1alpha1/reservation_types.go @@ -46,7 +46,7 @@ type ReservationSpec struct { Seller nodecorev1alpha1.NodeIdentity `json:"seller"` // Parition is the partition of the flavour that is being reserved - Partition Partition `json:"partition,omitempty"` + Partition *Partition `json:"partition,omitempty"` // Reserve indicates if the reservation is a reserve or not Reserve bool `json:"reserve,omitempty"` diff --git a/apis/reservation/v1alpha1/transaction_types.go b/apis/reservation/v1alpha1/transaction_types.go index dc26a29..dbe6e58 100644 --- a/apis/reservation/v1alpha1/transaction_types.go +++ b/apis/reservation/v1alpha1/transaction_types.go @@ -31,7 +31,7 @@ type TransactionSpec struct { ClusterID string `json:"clusterID"` // Partition is the partition of the flavour that is being reserved - Partition Partition `json:"partition,omitempty"` + Partition *Partition `json:"partition,omitempty"` // StartTime is the time at which the reservation should start StartTime string `json:"startTime,omitempty"` diff --git a/apis/reservation/v1alpha1/zz_generated.deepcopy.go b/apis/reservation/v1alpha1/zz_generated.deepcopy.go index 9a77e86..bbcfeef 100644 --- a/apis/reservation/v1alpha1/zz_generated.deepcopy.go +++ b/apis/reservation/v1alpha1/zz_generated.deepcopy.go @@ -85,7 +85,11 @@ func (in *ContractList) DeepCopyObject() runtime.Object { func (in *ContractSpec) DeepCopyInto(out *ContractSpec) { *out = *in in.Flavour.DeepCopyInto(&out.Flavour) - in.Partition.DeepCopyInto(&out.Partition) + if in.Partition != nil { + in, out := &in.Partition, &out.Partition + *out = new(Partition) + (*in).DeepCopyInto(*out) + } out.Buyer = in.Buyer out.Seller = in.Seller out.SellerCredentials = in.SellerCredentials @@ -223,7 +227,11 @@ func (in *ReservationSpec) DeepCopyInto(out *ReservationSpec) { *out = *in out.Buyer = in.Buyer out.Seller = in.Seller - in.Partition.DeepCopyInto(&out.Partition) + if in.Partition != nil { + in, out := &in.Partition, &out.Partition + *out = new(Partition) + (*in).DeepCopyInto(*out) + } out.PeeringCandidate = in.PeeringCandidate } @@ -317,7 +325,11 @@ func (in *TransactionList) DeepCopyObject() runtime.Object { func (in *TransactionSpec) DeepCopyInto(out *TransactionSpec) { *out = *in out.Buyer = in.Buyer - in.Partition.DeepCopyInto(&out.Partition) + if in.Partition != nil { + in, out := &in.Partition, &out.Partition + *out = new(Partition) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TransactionSpec. diff --git a/cmd/rear-controller/main.go b/cmd/rear-controller/main.go index fb1686d..9f5beec 100644 --- a/cmd/rear-controller/main.go +++ b/cmd/rear-controller/main.go @@ -144,20 +144,39 @@ func main() { os.Exit(1) } + // Periodically clear the transaction cache if err := mgr.Add(manager.RunnableFunc(gw.CacheRefresher(flags.REFRESH_CACHE_INTERVAL))); err != nil { klog.Errorf("Unable to set up transaction cache refresher: %s", err) os.Exit(1) } + // Periodically check if Liqo is ready + if err := mgr.Add(manager.RunnableFunc(gw.LiqoChecker(flags.LIQO_CHECK_INTERVAL))); err != nil { + klog.Errorf("Unable to set up Liqo checker: %s", err) + os.Exit(1) + } + + // Start the REAR Gateway HTTP server + if err := mgr.Add(manager.RunnableFunc(gw.Start)); err != nil { + klog.Errorf("Unable to set up Gateway HTTP server: %s", err) + os.Exit(1) + } + + // Start the REAR GRPC server + if err := mgr.Add(manager.RunnableFunc(grpcServer.Start)); err != nil { + klog.Errorf("Unable to set up Gateway GRPC server: %s", err) + os.Exit(1) + } + // Start the REAR Gateway HTTP server - go func() { - gw.StartHttpServer() - }() + /* go func() { + gw.Start() + }() */ // Start the REAR GRPC server - go func() { + /* go func() { grpcServer.Start() - }() + }() */ // TODO: Uncomment this when the webhook is ready. For now it does not work (Ale) // pcv := discoverymanager.NewPCValidator(mgr.GetClient()) diff --git a/deployments/node/Chart.yaml b/deployments/node/Chart.yaml index a8d8c7d..4188577 100644 --- a/deployments/node/Chart.yaml +++ b/deployments/node/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -name: fluidos +name: node description: A Helm chart for Fluidos Node # A chart can be either an 'application' or a 'library' chart. @@ -15,10 +15,10 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 +version: 0.0.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.1.0" +appVersion: "0.0.1" diff --git a/deployments/node/README.md b/deployments/node/README.md index 11d5c6c..a673a1d 100644 --- a/deployments/node/README.md +++ b/deployments/node/README.md @@ -1,4 +1,4 @@ -# Fluidos +# fluidos ![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.1.0](https://img.shields.io/badge/AppVersion-0.1.0-informational?style=flat-square) @@ -18,28 +18,28 @@ A Helm chart for Fluidos Node | localResourceManager.config.flavour.memoryStep | string | `"100Mi"` | The memory step that must be respected when requesting a flavour through a Flavour Selector. | | localResourceManager.config.nodeResourceLabel | string | `"node-role.fluidos.eu/resources"` | Label used to identify the nodes from which resources are collected. | | localResourceManager.config.resourceType | string | `"k8s-fluidos"` | This flag defines the resource type of the generated flavours. | -| localResourceManager.imageName | string | `"cannarelladev/local-resource-manager"` | | +| localResourceManager.imageName | string | `"ghcr.io/fluidos-project/local-resource-manager"` | | | localResourceManager.pod.annotations | object | `{}` | Annotations for the local-resource-manager pod. | | localResourceManager.pod.extraArgs | list | `[]` | Extra arguments for the local-resource-manager pod. | | localResourceManager.pod.labels | object | `{}` | Labels for the local-resource-manager pod. | | localResourceManager.pod.resources | object | `{"limits":{},"requests":{}}` | Resource requests and limits (https://kubernetes.io/docs/user-guide/compute-resources/) for the local-resource-manager pod. | | localResourceManager.replicas | int | `1` | The number of REAR Controller, which can be increased for active/passive high availability. | -| networkManager.configMaps.nodeIdentity.domain | string | `"fluidos.eu"` | The domain name of the FLUIDOS closed domani: It represents for instance the Enterprise and it is used to generate the FQDN of the owned FLUIDOS Nodes | +| networkManager.configMaps.nodeIdentity.domain | string | `""` | The domain name of the FLUIDOS closed domani: It represents for instance the Enterprise and it is used to generate the FQDN of the owned FLUIDOS Nodes | | networkManager.configMaps.nodeIdentity.ip | string | `nil` | The IP address of the FLUIDOS Node. It can be public or private, depending on the network configuration and it corresponds to the IP address to reach the Network Manager from the outside of the cluster. | | networkManager.configMaps.nodeIdentity.name | string | `"fluidos-network-manager-identity"` | The name of the ConfigMap containing the FLUIDOS Node identity info. | | networkManager.configMaps.nodeIdentity.nodeID | string | `nil` | The NodeID is a UUID that identifies the FLUIDOS Node. It is used to generate the FQDN of the owned FLUIDOS Nodes and it is unique in the FLUIDOS closed domain | | networkManager.configMaps.providers.default | string | `nil` | The IP List of SuperNodes separated by commas. | -| networkManager.configMaps.providers.local | string | `"192.168.0.1,192.168.0.2,192.168.0.3"` | The IP List of Local knwon FLUIDOS Nodes separated by commas. | +| networkManager.configMaps.providers.local | string | `""` | The IP List of Local knwon FLUIDOS Nodes separated by commas. | | networkManager.configMaps.providers.name | string | `"fluidos-network-manager-config"` | The name of the ConfigMap containing the list of the FLUIDOS Providers and the default FLUIDOS Provider (SuperNode or Catalogue). | | networkManager.configMaps.providers.remote | string | `nil` | The IP List of Remote known FLUIDOS Nodes separated by commas. | -| networkManager.imageName | string | `"ghcr.io/fluidos/network-manager"` | | +| networkManager.imageName | string | `"ghcr.io/fluidos-project/network-manager"` | | | networkManager.pod.annotations | object | `{}` | Annotations for the network-manager pod. | | networkManager.pod.extraArgs | list | `[]` | Extra arguments for the network-manager pod. | | networkManager.pod.labels | object | `{}` | Labels for the network-manager pod. | | networkManager.pod.resources | object | `{"limits":{},"requests":{}}` | Resource requests and limits (https://kubernetes.io/docs/user-guide/compute-resources/) for the network-manager pod. | | networkManager.replicas | int | `1` | The number of Network Manager, which can be increased for active/passive high availability. | | pullPolicy | string | `"IfNotPresent"` | The pullPolicy for fluidos-node pods. | -| rearController.imageName | string | `"cannarelladev/rear-controller"` | | +| rearController.imageName | string | `"ghcr.io/fluidos-project/rear-controller"` | | | rearController.pod.annotations | object | `{}` | Annotations for the rear-controller pod. | | rearController.pod.extraArgs | list | `[]` | Extra arguments for the rear-controller pod. | | rearController.pod.labels | object | `{}` | Labels for the rear-controller pod. | @@ -61,10 +61,13 @@ A Helm chart for Fluidos Node | rearController.service.grpc.port | int | `2710` | The gRPC port used by Liqo to connect with the Gateway of the rear-controller to obtain the Contract resources for a given consumer ClusterID. | | rearController.service.grpc.targetPort | int | `2710` | The target port used by the gRPC service. | | rearController.service.grpc.type | string | `"ClusterIP"` | Kubernetes service used to expose the gRPC Server to liqo. | -| rearManager.imageName | string | `"cannarelladev/rear-manager"` | | +| rearManager.imageName | string | `"ghcr.io/fluidos-project/rear-manager"` | | | rearManager.pod.annotations | object | `{}` | Annotations for the rear-manager pod. | | rearManager.pod.extraArgs | list | `[]` | Extra arguments for the rear-manager pod. | | rearManager.pod.labels | object | `{}` | Labels for the rear-manager pod. | | rearManager.pod.resources | object | `{"limits":{},"requests":{}}` | Resource requests and limits (https://kubernetes.io/docs/user-guide/compute-resources/) for the rear-manager pod. | | rearManager.replicas | int | `1` | The number of REAR Manager, which can be increased for active/passive high availability. | -| tag | string | `"v0.1"` | Images' tag to select a development version of fluidos-node instead of a release | +| tag | string | `""` | Images' tag to select a development version of fluidos-node instead of a release | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0) diff --git a/deployments/node/crds/nodecore.fluidos.eu_solvers.yaml b/deployments/node/crds/nodecore.fluidos.eu_solvers.yaml index f5895a7..d716922 100644 --- a/deployments/node/crds/nodecore.fluidos.eu_solvers.yaml +++ b/deployments/node/crds/nodecore.fluidos.eu_solvers.yaml @@ -201,7 +201,6 @@ spec: type: object required: - intentID - - selector type: object status: description: SolverStatus defines the observed state of Solver diff --git a/deployments/node/files/fluidos-rear-controller-ClusterRole.yaml b/deployments/node/files/fluidos-rear-controller-ClusterRole.yaml index 684e3f9..044e17c 100644 --- a/deployments/node/files/fluidos-rear-controller-ClusterRole.yaml +++ b/deployments/node/files/fluidos-rear-controller-ClusterRole.yaml @@ -59,6 +59,14 @@ rules: - get - list - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - watch - apiGroups: - nodecore.fluidos.eu resources: diff --git a/deployments/node/fluidos-0.1.0.tgz b/deployments/node/fluidos-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..de8e7441d6a7c0c507aa215f353db9f524430a03 GIT binary patch literal 15442 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 K9V`O^?Ee6MGx=8l literal 0 HcmV?d00001 diff --git a/deployments/node/index.yaml b/deployments/node/index.yaml new file mode 100644 index 0000000..02eabb3 --- /dev/null +++ b/deployments/node/index.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +entries: + node: + - apiVersion: v2 + appVersion: 0.0.1 + created: "2023-10-17T17:14:59.809373+02:00" + description: A Helm chart for Fluidos Node + digest: 8b51c13b01d65407087391bfada5f579cd2e9a1f668d4a0ce1c1178fe3bf4859 + name: node + type: application + urls: + - https://github.com/fluidos-project/node/deployments/node/node-0.0.1.tgz + version: 0.0.1 +generated: "2023-10-17T17:14:59.808177+02:00" diff --git a/deployments/node/node-0.0.1.tgz b/deployments/node/node-0.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..27480dd1797d7a5b080c82bda6828b9e4394e4ec GIT binary patch literal 15721 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 0 { + if selector.RangeSelector.MaxCpu.CmpInt64(0) != 0 && f.Spec.Characteristics.Cpu.Cmp(selector.RangeSelector.MaxCpu) > 0 { return false } - if selector.RangeSelector.MaxMemory != 0 && f.Spec.Characteristics.Memory.CmpInt64(int64(selector.RangeSelector.MaxMemory)) > 0 { + if selector.RangeSelector.MaxMemory.CmpInt64(0) != 0 && f.Spec.Characteristics.Memory.Cmp(selector.RangeSelector.MaxMemory) > 0 { return false } - if selector.RangeSelector.MaxEph != 0 && f.Spec.Characteristics.EphemeralStorage.CmpInt64(int64(selector.RangeSelector.MaxEph)) > 0 { + if selector.RangeSelector.MaxEph.CmpInt64(0) != 0 && f.Spec.Characteristics.EphemeralStorage.Cmp(selector.RangeSelector.MaxEph) > 0 { return false } - if selector.RangeSelector.MaxStorage != 0 && f.Spec.Characteristics.PersistentStorage.CmpInt64(int64(selector.RangeSelector.MaxStorage)) > 0 { + if selector.RangeSelector.MaxStorage.CmpInt64(0) != 0 && f.Spec.Characteristics.PersistentStorage.Cmp(selector.RangeSelector.MaxStorage) > 0 { return false } - if selector.RangeSelector.MaxGpu != 0 && f.Spec.Characteristics.Gpu.CmpInt64(int64(selector.RangeSelector.MaxGpu)) > 0 { + if selector.RangeSelector.MaxGpu.CmpInt64(0) != 0 && f.Spec.Characteristics.Gpu.Cmp(selector.RangeSelector.MaxGpu) > 0 { return false } } @@ -132,13 +132,13 @@ func FilterFlavour(selector models.Selector, f nodecorev1alpha1.Flavour) bool { // FilterPeeringCandidate filters the peering candidate based on the solver's flavour selector func FilterPeeringCandidate(selector *nodecorev1alpha1.FlavourSelector, pc *advertisementv1alpha1.PeeringCandidate) bool { - s := parseutil.ParseFlavourSelector(*selector) + s := parseutil.ParseFlavourSelector(selector) return FilterFlavour(s, pc.Spec.Flavour) } // CheckSelector ia a func to check if the syntax of the Selector is right. // Strict and range syntax cannot be used together -func CheckSelector(selector models.Selector) error { +func CheckSelector(selector *models.Selector) error { if selector.MatchSelector != nil && selector.RangeSelector != nil { return fmt.Errorf("selector syntax error: strict and range syntax cannot be used together") diff --git a/pkg/utils/consts/consts.go b/pkg/utils/consts/consts.go index c5d861e..99fd8bb 100644 --- a/pkg/utils/consts/consts.go +++ b/pkg/utils/consts/consts.go @@ -17,4 +17,6 @@ package consts const ( NETWORK_CONFIG_MAP_NAME = "fluidos-network-manager-config" NODE_IDENTITY_CONFIG_MAP_NAME = "fluidos-network-manager-identity" + LIQO_CLUSTERID_CONFIGMAP_NAME = "liqo-clusterid-configmap" + LIQO_NAMESPACE = "liqo" ) diff --git a/pkg/utils/flags/flags.go b/pkg/utils/flags/flags.go index 2f2b0f9..32eddd6 100644 --- a/pkg/utils/flags/flags.go +++ b/pkg/utils/flags/flags.go @@ -28,6 +28,7 @@ var ( EXPIRATION_TRANSACTION = 20 * time.Second EXPIRATION_CONTRACT = 365 * 24 * time.Hour REFRESH_CACHE_INTERVAL = 20 * time.Second + LIQO_CHECK_INTERVAL = 20 * time.Second ) var ( diff --git a/pkg/utils/models/gateway.go b/pkg/utils/models/gateway.go index 32df4ff..364a03b 100644 --- a/pkg/utils/models/gateway.go +++ b/pkg/utils/models/gateway.go @@ -30,5 +30,5 @@ type ReserveRequest struct { FlavourID string `json:"flavourID"` Buyer NodeIdentity `json:"buyerID"` ClusterID string `json:"clusterID"` - Partition Partition `json:"partition"` + Partition *Partition `json:"partition,omitempty"` } diff --git a/pkg/utils/models/models.go b/pkg/utils/models/models.go index a32a617..a741faf 100644 --- a/pkg/utils/models/models.go +++ b/pkg/utils/models/models.go @@ -16,6 +16,8 @@ package models import ( "time" + + "k8s.io/apimachinery/pkg/api/resource" ) // Flavour represents a Flavour object with its characteristics and policies. @@ -33,12 +35,12 @@ type Flavour struct { // Characteristics represents the characteristics of a Flavour, such as CPU and RAM. type Characteristics struct { - CPU int `json:"cpu,omitempty"` - Memory int `json:"memory,omitempty"` - PersistentStorage int `json:"storage,omitempty"` - EphemeralStorage int `json:"ephemeralStorage,omitempty"` - GPU int `json:"gpu,omitempty"` - Architecture string `json:"architecture,omitempty"` + CPU resource.Quantity `json:"cpu,omitempty"` + Memory resource.Quantity `json:"memory,omitempty"` + PersistentStorage resource.Quantity `json:"storage,omitempty"` + EphemeralStorage resource.Quantity `json:"ephemeralStorage,omitempty"` + Gpu resource.Quantity `json:"gpu,omitempty"` + Architecture string `json:"architecture,omitempty"` } // Policy represents the policy associated with a Flavour, which can be either Partitionable or Aggregatable. @@ -49,10 +51,10 @@ type Policy struct { // Partitionable represents the partitioning properties of a Flavour, such as the minimum and incremental values of CPU and RAM. type Partitionable struct { - CPUMinimum int `json:"cpuMinimum"` - MemoryMinimum int `json:"memoryMinimum"` - CPUStep int `json:"cpuStep"` - MemoryStep int `json:"memoryStep"` + CPUMinimum resource.Quantity `json:"cpuMinimum"` + MemoryMinimum resource.Quantity `json:"memoryMinimum"` + CPUStep resource.Quantity `json:"cpuStep"` + MemoryStep resource.Quantity `json:"memoryStep"` } // Aggregatable represents the aggregation properties of a Flavour, such as the minimum instance count. @@ -90,23 +92,23 @@ type Selector struct { // MatchSelector represents the criteria for selecting Flavours through a strict match. type MatchSelector struct { - Cpu int `json:"cpu,omitempty"` - Memory int `json:"memory,omitempty"` - Storage int `json:"storage,omitempty"` - EphemeralStorage int `json:"ephemeralStorage,omitempty"` - Gpu int `json:"gpu,omitempty"` + Cpu resource.Quantity `json:"cpu,omitempty"` + Memory resource.Quantity `json:"memory,omitempty"` + Storage resource.Quantity `json:"storage,omitempty"` + EphemeralStorage resource.Quantity `json:"ephemeralStorage,omitempty"` + Gpu resource.Quantity `json:"gpu,omitempty"` } // RangeSelector represents the criteria for selecting Flavours through a range. type RangeSelector struct { - MinCpu int `json:"minCpu,omitempty"` - MinMemory int `json:"minMemory,omitempty"` - MinStorage int `json:"minStorage,omitempty"` - MinEph int `json:"minEph,omitempty"` - MinGpu int `json:"minGpu,omitempty"` - MaxCpu int `json:"maxCpu,omitempty"` - MaxMemory int `json:"maxMemory,omitempty"` - MaxStorage int `json:"maxStorage,omitempty"` - MaxEph int `json:"maxEph,omitempty"` - MaxGpu int `json:"maxGpu,omitempty"` + MinCpu resource.Quantity `json:"minCpu,omitempty"` + MinMemory resource.Quantity `json:"minMemory,omitempty"` + MinStorage resource.Quantity `json:"minStorage,omitempty"` + MinEph resource.Quantity `json:"minEph,omitempty"` + MinGpu resource.Quantity `json:"minGpu,omitempty"` + MaxCpu resource.Quantity `json:"maxCpu,omitempty"` + MaxMemory resource.Quantity `json:"maxMemory,omitempty"` + MaxStorage resource.Quantity `json:"maxStorage,omitempty"` + MaxEph resource.Quantity `json:"maxEph,omitempty"` + MaxGpu resource.Quantity `json:"maxGpu,omitempty"` } diff --git a/pkg/utils/models/reservation.go b/pkg/utils/models/reservation.go index fcfff55..7b7e5af 100644 --- a/pkg/utils/models/reservation.go +++ b/pkg/utils/models/reservation.go @@ -14,21 +14,23 @@ package models +import "k8s.io/apimachinery/pkg/api/resource" + // Partition represents the partitioning properties of a Flavour type Partition struct { - Architecture string `json:"architecture"` - Cpu int `json:"cpu"` - Memory int `json:"memory"` - EphemeralStorage int `json:"ephemeral-storage,omitempty"` - Gpu int `json:"gpu,omitempty"` - Storage int `json:"storage,omitempty"` + Architecture string `json:"architecture"` + Cpu resource.Quantity `json:"cpu"` + Memory resource.Quantity `json:"memory"` + EphemeralStorage resource.Quantity `json:"ephemeral-storage,omitempty"` + Gpu resource.Quantity `json:"gpu,omitempty"` + Storage resource.Quantity `json:"storage,omitempty"` } // Transaction contains information regarding the transaction for a flavour type Transaction struct { TransactionID string `json:"transactionID"` FlavourID string `json:"flavourID"` - Partition Partition `json:"partition"` + Partition *Partition `json:"partition,omitempty"` Buyer NodeIdentity `json:"buyer"` ClusterID string `json:"clusterID"` StartTime string `json:"startTime"` @@ -45,7 +47,7 @@ type Contract struct { SellerCredentials LiqoCredentials `json:"sellerCredentials"` ExpirationTime string `json:"expirationTime,omitempty"` ExtraInformation map[string]string `json:"extraInformation,omitempty"` - Partition Partition `json:"partition,omitempty"` + Partition *Partition `json:"partition,omitempty"` } // LiqoCredentials contains the credentials of a Liqo cluster to enstablish a peering. diff --git a/pkg/utils/parseutil/parseutil.go b/pkg/utils/parseutil/parseutil.go index a453ba3..9d46037 100644 --- a/pkg/utils/parseutil/parseutil.go +++ b/pkg/utils/parseutil/parseutil.go @@ -22,88 +22,58 @@ import ( ) // ParseFlavourSelector parses FlavourSelector into a Selector -func ParseFlavourSelector(selector nodecorev1alpha1.FlavourSelector) (s models.Selector) { +func ParseFlavourSelector(selector *nodecorev1alpha1.FlavourSelector) (s *models.Selector) { s.Architecture = selector.Architecture s.FlavourType = string(selector.FlavourType) if selector.MatchSelector != nil { - cpu, _ := selector.MatchSelector.Cpu.AsInt64() - memory, _ := selector.MatchSelector.Memory.AsInt64() - ephStorage, _ := selector.MatchSelector.EphemeralStorage.AsInt64() - storage, _ := selector.MatchSelector.Storage.AsInt64() - gpu, _ := selector.MatchSelector.Gpu.AsInt64() - s.MatchSelector = &models.MatchSelector{ - Cpu: int(cpu), - Memory: int(memory), - EphemeralStorage: int(ephStorage), - Storage: int(storage), - Gpu: int(gpu), + Cpu: selector.MatchSelector.Cpu, + Memory: selector.MatchSelector.Memory, + EphemeralStorage: selector.MatchSelector.EphemeralStorage, + Storage: selector.MatchSelector.Storage, + Gpu: selector.MatchSelector.Gpu, } } if selector.RangeSelector != nil { - minCpu, _ := selector.RangeSelector.MinCpu.AsInt64() - minMemory, _ := selector.RangeSelector.MinMemory.AsInt64() - minEph, _ := selector.RangeSelector.MinEph.AsInt64() - minStorage, _ := selector.RangeSelector.MinStorage.AsInt64() - minGpu, _ := selector.RangeSelector.MinGpu.AsInt64() - maxCpu, _ := selector.RangeSelector.MaxCpu.AsInt64() - maxMemory, _ := selector.RangeSelector.MaxMemory.AsInt64() - maxEph, _ := selector.RangeSelector.MaxEph.AsInt64() - maxStorage, _ := selector.RangeSelector.MaxStorage.AsInt64() - maxGpu, _ := selector.RangeSelector.MaxGpu.AsInt64() - s.RangeSelector = &models.RangeSelector{ - MinCpu: int(minCpu), - MinMemory: int(minMemory), - MinEph: int(minEph), - MinStorage: int(minStorage), - MinGpu: int(minGpu), - MaxCpu: int(maxCpu), - MaxMemory: int(maxMemory), - MaxEph: int(maxEph), - MaxStorage: int(maxStorage), - MaxGpu: int(maxGpu), + MinCpu: selector.RangeSelector.MinCpu, + MinMemory: selector.RangeSelector.MinMemory, + MinEph: selector.RangeSelector.MinEph, + MinStorage: selector.RangeSelector.MinStorage, + MinGpu: selector.RangeSelector.MinGpu, + MaxCpu: selector.RangeSelector.MaxCpu, + MaxMemory: selector.RangeSelector.MaxMemory, + MaxEph: selector.RangeSelector.MaxEph, + MaxStorage: selector.RangeSelector.MaxStorage, + MaxGpu: selector.RangeSelector.MaxGpu, } } return } -func ParsePartition(partition reservationv1alpha1.Partition) models.Partition { - cpu, _ := partition.Cpu.AsInt64() - memory, _ := partition.Memory.AsInt64() - ephStorage, _ := partition.EphemeralStorage.AsInt64() - storage, _ := partition.Storage.AsInt64() - gpu, _ := partition.Gpu.AsInt64() - - return models.Partition{ - Cpu: int(cpu), - Memory: int(memory), - EphemeralStorage: int(ephStorage), - Storage: int(storage), - Gpu: int(gpu), +func ParsePartition(partition *reservationv1alpha1.Partition) *models.Partition { + return &models.Partition{ + Cpu: partition.Cpu, + Memory: partition.Memory, + EphemeralStorage: partition.EphemeralStorage, + Storage: partition.Storage, + Gpu: partition.Gpu, } } -func ParsePartitionFromObj(partition models.Partition) reservationv1alpha1.Partition { - p := reservationv1alpha1.Partition{ - Architecture: partition.Architecture, - Cpu: *resource.NewQuantity(int64(partition.Cpu), resource.DecimalSI), - Memory: *resource.NewQuantity(int64(partition.Memory), resource.BinarySI), - } - if partition.EphemeralStorage != 0 { - p.EphemeralStorage = *resource.NewQuantity(int64(partition.EphemeralStorage), resource.BinarySI) - } - if partition.Storage != 0 { - p.Storage = *resource.NewQuantity(int64(partition.Storage), resource.BinarySI) +func ParsePartitionFromObj(partition *models.Partition) *reservationv1alpha1.Partition { + return &reservationv1alpha1.Partition{ + Architecture: partition.Architecture, + Cpu: partition.Cpu, + Memory: partition.Memory, + Gpu: partition.Gpu, + Storage: partition.Storage, + EphemeralStorage: partition.EphemeralStorage, } - if partition.Gpu != 0 { - p.Gpu = *resource.NewQuantity(int64(partition.Gpu), resource.DecimalSI) - } - return p } func ParseNodeIdentity(node nodecorev1alpha1.NodeIdentity) models.NodeIdentity { @@ -116,29 +86,26 @@ func ParseNodeIdentity(node nodecorev1alpha1.NodeIdentity) models.NodeIdentity { // ParseFlavourObject creates a Flavour Object from a Flavour CR func ParseFlavour(flavour nodecorev1alpha1.Flavour) models.Flavour { - cpu, _ := flavour.Spec.Characteristics.Cpu.AsInt64() - ram, _ := flavour.Spec.Characteristics.Memory.AsInt64() - cpuMin, _ := flavour.Spec.Policy.Partitionable.CpuMin.AsInt64() - memoryMin, _ := flavour.Spec.Policy.Partitionable.MemoryMin.AsInt64() - cpuStep, _ := flavour.Spec.Policy.Partitionable.CpuStep.AsInt64() - memoryStep, _ := flavour.Spec.Policy.Partitionable.MemoryStep.AsInt64() - obj := models.Flavour{ + return models.Flavour{ FlavourID: flavour.Name, Type: string(flavour.Spec.Type), ProviderID: flavour.Spec.ProviderID, Characteristics: models.Characteristics{ - CPU: int(cpu), - Memory: int(ram), + CPU: flavour.Spec.Characteristics.Cpu, + Memory: flavour.Spec.Characteristics.Memory, + PersistentStorage: flavour.Spec.Characteristics.PersistentStorage, + EphemeralStorage: flavour.Spec.Characteristics.EphemeralStorage, + Gpu: flavour.Spec.Characteristics.Gpu, }, Owner: ParseNodeIdentity(flavour.Spec.Owner), Policy: models.Policy{ Partitionable: func() *models.Partitionable { if flavour.Spec.Policy.Partitionable != nil { return &models.Partitionable{ - CPUMinimum: int(cpuMin), - MemoryMinimum: int(memoryMin), - CPUStep: int(cpuStep), - MemoryStep: int(memoryStep), + CPUMinimum: flavour.Spec.Policy.Partitionable.CpuMin, + MemoryMinimum: flavour.Spec.Policy.Partitionable.MemoryMin, + CPUStep: flavour.Spec.Policy.Partitionable.CpuStep, + MemoryStep: flavour.Spec.Policy.Partitionable.MemoryStep, } } return nil @@ -163,19 +130,6 @@ func ParseFlavour(flavour nodecorev1alpha1.Flavour) models.Flavour { WorkerID: flavour.Spec.OptionalFields.WorkerID, }, } - if ephStorage, ok := flavour.Spec.Characteristics.EphemeralStorage.AsInt64(); ok == true && ephStorage != 0 { - obj.Characteristics.EphemeralStorage = int(ephStorage) - } - if storage, ok := flavour.Spec.Characteristics.PersistentStorage.AsInt64(); ok == true && storage != 0 { - obj.Characteristics.PersistentStorage = int(storage) - } - if gpu, ok := flavour.Spec.Characteristics.Gpu.AsInt64(); ok == true && gpu != 0 { - obj.Characteristics.GPU = int(gpu) - } - if flavour.Spec.Characteristics.Architecture != "" { - obj.Characteristics.Architecture = flavour.Spec.Characteristics.Architecture - } - return obj } // ForgeContractObject creates a Contract Object diff --git a/pkg/utils/resourceforge/forge.go b/pkg/utils/resourceforge/forge.go index cca9411..5defe30 100644 --- a/pkg/utils/resourceforge/forge.go +++ b/pkg/utils/resourceforge/forge.go @@ -17,7 +17,6 @@ package resourceforge import ( "time" - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" advertisementv1alpha1 "github.com/fluidos-project/node/apis/advertisement/v1alpha1" @@ -31,14 +30,19 @@ import ( ) // ForgeDiscovery creates a Discovery CR from a FlavourSelector and a solverID -func ForgeDiscovery(selector nodecorev1alpha1.FlavourSelector, solverID string) *advertisementv1alpha1.Discovery { +func ForgeDiscovery(selector *nodecorev1alpha1.FlavourSelector, solverID string) *advertisementv1alpha1.Discovery { return &advertisementv1alpha1.Discovery{ ObjectMeta: metav1.ObjectMeta{ Name: namings.ForgeDiscoveryName(solverID), Namespace: flags.FLUIDOS_NAMESPACE, }, Spec: advertisementv1alpha1.DiscoverySpec{ - Selector: selector, + Selector: func() *nodecorev1alpha1.FlavourSelector { + if selector != nil { + return selector + } + return nil + }(), SolverID: solverID, Subscribe: false, }, @@ -72,9 +76,9 @@ func ForgePeeringCandidate(flavourPeeringCandidate *nodecorev1alpha1.Flavour, so } // ForgeReservation creates a Reservation CR from a PeeringCandidate -func ForgeReservation(peeringCandidate advertisementv1alpha1.PeeringCandidate, partition reservationv1alpha1.Partition, ni nodecorev1alpha1.NodeIdentity) *reservationv1alpha1.Reservation { +func ForgeReservation(peeringCandidate advertisementv1alpha1.PeeringCandidate, partition *reservationv1alpha1.Partition, ni nodecorev1alpha1.NodeIdentity) *reservationv1alpha1.Reservation { solverID := peeringCandidate.Spec.SolverID - return &reservationv1alpha1.Reservation{ + reservation := &reservationv1alpha1.Reservation{ ObjectMeta: metav1.ObjectMeta{ Name: namings.ForgeReservationName(solverID), Namespace: flags.FLUIDOS_NAMESPACE, @@ -91,11 +95,14 @@ func ForgeReservation(peeringCandidate advertisementv1alpha1.PeeringCandidate, p Name: peeringCandidate.Name, Namespace: peeringCandidate.Namespace, }, - Reserve: true, - Purchase: true, - Partition: partition, + Reserve: true, + Purchase: true, }, } + if partition != nil { + reservation.Spec.Partition = partition + } + return reservation } // ForgeContract creates a Contract CR @@ -116,8 +123,13 @@ func ForgeContract(flavour nodecorev1alpha1.Flavour, transaction models.Transact Seller: flavour.Spec.Owner, SellerCredentials: *lc, TransactionID: transaction.TransactionID, - Partition: parseutil.ParsePartitionFromObj(transaction.Partition), - ExpirationTime: time.Now().Add(flags.EXPIRATION_CONTRACT).Format(time.RFC3339), + Partition: func() *reservationv1alpha1.Partition { + if transaction.Partition != nil { + return parseutil.ParsePartitionFromObj(transaction.Partition) + } + return nil + }(), + ExpirationTime: time.Now().Add(flags.EXPIRATION_CONTRACT).Format(time.RFC3339), }, Status: reservationv1alpha1.ContractStatus{ Phase: nodecorev1alpha1.PhaseStatus{ @@ -139,10 +151,12 @@ func ForgeFlavourFromMetrics(node models.NodeInfo, ni nodecorev1alpha1.NodeIdent ProviderID: ni.NodeID, Type: nodecorev1alpha1.K8S, Characteristics: nodecorev1alpha1.Characteristics{ - Architecture: node.Architecture, - Cpu: node.ResourceMetrics.CPUAvailable, - Memory: node.ResourceMetrics.MemoryAvailable, - EphemeralStorage: node.ResourceMetrics.EphemeralStorage, + Architecture: node.Architecture, + Cpu: node.ResourceMetrics.CPUAvailable, + Memory: node.ResourceMetrics.MemoryAvailable, + EphemeralStorage: node.ResourceMetrics.EphemeralStorage, + PersistentStorage: parseutil.ParseQuantityFromString("0"), + Gpu: parseutil.ParseQuantityFromString("0"), }, Policy: nodecorev1alpha1.Policy{ Partitionable: &nodecorev1alpha1.Partitionable{ @@ -197,7 +211,12 @@ func ForgeContractObj(contract *reservationv1alpha1.Contract) models.Contract { Token: contract.Spec.SellerCredentials.Token, Endpoint: contract.Spec.SellerCredentials.Endpoint, }, - Partition: parseutil.ParsePartition(contract.Spec.Partition), + Partition: func() *models.Partition { + if contract.Spec.Partition != nil { + return parseutil.ParsePartition(contract.Spec.Partition) + } + return nil + }(), TransactionID: contract.Spec.TransactionID, ExpirationTime: contract.Spec.ExpirationTime, ExtraInformation: func() map[string]string { @@ -243,8 +262,13 @@ func ForgeContractFromObj(contract models.Contract) *reservationv1alpha1.Contrac Token: contract.SellerCredentials.Token, Endpoint: contract.SellerCredentials.Endpoint, }, - TransactionID: contract.TransactionID, - Partition: parseutil.ParsePartitionFromObj(contract.Partition), + TransactionID: contract.TransactionID, + Partition: func() *reservationv1alpha1.Partition { + if contract.Partition != nil { + return parseutil.ParsePartitionFromObj(contract.Partition) + } + return nil + }(), ExpirationTime: contract.ExpirationTime, ExtraInformation: func() map[string]string { if contract.ExtraInformation != nil { @@ -278,7 +302,12 @@ func ForgeTransactionFromObj(reservation *models.Transaction) *reservationv1alph NodeID: reservation.Buyer.NodeID, }, ClusterID: reservation.ClusterID, - Partition: parseutil.ParsePartitionFromObj(reservation.Partition), + Partition: func() *reservationv1alpha1.Partition { + if reservation.Partition != nil { + return parseutil.ParsePartitionFromObj(reservation.Partition) + } + return nil + }(), }, } } @@ -294,18 +323,22 @@ func ForgeFlavourFromObj(flavour models.Flavour) *nodecorev1alpha1.Flavour { ProviderID: flavour.Owner.NodeID, Type: nodecorev1alpha1.K8S, Characteristics: nodecorev1alpha1.Characteristics{ - Cpu: *resource.NewQuantity(int64(flavour.Characteristics.CPU), resource.DecimalSI), - Memory: *resource.NewQuantity(int64(flavour.Characteristics.Memory), resource.BinarySI), + Cpu: flavour.Characteristics.CPU, + Memory: flavour.Characteristics.Memory, + Architecture: flavour.Characteristics.Architecture, + EphemeralStorage: flavour.Characteristics.EphemeralStorage, + PersistentStorage: flavour.Characteristics.PersistentStorage, + Gpu: flavour.Characteristics.Gpu, }, Policy: nodecorev1alpha1.Policy{ // Check if flavour.Partitionable is not nil before setting Partitionable Partitionable: func() *nodecorev1alpha1.Partitionable { if flavour.Policy.Partitionable != nil { return &nodecorev1alpha1.Partitionable{ - CpuMin: *resource.NewQuantity(int64(flavour.Policy.Partitionable.CPUMinimum), resource.DecimalSI), - MemoryMin: *resource.NewQuantity(int64(flavour.Policy.Partitionable.MemoryMinimum), resource.BinarySI), - CpuStep: *resource.NewQuantity(int64(flavour.Policy.Partitionable.CPUStep), resource.DecimalSI), - MemoryStep: *resource.NewQuantity(int64(flavour.Policy.Partitionable.MemoryStep), resource.BinarySI), + CpuMin: flavour.Policy.Partitionable.CPUMinimum, + MemoryMin: flavour.Policy.Partitionable.MemoryMinimum, + CpuStep: flavour.Policy.Partitionable.CPUStep, + MemoryStep: flavour.Policy.Partitionable.MemoryStep, } } return nil @@ -332,24 +365,11 @@ func ForgeFlavourFromObj(flavour models.Flavour) *nodecorev1alpha1.Flavour { }, }, } - - if flavour.Characteristics.EphemeralStorage != 0 { - f.Spec.Characteristics.EphemeralStorage = *resource.NewQuantity(int64(flavour.Characteristics.EphemeralStorage), resource.BinarySI) - } - if flavour.Characteristics.PersistentStorage != 0 { - f.Spec.Characteristics.PersistentStorage = *resource.NewQuantity(int64(flavour.Characteristics.PersistentStorage), resource.BinarySI) - } - if flavour.Characteristics.GPU != 0 { - f.Spec.Characteristics.Gpu = *resource.NewQuantity(int64(flavour.Characteristics.GPU), resource.DecimalSI) - } - if flavour.Characteristics.Architecture != "" { - f.Spec.Characteristics.Architecture = flavour.Characteristics.Architecture - } return f } -func ForgePartition(selector nodecorev1alpha1.FlavourSelector) reservationv1alpha1.Partition { - return reservationv1alpha1.Partition{ +func ForgePartition(selector *nodecorev1alpha1.FlavourSelector) *reservationv1alpha1.Partition { + return &reservationv1alpha1.Partition{ Architecture: selector.Architecture, Cpu: selector.RangeSelector.MinCpu, Memory: selector.RangeSelector.MinMemory,