{"id":13618607,"url":"https://github.com/scaleoutsean/solidfire-operator","last_synced_at":"2026-04-05T00:26:33.509Z","repository":{"id":113018150,"uuid":"486450881","full_name":"scaleoutsean/solidfire-operator","owner":"scaleoutsean","description":"Ansible-based Kubernetes operator for SolidFire","archived":false,"fork":false,"pushed_at":"2022-04-28T05:05:51.000Z","size":30,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-08T04:38:21.877Z","etag":null,"topics":["kubernetes","operator","solidfire"],"latest_commit_sha":null,"homepage":"","language":"Makefile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scaleoutsean.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2022-04-28T04:54:30.000Z","updated_at":"2022-05-01T09:31:06.000Z","dependencies_parsed_at":"2023-06-05T15:30:25.515Z","dependency_job_id":null,"html_url":"https://github.com/scaleoutsean/solidfire-operator","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scaleoutsean%2Fsolidfire-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scaleoutsean%2Fsolidfire-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scaleoutsean%2Fsolidfire-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scaleoutsean%2Fsolidfire-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scaleoutsean","download_url":"https://codeload.github.com/scaleoutsean/solidfire-operator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248888608,"owners_count":21178088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kubernetes","operator","solidfire"],"created_at":"2024-08-01T21:00:27.275Z","updated_at":"2026-04-05T00:26:33.474Z","avatar_url":"https://github.com/scaleoutsean.png","language":"Makefile","funding_links":[],"categories":["Resources and Solutions"],"sub_categories":["Kubernetes and Containers"],"readme":"# SolidFire Operator\n\n**WARNING: This project is experimental - do not deploy to production clusters**\n\n- [SolidFire Operator](#solidfire-operator)\n  - [What is this](#what-is-this)\n  - [Install Solidfire Operator](#install-solidfire-operator)\n  - [Use it](#use-it)\n  - [Lose it](#lose-it)\n  - [Develop](#develop)\n    - [Use another language or operator framework](#use-another-language-or-operator-framework)\n  - [FAQs](#faqs)\n  - [Acknowledgements](#acknowledgements)\n  - [Example](#example)\n\n## What is this\n\nThis repository and related Docker Hub images aim to provide a working example for building and using a SolidFire Operator for Kubernetes.\n\nThe first release covers basic operations on [the SolidFire QoS Policy object](https://docs.netapp.com/us-en/element-software/api/reference_element_api_qos.html) and can be easily expanded.\n\n## Install Solidfire Operator\n\nOn a UNIXy system with access to your Kubernetes cluster, pick a SolidFire Operator version (e.g. 0.0.4), clone this repository and deploy.\n\n```sh\ngit clone https://github.com/scaleoutsean/solidfire-operator\ncd solidfire-operator\nmake deploy VERSION=$VERSION\n```\n\nOperator container will be downloaded from [https://hub.docker.com/r/scaleoutsean/solidfire-operator](https://hub.docker.com/r/scaleoutsean/solidfire-operator), but you can build your own and use it instead.\n\nIf deployment has been successful, we should be able to see a deployment and pods.\n\n```\n$ kubectl get deployments -n solidfire-operator-system\nNAME                                    READY   UP-TO-DATE   AVAILABLE   AGE\nsolidfire-operator-controller-manager   1/1     1            1           8m32s\n\n$ kubectl get pods -n solidfire-operator-system\nNAME                                                    READY   STATUS    RESTARTS   AGE\nsolidfire-operator-controller-manager-85964766c-ncll2   2/2     Running   0          8m1s\n```\n\n## Use it\n\n**WARNING:** CRD-related crap can be difficult to remove, especially if `kubectl delete` gets stuck, blocking removal of the operator, so think twice before you try this on a production cluster.\n\nEdit the YAML sample file from `config/samples` and give it a try.\n\n**WARNING:** solidfire-operator v0.0.4 does not (yet) store SolidFire cluster administrator password in Kubernetes secrets. If you hard-code that password in YAML, make sure the file cannot be accessed by other users.\n\n```sh\nvim config/samples/solidfire_v1alpha1_qospolicy.yaml\nkubectl apply -f solidfire-operator/config/samples/solidfire_v1alpha1_qospolicy.yaml\n```\n\nIn order to avoid getting stuck, make sure `kubectl delete -f` completes successfully. It usually takes 10-20 seconds because reconciliation happens periodically.\n\n## Lose it\n\nFrom the cloned repository folder, run `make` with undeploy and uninstall commands:\n\n```\nmake uninstall\nmake undeploy\n```\n\nIf any of these hangs, maybe you have some pending operation that's stuck (\"Warning: Detected changes to resource something-something which is currently being deleted.\"). This may happen if you interrupt a delete resource command, for example. Usually re-runing the commands twice helps.\n\n## Develop\n\nIf you don't have a SolidFire cluster, get the SoliFire Demo VM from NetApp Support site (Tools section; registration required).\n\nClone the repo, and RTFM to see what's what:\n\n- [Operator Framework](https://operatorframework.io)\n- [Ansible Collection for SolidFire](https://galaxy.ansible.com/netapp/elementsw)\n\nYou need to check the Ansible-related documentation of Operator Framework and get the right kubectl for your environment. I used it v1.23.6, but that's not so important for SolidFire - this operator only depends on Python, Ansible and SolidFire Collection for Ansible, all of which are defined in Dockerfile. kubectl can be any supported and this operator framework supports Kubernetes on ARM64 (Trident CSI v22.01 doesn't support ARM64, but [can be made to run](/2021/02/24/netapp-trident-on-arm64.html) on it).\n\n### Use another language or operator framework\n\nIf you know Go I would suggest using own code (see [Terraform Provider for SolidFire](https://github.com/NetApp/terraform-provider-netapp-elementsw/) for examples of using Go with \"raw\" SolidFire API). .NET developers may want to check [other approaches](https://github.com/buehler/dotnet-operator-sdk) where [SolidFire .NET SDK](https://solidfire.github.io/sdk-dotnet/) could be used to eliminate writing boilerplate code.\n\nIn other words, you don't have to use Ansible and you don't have to use this Operator Framework either - there's half a dozen of them out there - to build your own SolidFire operator.\n\n## FAQs\n\n**Q:** What does creating a QoS policy on a SolidFire cluster used by Kubernetes do?\n\nA: Nothing, and that's the point. NetApp Trident CSI is not aware of of changes made to PV settings by bypassing Trident (and in the case of QoS Policy that's what would happen). So this initial example does nothing on purpose.\n\n**Q:** If I can't use a SolidFire Operator to make any changes, what's the point?\n\nA: The point is there are areas of SolidFire configuration that Trident is not aware of. Those are safe and even desirable to operate on, as long as we know what we're doing.\n\n**Q:** Ideas?\n\nA: Set up SolidFire replication and perform SolidFire storage cluster failover.\n\n**Q:** What if I don't use Trident CSI?\n\nA: You can use an operator even if you use Host Path volumes. Or if you use Cinder CSI with SolidFire. Or if you have the strange desire to manage SolidFire from Kubernetes while not using Kubernetes for your workloads, which paradoxically makes sense because your Master Node(s) with etcd on local disks would ensure your management application runs even when storage fails over or goes down.\n\n## Acknowledgements\n\nThanks to @vrd83 for the inspiration to give this idea a try.\n\n## Example\n\nThis is an example of an edited config/samples/solidfire_v1alpha1_qospolicy.yaml with the password string replaced by asterisks. `status: present` is on by default so there's no need to have it in there in order to create (or delete) a SolidFire QoS Policy. \n\n(The FQDN in apiVersion value is arbitrary; solidfire-operator doesn't \"ping\" the FQDN or send any info. Check Operator Framework's Privacy Policy to see if they do any data collection.)\n\n```yaml\napiVersion: solidfire.datafabric.club/v1alpha1\nkind: QosPolicy\nmetadata:\n  name: qospolicy-sample\nspec:\n  hostname: \"192.168.1.30\"\n  username: \"admin\"\n  password: \"*****\"\n  name: \"sample\"\n  qos:\n    min: 111\n    max: 222\n    burst: 333\n```\n\nWith the edited QoS Policy sample file:\n\n```sh\n$ kubectl create -f config/samples/solidfire_v1alpha1_qospolicy.yaml \nqospolicy.solidfire.datafabric.club/qospolicy-sample created\n\n$ kubectl get qospolicy.solidfire.datafabric.club\nNAME               AGE\nqospolicy-sample   1s\n\n$ kubectl describe qospolicy.solidfire.datafabric.club qospolicy-sample\nName:         qospolicy-sample\nNamespace:    default\nLabels:       \u003cnone\u003e\nAnnotations:  \u003cnone\u003e\nAPI Version:  solidfire.datafabric.club/v1alpha1\nKind:         QosPolicy\nMetadata:\n  Creation Timestamp:  2022-04-27T10:57:43Z\n  Finalizers:\n    solidfire.datafabric.club/finalizer\n  Generation:  1\n  Managed Fields:\n    API Version:  solidfire.datafabric.club/v1alpha1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:metadata:\n        f:finalizers:\n          .:\n          v:\"solidfire.datafabric.club/finalizer\":\n    Manager:      ansible-operator\n    Operation:    Update\n    Time:         2022-04-27T10:57:43Z\n    API Version:  solidfire.datafabric.club/v1alpha1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:status:\n        .:\n        f:conditions:\n    Manager:      ansible-operator\n    Operation:    Update\n    Subresource:  status\n    Time:         2022-04-27T10:57:43Z\n    API Version:  solidfire.datafabric.club/v1alpha1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:spec:\n        .:\n        f:hostname:\n        f:name:\n        f:password:\n        f:qos:\n          .:\n          f:burst:\n          f:max:\n          f:min:\n        f:username:\n    Manager:         kubectl-create\n    Operation:       Update\n    Time:            2022-04-27T10:57:43Z\n  Resource Version:  1719310\n  UID:               478440b9-87cf-4e87-b707-94e24b3da803\nSpec:\n  Hostname:  192.168.1.30\n  Name:      sample\n  Password:  admin\n  Qos:\n    Burst:   333\n    Max:     222\n    Min:     111\n  Username:  admin\nStatus:\n  Conditions:\n    Last Transition Time:  2022-04-27T10:57:48Z\n    Message:               \n    Reason:                \n    Status:                False\n    Type:                  Failure\n    Ansible Result:\n      Changed:             0\n      Completion:          2022-04-28T02:49:11.7511\n      Failures:            0\n      Ok:                  2\n      Skipped:             0\n    Last Transition Time:  2022-04-27T10:57:43Z\n    Message:               Awaiting next reconciliation\n    Reason:                Successful\n    Status:                True\n    Type:                  Running\n    Last Transition Time:  2022-04-28T02:49:11Z\n    Message:               Last reconciliation succeeded\n    Reason:                Successful\n    Status:                True\n    Type:                  Successful\nEvents:                    \u003cnone\u003e\n\n$ kubectl delete -f config/samples/solidfire_v1alpha1_qospolicy.yaml \n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscaleoutsean%2Fsolidfire-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscaleoutsean%2Fsolidfire-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscaleoutsean%2Fsolidfire-operator/lists"}