{"id":22174087,"url":"https://github.com/crossplane-contrib/provider-linode","last_synced_at":"2025-07-26T15:31:51.256Z","repository":{"id":52311457,"uuid":"208835447","full_name":"crossplane-contrib/provider-linode","owner":"crossplane-contrib","description":"Demonstrative Crossplane Stack for Linode resources","archived":false,"fork":false,"pushed_at":"2023-03-13T14:12:21.000Z","size":168,"stargazers_count":3,"open_issues_count":3,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-30T22:17:19.059Z","etag":null,"topics":["crossplane","demo","devops","iac","infra-stack","kubernetes","linode","linode-api","stack"],"latest_commit_sha":null,"homepage":"https://crossplane.io/docs/v0.3/developer-guide.html#infra-stacks","language":"Go","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/crossplane-contrib.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}},"created_at":"2019-09-16T15:34:09.000Z","updated_at":"2023-03-13T14:12:28.000Z","dependencies_parsed_at":"2022-08-24T14:50:55.828Z","dependency_job_id":null,"html_url":"https://github.com/crossplane-contrib/provider-linode","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossplane-contrib%2Fprovider-linode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossplane-contrib%2Fprovider-linode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossplane-contrib%2Fprovider-linode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossplane-contrib%2Fprovider-linode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crossplane-contrib","download_url":"https://codeload.github.com/crossplane-contrib/provider-linode/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227691656,"owners_count":17805168,"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":["crossplane","demo","devops","iac","infra-stack","kubernetes","linode","linode-api","stack"],"created_at":"2024-12-02T07:37:06.191Z","updated_at":"2024-12-02T07:37:06.857Z","avatar_url":"https://github.com/crossplane-contrib.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crossplane Stack Development: Walk through with Linode\n\n### ⚠️ Deprecation notice ⚠️\nPlease use Linode's actively maintained provider here: https://github.com/linode/provider-linode\n\nWhat is a [Crossplane Stack](https://crossplane.io/docs/v0.3/concepts.html#stacks)?  It's a way to add functionality to Crossplane.\nWhat is Crossplane? If you are asking that, you should probably read [Welcome to Crossplane!](https://crossplane.io/docs/v0.3/) first.\n\nStacks can be used to teach Crossplane how to power another infrastructure\nprovider, or Stacks can configure the pieces of a Kubernetes application that\ndepends on managed cloud resources playing with your typical Kubernetes resources.\n\nAuthoring a Crossplane Stack currently involves writing a Kubernetes \nController.  The [Crossplane Slack](https://slack.crossplane.io/) [#sig-stacks](https://crossplane.slack.com/messages/CKXQK4P27) community will be looking for ways to simplify this.\n\n## From Kubebuilder 2 Controllers to Crossplane Runtime Stacks\n\nKubebuilder offers an easy way to get a Kubernetes controller project\nbootstrapped.  Like any framework, Kubebuilder has a set of features, rules,\nand opinions.\n\nAt the core of [Crossplane's own managed resources](https://github.com/crossplaneio/crossplane/tree/master/apis) and [infrastructure Stacks](https://github.com/crossplaneio?utf8=%E2%9C%93\u0026q=stack-\u0026type=\u0026language=),\nyou'll find the [Crossplane Runtime](https://github.com/crossplaneio/crossplane-runtime).  This underpinning of Crossplane offers\nan improved experience for state reconciliation.  It provides a number of hooks that\ncome in handy when creating a Stack or any managed resource controller working\nin the narrow field of cloud resource provisioning.\n\n## Pick a Stack any Stack\n\nAs a current Crossplane Stacks developer and a former Linode developer,\nI'm venturing into Crossplane Services land by taking along\nthe things that I know well enough to hack on without getting overtly stuck.\n\nCrossplane's most prominent demos to date have involved some combination of\nwrangling a herd of managed Kubernetes, managed database, managed caching,\nand managed object storage solutions. Recent developments allow network\nand user management to be roped in.\n\nThese services are common stock among GCP, AWS, and Azure.\n\nProviders like Packet and Linode don't necessarily offer all of these\nservices, which could make them seem like an awkward choice.\n\nCrossplane's portable Resource Classes and Resource Claims can't be\neasily taken advantage of.\n\nOn the other hand, the simpler array of services is easier to reason about.\nThe lack of appropriate Resource Classes give us cause to create new ones.\n\n## Enough of the why.. Let's get to the how\n\nNow that our reasons have been stated, let's start our Stack project by\ncreating a new workspace and taking full advantage of Kubebuilder's ease of use:\n\n```sh\nmkdir stack-linode\ncd stack-linode\ngit init\n\nkubebuilder init --domain stack.crossplane.io \\\n  --owner \"The Crossplane Authors\" \\\n  --repo github.com/displague/stack-linode\n```\n\nThe piece that is not quite obvious here is the `domain`.  This will serve as the\nbase for the FQDN used in our API groups.\n\nNow let's create an API group for Linode and introduce some `kind` types.\n\n```sh\nkubebuilder create api --group=\"linode\" --version v1alpha1 \\\n  --kind Provider --resource=true --controller=false\n```\n\nThe [Provider kinds](https://crossplane.io/docs/v0.3/services-developer-guide.html#provider-kinds) will\nact as our configuration of Linode API settings.  You can have multiple `Provider` records, each\nusing a different API Token or a different account.  Some Provider records may allow you to change\nthe Project or Region.  This is top level configuration for the resource provider.\n\nAs a bag of configuration, `Provider` kinds don't need a controller.  They are not active. Crossplane Managed controllers are the actor.  They will find references to the `Provider` and they will read its settings in order to create managed resources.\n\nIn Crossplane, the typical API group and kind for Provider kinds is `provider.foo.crossplane.io`, where `foo` is the name of the Stack. In this project we have gone against convention and will have `provider.foo.stack.crossplane.io`.  \n\nSimilarly, Crossplane [Managed Resource kinds](https://crossplane.io/docs/v0.3/services-developer-guide.html#managed-resource-kinds) are typically `bar.compute.foo.crossplane.io`, where `bar` is the name of the external resource (`instance`, `mysql`, `gkecluster`).  Crossplane's convention for resource classes uses a common group prefix for related resource classes (`compute`, `database`, `cache`, `storage`).\n\nI'm pointing these conventions out because we are breaking them all by using the API groups that Kubebuilder generates, and that's just fine.  These are just naming conventions and nothing in Crossplane cares about them.  We'll just need to make sure that we don't trip over the differing API groups ourselves.\n\nThis is all explained in the \"[What Makes a Crossplane Managed Service?](https://crossplane.io/docs/v0.3/services-developer-guide.html#what-makes-a-crossplane-managed-service)\" section of the [Services Developer Guide](https://crossplane.io/docs/v0.3/services-developer-guide.html).\n\n```sh\nkubebuilder create api --group=\"linode\" --version v1alpha1 \\\n  --kind Instance --resource=true --controller=false\n```\n\nWe are leaving out the Kubebuilder generated controller because Crossplane Runtime\ntakes a different approach with [managed resource controllers](https://crossplane.io/docs/v0.3/services-developer-guide.html#managed-resource-controllers).\n\nLinode Instances will need a controller. We will follow the steps outlined in the\n managed resource controllers section of the Service Developers Guide.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossplane-contrib%2Fprovider-linode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossplane-contrib%2Fprovider-linode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossplane-contrib%2Fprovider-linode/lists"}