├── CONTRIBUTING.md ├── LICENSE ├── OpenCP logo guidelines.pdf ├── README.md ├── config.md ├── enhancement-proposals ├── 0000-opencp-enhancement-proposal-template.md └── README.md ├── images ├── Brandmark │ ├── AI │ │ ├── OpenCP-Brandmark-Black.ai │ │ ├── OpenCP-Brandmark-Colour.ai │ │ └── OpenCP-Brandmark-White.ai │ ├── JPG │ │ ├── OpenCP-Brandmark-Black.jpg │ │ ├── OpenCP-Brandmark-Colour.jpg │ │ └── OpenCP-Brandmark-White.jpg │ ├── PNG │ │ ├── OpenCP-Brandmark-Black.png │ │ ├── OpenCP-Brandmark-Colour.png │ │ └── OpenCP-Brandmark-White.png │ └── SVG │ │ ├── OpenCP-Brandmark-Black.svg │ │ ├── OpenCP-Brandmark-Colour.svg │ │ └── OpenCP-Brandmark-White.svg ├── Logo │ ├── .DS_Store │ ├── AI │ │ ├── OpenCP-Logo-Black.ai │ │ ├── OpenCP-Logo-Colour.ai │ │ └── OpenCP-Logo-White.ai │ ├── JPG │ │ ├── OpenCP-Logo-Black.jpg │ │ ├── OpenCP-Logo-Colour.jpg │ │ └── OpenCP-Logo-White.jpg │ ├── PNG │ │ ├── OpenCP-Logo-Black.png │ │ ├── OpenCP-Logo-Colour.png │ │ └── OpenCP-Logo-White.png │ └── SVG │ │ ├── OpenCP-Logo-Black.svg │ │ ├── OpenCP-Logo-Colour.svg │ │ └── OpenCP-Logo-White.svg ├── OpenCP-Logo-Default.ai └── OpenCP-Logo-Default.svg ├── style-guide.md └── supported-objects.md /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to OpenCP 2 | 3 | Thank you for your interest in contributing to OpenCP! 4 | 5 | Here are a few guidelines to help you get started. 6 | 7 | ### Issues 8 | 9 | If you find a bug, please create an issue in the issue tracker of OpenCP project component that the bug affects. Before creating a new issue, please check if a similar issue already exists. 10 | 11 | ### Feature requests 12 | 13 | OpenCP follows the [Kubernetes Enhancement Proposal (KEP) model](https://github.com/kubernetes/enhancements/tree/master/keps) for new feature/enhancement discussion and development. If you have an idea for a new feature for OpenCP, please submit a new enhancement proposal based on the [OpenCP KEP template](./enhancement-proposals/). 14 | 15 | ### Pull Requests 16 | 17 | We accept contributions in the form of pull requests. If you're fixing a bug, please provide a clear and concise description of the problem and the solution you're proposing. 18 | 19 | Here's how to create a pull request: 20 | 21 | 1. Fork the repository. 22 | 2. Clone your fork to your local machine. 23 | 3. Create a new branch for your changes. 24 | 4. Make your changes and push the branch to your fork. 25 | 5. Open a pull request on the original repository. 26 | 27 | We'll review your changes and may request revisions. Once the changes are approved, we'll merge them into the main branch. 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /OpenCP logo guidelines.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/OpenCP logo guidelines.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![OpenCP logo Light mode](https://user-images.githubusercontent.com/8190114/216351384-35b70b2a-6111-4c46-9ee9-ba5429852240.png#gh-light-mode-only) 2 | ![OpenCP logo Dark mode](https://user-images.githubusercontent.com/8190114/216352093-ff120b05-4943-48f4-98d9-f6ab29cf9d0c.png#gh-dark-mode-only) 3 | 4 | ## Introduction 5 | 6 | OpenCP (Open Control Plane) is an open source project originally developed by [Civo](www.civo.com) to create a single interface to manage infrastructure using a single tool, kubectl. 7 | 8 | ### Goals 9 | 10 | - Unified interface between cloud providers 11 | - API End points to be hosted by providers, not users (Interim solution could allow users to self host, but this is not what we really want) 12 | - Ability to manage resources outside of traditional cloud infra, e.g. Domain Name registrations 13 | - Create a unified dev / DevOps experience through `kubectl` only 14 | 15 | ### Out of Scope: 16 | 17 | - Replacement for GitOps tools such as Crossplane / ArgoCD / Flux. Continuous watching and reconciliation of resources it not part of this project. However, these tools would interact with Cloud Providers using an OpenCP compatible interface 18 | 19 | ### Why OpenCP? 20 | 21 | Increasingly, developers face having to learn and update multiple command-line tools on their machines to manage cloud infrastructure, each with their own learning curve and feature set. 22 | 23 | Vendors maintaining separate tools need to manage multiple objects (CLI, API versioning, operating system dependencies, etc) for any updates they roll out to their services. Bugfixes across the various cloud service tools can often be difficult to manage across operating systems and platforms, especially with multiple versions of those tools being used by developers concurrently. 24 | 25 | OpenCP does away with software update requirements, as resources are entirely API-driven. It is also operating system-agnostic, making use of the existing kubectl binary with nothing else to install or maintain for a user. A cloud provider can maintain OpenCP endpoints alongside their API that map to any resources provided by them. New features can be introduced by new endpoints, or updated specs of existing endpoints in a manner similar to Kubernetes API versioning. 26 | 27 | [Kubectl](https://kubernetes.io/docs/reference/kubectl/) is the standard tool for managing Kubernetes resources. It is available for all common operating systems and robustly documented. OpenCP's kubectl compatibility means developers' daily drivers such as [K9s](https://github.com/derailed/k9s) and [Lens](https://github.com/lensapp/lens) are able to be used to manage resources on OpenCP too. As OpenCP objects are managed the same way as any Kubernetes objects, it fits in well with a cloud engineer's workflow. 28 | 29 | OpenCP complements existing Infrastructure as Code tools, without needing a separate Kubernetes cluster or other infrastructure to act as the management plane. 30 | 31 | OpenCP is useful for platform teams and developers who manage infrastructure with the intention of providing a unified interface through a Kubernetes API Server-like set of endpoints. 32 | 33 | In summary, some of the benefits for using OpenCP over other tools are: 34 | 35 | - Uses existing kubectl binary, nothing more to install or set up 36 | - Single tool to manage all infrastructure components across cloud/service providers 37 | - No longer necessary to install multiple CLIs from different cloud/service providers 38 | - No software updates required - all API driven 39 | - No separate management plane or cluster required 40 | 41 | ## Video: OpenCP Introduction 42 | 43 | Watch Civo CTO Dinesh Majrekar speaking about OpenCP on the CNCF TAG App Delivery call: 44 | 45 | [![Civo CTO Dinesh Majrekar speaking on the CNCF TAG App Delivery call on 14 February 2023](http://i3.ytimg.com/vi/iuP7b22STqg/hqdefault.jpg)](https://youtu.be/iuP7b22STqg?t=2264) 46 | 47 | ## Try OpenCP today 48 | 49 | You can test OpenCP out today on Civo by using the [Civo OpenCP Implementation](https://www.github.com/opencontrolplane/civo-opencontrolplane) with your [Civo account](https://www.civo.com/): 50 | 51 | ### Configuration file 52 | 53 | You will find a sample configuration file at [config.md](./config.md). The file contains a KUBECONFIG context that you can edit to include your Civo [API key](https://www.civo.com/docs/account/api-keys). 54 | 55 | Once edited, set the KUBECONFIG environment variable to the path to the configuration file. You will then be able to access the Civo API using kubectl commands. 56 | 57 | ### Specifying a Kubernetes cluster configuration 58 | 59 | Referring to the [supported objects](./supported-objects.md), you can create a cluster definition file, `demo-cluster.yaml`. For example: 60 | 61 | ```bash 62 | apiVersion: opencp.io/v1alpha1 63 | kind: KubernetesCluster 64 | metadata: 65 | name: demo-cluster 66 | namespace: Default 67 | spec: 68 | pools: 69 | - size: g4s.kube.medium 70 | count: 3 71 | version: 1.24.4-k3s1 72 | cni_plugin: flannel 73 | cluster_type: k3s 74 | ``` 75 | 76 | ### Create cloud provider objects using OpenCP 77 | 78 | You can create a cluster using the definition file you edited by applying it to OpenCP the same way as you would apply any Kubernetes object configuration: 79 | 80 | ```bash 81 | $ kubectl apply -f demo-cluster.yaml 82 | kubernetescluster.opencp.io/demo-cluster created 83 | ``` 84 | 85 | ### View resources in a cloud provider region using OpenCP 86 | 87 | Resources are available to inspect by type and namespace, where specified as namespaced in the [supported objects](./supported-objects.md). You can list Kubernetes clusters in the current region and all namespaces using the following syntax: 88 | 89 | ```bash 90 | $ kubectl get kubernetesclusters -n A 91 | 92 | NAME UID POOLS PUBLIC IP STATE AGE 93 | demo-cluster adafb156-1015-4477-ac6e-8ab67682ad1e 1 74.220.23.185 ACTIVE 1m 94 | ``` 95 | 96 | The specification of resources can be described using `kubectl describe`: 97 | 98 | ```bash 99 | $ kubectl describe kubernetescluster demo-cluster -n Default 100 | 101 | Name: demo-cluster 102 | Namespace: Default 103 | Labels: 104 | Annotations: 105 | API Version: opencp.io/v1alpha1 106 | Kind: KubernetesCluster 107 | Metadata: 108 | Creation Timestamp: 2023-02-16T04:39:56Z 109 | UID: adafb156-1015-4477-ac6e-8ab67682ad1e 110 | Spec: 111 | cluster_type: k3s 112 | cni_plugin: flannel 113 | [...] 114 | ``` 115 | 116 | ### Delete resources 117 | 118 | Deleting a resource you have created using an OpenCP manifest is syntactically the same as deleting an object in Kubernetes: 119 | 120 | ```bash 121 | $ kubectl delete -f demo-cluster.yaml 122 | 123 | kubernetescluster.opencp.io "demo-cluster" deleted 124 | ``` 125 | 126 | ## Project Structure 127 | 128 | This project has 3 components: 129 | 130 | ### [opencp-spec](https://github.com/opencontrolplane/opencp-spec) 131 | 132 | `opencp-spec` is in charge of keeping the API in go and the client and server generated using `protobuf` files, which will then be used by `opencp-shim` and the provider implementation. 133 | 134 | ### [opencp-shim](https://github.com/opencontrolplane/opencp-shim) 135 | 136 | `opencp-shim` is in charge of interfacing `kubectl` with the provider implementation. This project uses `opencp-spec` to import the `kubectl` compatible go API and create the `gRCP` client, which in turn connects to the server created by the cloud provider. The shim has taken inspiration from the Kubernetes CSI and CCM implementations, which allow for pluggable and extensible code. 137 | 138 | ### Provider Implementation 139 | 140 | The provider's implementation imports `opencp-spec` to create the gRCP server, and at the same time communicates with the provider's API to fetch the objects and convert them to `protobuf` objects. 141 | 142 | ## Open Control Plane Flow 143 | 144 | An example OpenCP request flow from a user to a cloud provider to request a list of running clusters. 145 | 146 | ```mermaid 147 | sequenceDiagram 148 | participant Kubectl 149 | participant Opencp Shim 150 | participant Cloud Implementation 151 | participant CloudApi 152 | Kubectl->>Opencp Shim: kubectl get kubernetescluster -A (REST call) 153 | Opencp Shim->>Cloud Implementation: gRCP call 154 | Cloud Implementation->>CloudApi: Get all Kubernetes clusters (REST call) 155 | CloudApi->>Cloud Implementation: Return the result 156 | Cloud Implementation->>Opencp Shim: gRCP response 157 | Opencp Shim->>Kubectl: Respond in the right format 158 | 159 | ``` 160 | 161 | ## Supported Objects 162 | 163 | OpenCP supports a number of infrastructure objects. These are detailed in [supported-objects.md](supported-objects.md) 164 | 165 | ## Contributing 166 | 167 | We welcome and appreciate any contributions to OpenCP. 168 | 169 | We especially welcome: 170 | 171 | - Feedback on the project as a whole from the perspective of a user, 172 | - Contact and encouragement of vendors and cloud providers to implement OpenCP, 173 | - Provider implementations, 174 | - Input and comment on specs, 175 | - Suggestions in the form of [Enhancement Proposals](./enhancement-proposals/README.md) 176 | 177 | For more information on contributing, please see [contributing.md](CONTRIBUTING.md) 178 | 179 | ## Style Guide 180 | 181 | For more information on logos, brand marks, and correct styling of referring to OpenCP, please see [style-guide.md](style-guide.md). 182 | 183 | ## Maintainers 184 | 185 | - [Alejandro J. Nunez Madrazo](https://github.com/alejandrojnm) ([Civo](https://www.civo.com)) 186 | - [Saiyam Pathak](https://github.com/saiyam1814) ([Civo](https://www.civo.com)) 187 | - [Mark Boost](https://github.com/markboost) ([Civo](https://www.civo.com)) 188 | - [Dinesh Majrekar](https://github.com/DMajrekar) ([Civo](https://www.civo.com)) 189 | -------------------------------------------------------------------------------- /config.md: -------------------------------------------------------------------------------- 1 | # Kubeconfig 2 | 3 | This is an example of the `kubeconfig` to use with OpenCP. The configuration is set to communicate with Civo's `LON1` region. To access resources in your account for that region, you would need to replace `` with your provider token / API key, found on your Civo account profile. 4 | 5 | ```yaml 6 | apiVersion: v1 7 | clusters: 8 | - cluster: 9 | server: https://opencp.lon1.civo.com 10 | name: kubernetes 11 | contexts: 12 | - context: 13 | cluster: kubernetes 14 | user: admin 15 | name: opencp-lon 16 | current-context: opencp-lon 17 | kind: Config 18 | preferences: {} 19 | users: 20 | - name: admin 21 | user: 22 | token: 23 | ``` 24 | 25 | -------------------------------------------------------------------------------- /enhancement-proposals/0000-opencp-enhancement-proposal-template.md: -------------------------------------------------------------------------------- 1 | # Open Control Plane Enhancement Proposal Template 2 | 3 | ## How to raise a proposal 4 | 5 | This proposal template document is structured to allow for discussion of the proposed enhancement to OpenCP. 6 | 7 | To propose a new enhancement: 8 | 9 | 1. Edit a copy of this file to remove this front matter (until *Enhancement Proposal Title*) and fill in the appropriate fields, titles and design information. 10 | 11 | 2. Start an issue in the [Open Control Plane (Documentation) repository](https://github.com/opencontrolplane/documentation/issues) with a title in the form of "Enhancement Proposal _Your Title_". 12 | 13 | 3. Save the proposal template copy with the generated issue number and feature title, e.g. "1234-new-provider-API-fields.md". 14 | 15 | 4. Raise a Pull Request to the [Open Control Plane (Documentation) repository](https://github.com/opencontrolplane/documentation) with your proposal file. 16 | 17 | 5. Edit the issue you created in step 2 to include a link to the pull request to allow reviewers to have a look. 18 | 19 | --- 20 | 21 | # Descriptive Enhancement Proposal Title 22 | 23 | | **Feature Issue** | **Link to the issue created** | 24 | | ----------------- | ------------- | 25 | | **Status** | Draft | 26 | | **Decision** | **Pending** | 27 | | **Author** | (your details) | 28 | | **Branch name** | feature/title | 29 | 30 | > High level description of the problem being solved or proposed feature, and any known high-level requirements for its solution. Referencing previous enhancement proposals in links is encouraged. 31 | 32 | ## Enhancement description 33 | 34 | > Add a detailed description of the feature requirements or enhacements being proposed 35 | 36 | ## User stories (optional, but encouraged) 37 | 38 | > Given ... 39 | > When ... 40 | > Then ... 41 | 42 | > As a ... 43 | > When ... 44 | > I ... 45 | 46 | ## Design requirements 47 | 48 | ### Wireframes 49 | 50 | > Insert images of any wireframes here 51 | 52 | ### Sequence diagrams 53 | 54 | > Insert Mermaid diagrams for any sequences here 55 | 56 | ## Solutions considered 57 | 58 | > List out each solution considered, upsides, downsides and links to relevant further reading 59 | 60 | ## Plan for roll-out of the enhancement 61 | 62 | > E.g. Does the proposed enhancement require significant changes to a common specification? 63 | 64 | ## Security Implications 65 | 66 | > Consider the impact to user, implementation or provider security with this feature. 67 | 68 | ## Discussion 69 | 70 | > Start with any relevant comments or discussion that arose elsewhere that is of relevance for this proposal. E.g. from the feature issue linked in the top or other enhancement proposals linked in the introduction. 71 | -------------------------------------------------------------------------------- /enhancement-proposals/README.md: -------------------------------------------------------------------------------- 1 | # OpenCP Enhancement Proposals 2 | 3 | ## Introduction 4 | 5 | The OpenCP Enhancement Proposal process takes inspiration from the [Kubernetes Enhancement Proposal (KEP)](https://github.com/kubernetes/enhancements/tree/master/keps). As with KEPs, the intention is to: 6 | 7 | - Provide a common structure for proposing changes to OpenCP 8 | - Ensure that the change is discussed in a consistent and equitable manner 9 | - Allow for the creation of a roadmap and medium to long-term project goals based on enhancement proposals 10 | - Keep GitHub issues manageable and discussion within the enhancement proposal where appropriate 11 | 12 | ## What type of enhancements should be discussed through this mechanism? 13 | 14 | Once again broadly in line with KEPs, the type of work to be discussed in an enhancement proposal should include anything that impacts an OpenCP user or provider. In terms of the complexity of the proposal: 15 | 16 | > If an enhancement would be described in either written or verbal communication to anyone besides the author or developer, then consider creating a proposal. 17 | 18 | However, deeper architectural changes that may not have any inmpact on users' experience with OpenCP may well warrant an enhancement proposal as well, as the archived proposal and discussion can be used as a refernece point for why a decision was made. 19 | 20 | ## OpenCP Enhancement Proposal template 21 | 22 | You can find a [template an Enhancement Proposal here](./0000-opencp-enhancement-proposal-template.md). The template also includes instructions on how to submit the proposal. 23 | 24 | ## Comments and improvements to the Enhancement Proposal process 25 | 26 | We welcome discussion and improvement suggestions to the OpenCP enhancement proposal workflow and structure. As currently written, it is based on the KEP process along with new feature discussion (RFC) internal to Civo. 27 | 28 | If you have a suggestion for such an improvement, please raise a new Enhancement Proposal by making a copy of the Template document and raising a Pull Request in the Open Control Plane (Documentation) repository. -------------------------------------------------------------------------------- /images/Brandmark/AI/OpenCP-Brandmark-Black.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/AI/OpenCP-Brandmark-Black.ai -------------------------------------------------------------------------------- /images/Brandmark/AI/OpenCP-Brandmark-Colour.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/AI/OpenCP-Brandmark-Colour.ai -------------------------------------------------------------------------------- /images/Brandmark/AI/OpenCP-Brandmark-White.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/AI/OpenCP-Brandmark-White.ai -------------------------------------------------------------------------------- /images/Brandmark/JPG/OpenCP-Brandmark-Black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/JPG/OpenCP-Brandmark-Black.jpg -------------------------------------------------------------------------------- /images/Brandmark/JPG/OpenCP-Brandmark-Colour.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/JPG/OpenCP-Brandmark-Colour.jpg -------------------------------------------------------------------------------- /images/Brandmark/JPG/OpenCP-Brandmark-White.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/JPG/OpenCP-Brandmark-White.jpg -------------------------------------------------------------------------------- /images/Brandmark/PNG/OpenCP-Brandmark-Black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/PNG/OpenCP-Brandmark-Black.png -------------------------------------------------------------------------------- /images/Brandmark/PNG/OpenCP-Brandmark-Colour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/PNG/OpenCP-Brandmark-Colour.png -------------------------------------------------------------------------------- /images/Brandmark/PNG/OpenCP-Brandmark-White.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Brandmark/PNG/OpenCP-Brandmark-White.png -------------------------------------------------------------------------------- /images/Brandmark/SVG/OpenCP-Brandmark-Black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/Brandmark/SVG/OpenCP-Brandmark-Colour.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /images/Brandmark/SVG/OpenCP-Brandmark-White.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/Logo/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/.DS_Store -------------------------------------------------------------------------------- /images/Logo/AI/OpenCP-Logo-Black.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/AI/OpenCP-Logo-Black.ai -------------------------------------------------------------------------------- /images/Logo/AI/OpenCP-Logo-Colour.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/AI/OpenCP-Logo-Colour.ai -------------------------------------------------------------------------------- /images/Logo/AI/OpenCP-Logo-White.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/AI/OpenCP-Logo-White.ai -------------------------------------------------------------------------------- /images/Logo/JPG/OpenCP-Logo-Black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/JPG/OpenCP-Logo-Black.jpg -------------------------------------------------------------------------------- /images/Logo/JPG/OpenCP-Logo-Colour.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/JPG/OpenCP-Logo-Colour.jpg -------------------------------------------------------------------------------- /images/Logo/JPG/OpenCP-Logo-White.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/JPG/OpenCP-Logo-White.jpg -------------------------------------------------------------------------------- /images/Logo/PNG/OpenCP-Logo-Black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/PNG/OpenCP-Logo-Black.png -------------------------------------------------------------------------------- /images/Logo/PNG/OpenCP-Logo-Colour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/PNG/OpenCP-Logo-Colour.png -------------------------------------------------------------------------------- /images/Logo/PNG/OpenCP-Logo-White.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/Logo/PNG/OpenCP-Logo-White.png -------------------------------------------------------------------------------- /images/Logo/SVG/OpenCP-Logo-Black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /images/Logo/SVG/OpenCP-Logo-Colour.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /images/Logo/SVG/OpenCP-Logo-White.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /images/OpenCP-Logo-Default.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencontrolplane/documentation/2a43e76af81471c359591d41146cfea1183f2baa/images/OpenCP-Logo-Default.ai -------------------------------------------------------------------------------- /images/OpenCP-Logo-Default.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /style-guide.md: -------------------------------------------------------------------------------- 1 | # OpenCP Style Guide 2 | 3 | ## Project Name 4 | 5 | The name of the project is *OpenCP*. 6 | 7 | OpenCP stands for Open Control Plane, but it is referred to under the short form `OpenCP`. Where capitalization of the characters as above is not possible, the form `opencp` is acceptable instead. 8 | 9 | Referring to OpenCP with CamelCase ("OpenControlPlane") is incorrect. 10 | 11 | ## Filename and repository name styling 12 | 13 | Repositories and files related to OpenCP are recommended to be set up in the form `opencp-` where the project name describes the component being implemented. 14 | 15 | ## Logo and Brandmark usage 16 | 17 | Please refer to the [OpenCP logo guidelines](./OpenCP%20logo%20guidelines.pdf) document for more information on using the logos and brandmarks referred to below and found in the [images](./images/) directory. 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
PrimaryBrandmark
PNGSVGPNGSVG
Full colour
Black
White
54 | -------------------------------------------------------------------------------- /supported-objects.md: -------------------------------------------------------------------------------- 1 | # OpenCP Supported Objects 2 | 3 | The following objects and OpenCP API endpoints are supported: 4 | 5 | ```bash 6 | # kubectl api-resources 7 | NAME SHORTNAMES APIVERSION NAMESPACED KIND 8 | namespaces ns v1 false Namespace 9 | databases db,dbass opencp.io/v1alpha1 true Database 10 | domains dns,domains opencp.io/v1alpha1 false Domain 11 | firewalls fw,firewalls opencp.io/v1alpha1 true Firewall 12 | ips ip opencp.io/v1alpha1 false IP 13 | kubernetesclusters kcluster,kclusters opencp.io/v1alpha1 true KubernetesCluster 14 | objectstoragecredentials s3credential,objectstoragecredential opencp.io/v1alpha1 false ObjectStorageCredential 15 | objectstorages s3,objectstorage opencp.io/v1alpha1 false ObjectStorage 16 | sshkeys sshkey,ssh opencp.io/v1alpha1 false SSHKey 17 | virtualmachines vm,vms opencp.io/v1alpha1 true VirtualMachine 18 | ``` 19 | 20 | ### Namespace 21 | 22 | ```yaml 23 | apiVersion: v1 24 | kind: Namespace 25 | metadata: 26 | name: opencp 27 | ``` 28 | 29 | ### Databases 30 | 31 | ```yaml 32 | apiVersion: opencp.io/v1alpha1 33 | kind: Database 34 | metadata: 35 | name: my-db 36 | namespace: opencp 37 | spec: 38 | nodes: 1 39 | size: "g3.db.xsmall" 40 | firewall: "mydb" # Optional field 41 | engine: "MySQL" 42 | engineVersion: "8.0" 43 | ``` 44 | 45 | ### Domains 46 | 47 | ```yaml 48 | apiVersion: opencp.io/v1alpha1 49 | kind: Domain 50 | metadata: 51 | name: domain.com 52 | spec: 53 | records: 54 | - name: mail 55 | value: 10.0.0.1 56 | type: MX 57 | priority: 10 58 | ttl: 600 59 | - name: www 60 | value: mail.domain.com 61 | type: CNAME 62 | ttl: 600 63 | ``` 64 | 65 | ### Firewalls 66 | 67 | ```yaml 68 | apiVersion: opencp.io/v1alpha1 69 | kind: Firewall 70 | metadata: 71 | name: www 72 | namespace: kubectl 73 | spec: 74 | ingress: 75 | - action: allow 76 | label: https server 77 | ports: "443" 78 | protocol: tcp 79 | source: 80 | - 0.0.0.0/0 81 | - action: allow 82 | label: http 83 | ports: "80" 84 | protocol: tcp 85 | source: 86 | - 0.0.0.0/0 87 | egress: 88 | - action: allow 89 | label: All TCP ports open 90 | ports: 1-65535 91 | protocol: tcp 92 | source: 93 | - 0.0.0.0/0 94 | - action: allow 95 | label: All UDP ports open 96 | ports: 1-65535 97 | protocol: udp 98 | source: 99 | - 0.0.0.0/0 100 | - action: allow 101 | label: Ping/traceroute 102 | ports: "" 103 | protocol: icmp 104 | source: 105 | - 0.0.0.0/0 106 | ``` 107 | 108 | ### IP 109 | 110 | ```yaml 111 | apiVersion: opencp.io/v1alpha1 112 | kind: IP 113 | metadata: 114 | name: test-ip 115 | spec: 116 | name: test-ip 117 | ``` 118 | 119 | ### Kubernetes Cluster 120 | 121 | ```yaml 122 | apiVersion: opencp.io/v1alpha1 123 | kind: KubernetesCluster 124 | metadata: 125 | name: cluster-grpc 126 | namespace: kubectl 127 | spec: 128 | pools: 129 | - size: g4s.kube.small 130 | id: 8172c593-0b0b-47ae-8821-000b82988950 131 | count: 1 132 | autoscaler: false # optional field 133 | minSize: 1 # optional field 134 | maxSize: 10 # optional field 135 | - size: g4s.kube.small 136 | id: bbc81b31-73c5-44b0-a849-809c8de3c52d 137 | count: 1 138 | version: 1.22.11-k3s1 139 | firewall: my-firewall 140 | cniPlugin: flannel 141 | clusterType: k3s | talos # optional field 142 | ``` 143 | 144 | ### Object Storage Credential 145 | 146 | ```yaml 147 | apiVersion: opencp.io/v1alpha1 148 | kind: ObjectStorageCredential 149 | metadata: 150 | name: mykey 151 | spec: 152 | accessKey: key 153 | secretKey: supersecretkey1234567890 154 | ``` 155 | 156 | ### Object Storage 157 | 158 | ```yaml 159 | apiVersion: opencp.io/v1alpha1 160 | kind: ObjectStorage 161 | metadata: 162 | name: my-s3 163 | spec: 164 | size: 500 165 | storageCredential: mykey # optional field 166 | ``` 167 | 168 | ### SSH Key 169 | 170 | ```yaml 171 | apiVersion: opencp.io/v1alpha1 172 | kind: SSHKey 173 | metadata: 174 | name: my-sshkey 175 | spec: 176 | publicKey: | 177 | ssh-rsa HtBOHuMwMQujzcl4zsFXCJctKsHzKkHTpmuONLaHudfWEjlJFNmCw3SlK3DJPIj5vHjLQulTfyBHA/sTtw1iY7Dzo/qKFxpS0yKeVDUYChZ8hZ93f1avWeK6CQPy2pclSdcgR3wUBwix0tl test@mackbook.lan 178 | ``` 179 | 180 | ### Virtual Machine 181 | 182 | ```yaml 183 | kind: VirtualMachine 184 | apiVersion: opencp.io/v1alpha1 185 | metadata: 186 | name: my-vm 187 | namespace: opencp 188 | spec: 189 | size: g3.medium 190 | firewall: my-firewall 191 | ipv4: true 192 | image: ubuntu-jammy 193 | auth: 194 | user: root 195 | sshKey: my-sshkey 196 | ``` --------------------------------------------------------------------------------