diff --git a/clusterctl/.gitignore b/clusterctl/.gitignore new file mode 100644 index 000000000000..85d64d7de71e --- /dev/null +++ b/clusterctl/.gitignore @@ -0,0 +1 @@ +clusterctl \ No newline at end of file diff --git a/clusterctl/CONTRIBUTING.md b/clusterctl/CONTRIBUTING.md new file mode 100644 index 000000000000..33a12a74bf9f --- /dev/null +++ b/clusterctl/CONTRIBUTING.md @@ -0,0 +1 @@ +# Contributing Guidelines \ No newline at end of file diff --git a/clusterctl/README.md b/clusterctl/README.md new file mode 100644 index 000000000000..60a0a099cc13 --- /dev/null +++ b/clusterctl/README.md @@ -0,0 +1,53 @@ +# clusterctl + +`clusterctl` is the SIG-cluster-lifecycle sponsored tool that implements the Cluster API. + +Read the [experience doc here](https://docs.google.com/document/d/1-sYb3EdkRga49nULH1kSwuQFf1o6GvAw_POrsNo5d8c/edit#). + +## Getting Started + +### Prerequisites + +Follow the steps listed at [CONTRIBUTING.md](https://github.com/kubernetes-sigs/cluster-api/blob/master/cluster-api/clusterctl/CONTRIBUTING.md) to: + +1. Build the `clusterctl` tool + +``` +go build +``` + +2. Create a `machines.yaml` file configured for your cluster. See the provided template for an example. + +### Limitations + + +### Creating a cluster + +**NOT YET SUPPORTED!** + +### Interacting with your cluster + +Once you have created a cluster, you can interact with the cluster and machine +resources using kubectl: + +``` +$ kubectl get clusters +$ kubectl get machines +$ kubectl get machines -o yaml +``` + +#### Scaling your cluster + +**NOT YET SUPPORTED!** + +#### Upgrading your cluster + +**NOT YET SUPPORTED!** + +#### Node repair + +**NOT YET SUPPORTED!** + +### Deleting a cluster + +**NOT YET SUPPORTED!** diff --git a/clusterctl/cmd/create.go b/clusterctl/cmd/create.go new file mode 100644 index 000000000000..bb7e2890b762 --- /dev/null +++ b/clusterctl/cmd/create.go @@ -0,0 +1,32 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "github.com/spf13/cobra" +) + +var createCmd = &cobra.Command{ + Use: "create", + Short: "Create a cluster API resource", + Long: `Create a cluster API resource with one command`, +} + +func init() { + createCmd.AddCommand(NewCmdCreateCluster()) + RootCmd.AddCommand(createCmd) +} diff --git a/clusterctl/cmd/create_cluster.go b/clusterctl/cmd/create_cluster.go new file mode 100644 index 000000000000..47d3ecae0565 --- /dev/null +++ b/clusterctl/cmd/create_cluster.go @@ -0,0 +1,59 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "github.com/golang/glog" + "github.com/spf13/cobra" + "sigs.k8s.io/cluster-api/errors" +) + +type CreateOptions struct { + Cluster string + Machine string + ProviderComponents string +} + +var co = &CreateOptions{} + +func NewCmdCreateCluster() *cobra.Command { + cmd := &cobra.Command{ + Use: "cluster", + Short: "Create kubernetes cluster", + Long: `Create a kubernetes cluster with one command`, + Run: func(cmd *cobra.Command, args []string) { + if co.Cluster == "" { + exitWithHelp(cmd, "Please provide yaml file for cluster definition.") + } + if co.Machine == "" { + exitWithHelp(cmd, "Please provide yaml file for machine definition.") + } + if co.ProviderComponents == "" { + exitWithHelp(cmd, "Please provide a yaml file for provider component definitions.") + } + if err := RunCreate(co); err != nil { + glog.Exit(err) + } + }, + } + + return cmd +} + +func RunCreate(co *CreateOptions) error { + return errors.NotImplementedError +} diff --git a/clusterctl/cmd/delete.go b/clusterctl/cmd/delete.go new file mode 100644 index 000000000000..690593ef057f --- /dev/null +++ b/clusterctl/cmd/delete.go @@ -0,0 +1,32 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "github.com/spf13/cobra" +) + +var deleteCmd = &cobra.Command{ + Use: "delete", + Short: "Delete a cluster API resource", + Long: `Delete a cluster API resource with one command`, +} + +func init() { + deleteCmd.AddCommand(NewCmdDeleteCluster()) + RootCmd.AddCommand(deleteCmd) +} diff --git a/clusterctl/cmd/delete_cluster.go b/clusterctl/cmd/delete_cluster.go new file mode 100644 index 000000000000..b38fa4c9f2b6 --- /dev/null +++ b/clusterctl/cmd/delete_cluster.go @@ -0,0 +1,51 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "github.com/golang/glog" + "github.com/spf13/cobra" + "sigs.k8s.io/cluster-api/errors" +) + +type DeleteOptions struct { + ClusterName string +} + +var do = &DeleteOptions{} + +func NewCmdDeleteCluster() *cobra.Command { + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete kubernetes cluster", + Long: `Delete a kubernetes cluster with one command`, + Run: func(cmd *cobra.Command, args []string) { + if do.ClusterName == "" { + exitWithHelp(cmd, "Please provide cluster name.") + } + if err := RunDelete(); err != nil { + glog.Exit(err) + } + }, + } + + return cmd +} + +func RunDelete() error { + return errors.NotImplementedError +} diff --git a/clusterctl/cmd/root.go b/clusterctl/cmd/root.go new file mode 100644 index 000000000000..6e5279363d7a --- /dev/null +++ b/clusterctl/cmd/root.go @@ -0,0 +1,87 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "flag" + "io/ioutil" + "os" + + "github.com/ghodss/yaml" + "github.com/golang/glog" + "github.com/spf13/cobra" + "k8s.io/apiserver/pkg/util/logs" + clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/cluster-api/util" +) + +var RootCmd = &cobra.Command{ + Use: "clusterctl", + Short: "cluster management", + Long: `Simple kubernetes cluster management`, + Run: func(cmd *cobra.Command, args []string) { + // Do Stuff Here + cmd.Help() + }, +} + +func Execute() { + if err := RootCmd.Execute(); err != nil { + glog.Exit(err) + } +} + +func parseClusterYaml(file string) (*clusterv1.Cluster, error) { + bytes, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + + cluster := &clusterv1.Cluster{} + err = yaml.Unmarshal(bytes, cluster) + if err != nil { + return nil, err + } + + return cluster, nil +} + +func parseMachinesYaml(file string) ([]*clusterv1.Machine, error) { + bytes, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + + machines := &clusterv1.MachineList{} + err = yaml.Unmarshal(bytes, &machines) + if err != nil { + return nil, err + } + + return util.MachineP(machines.Items), nil +} + +func exitWithHelp(cmd *cobra.Command, err string) { + glog.Error(err) + cmd.Help() + os.Exit(1) +} + +func init() { + flag.CommandLine.Parse([]string{}) + logs.InitLogs() +} diff --git a/clusterctl/main.go b/clusterctl/main.go new file mode 100644 index 000000000000..736fcc0e1c57 --- /dev/null +++ b/clusterctl/main.go @@ -0,0 +1,23 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import "sigs.k8s.io/cluster-api/clusterctl/cmd" + +func main() { + cmd.Execute() +} diff --git a/errors/deployer.go b/errors/deployer.go new file mode 100644 index 000000000000..8c7041dbfcfd --- /dev/null +++ b/errors/deployer.go @@ -0,0 +1,23 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package errors + +import ( + "fmt" +) + +var NotImplementedError = fmt.Errorf("not implemented")