Skip to content

Commit

Permalink
Merge pull request #119 from schemahero/ent
Browse files Browse the repository at this point in the history
Add namespace for compatibility with kots
  • Loading branch information
marccampbell committed Feb 26, 2020
2 parents face2da + 9f5758e commit 1786b14
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 52 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ jobs:
path: bin/
- run: chmod +x bin/kubectl-schemahero

- run: ./bin/kubectl-schemahero install --yaml --out-dir ./kots --enterprise
- run: ./bin/kubectl-schemahero install --yaml --out-dir=./kots --enterprise --namespace="repl{{ Namespace }}"

- name: Lint the release
id: lint-action
Expand Down
5 changes: 3 additions & 2 deletions pkg/cli/schemaherokubectlcli/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func InstallCmd() *cobra.Command {
}

if v.GetBool("yaml") {
manifests, err := installer.GenerateOperatorYAML(v.GetString("extensions-api"), v.GetBool("enterprise"))
manifests, err := installer.GenerateOperatorYAML(v.GetString("extensions-api"), v.GetBool("enterprise"), v.GetString("namespace"))
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
return err
Expand Down Expand Up @@ -61,7 +61,7 @@ func InstallCmd() *cobra.Command {
}
return nil
}
if err := installer.InstallOperator(v.GetBool("enterprise")); err != nil {
if err := installer.InstallOperator(v.GetBool("enterprise"), v.GetString("namespace")); err != nil {
fmt.Printf("Error: %s\n", err.Error())
return err
}
Expand All @@ -75,6 +75,7 @@ func InstallCmd() *cobra.Command {
cmd.Flags().String("out-dir", "", "If present and --yaml also specified, write all of the manifests to this directory")
cmd.Flags().String("extensions-api", "", "version of apiextensions.k8s.io to generate. if unset, will detect best version from kubernetes version")
cmd.Flags().Bool("enterprise", false, "If preset, generate enterprise YAML with KOTS template functions. This probably isn't what you want")
cmd.Flags().StringP("namespace", "n", "schemahero-system", "The namespace to install SchemaHero Operator into")

return cmd
}
32 changes: 17 additions & 15 deletions pkg/installer/installer.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/config"
)

func GenerateOperatorYAML(requestedExtensionsAPIVersion string, isEnterprise bool) (map[string][]byte, error) {
func GenerateOperatorYAML(requestedExtensionsAPIVersion string, isEnterprise bool, namespace string) (map[string][]byte, error) {
manifests := map[string][]byte{}

useExtensionsV1Beta1 := false
Expand Down Expand Up @@ -41,31 +41,33 @@ func GenerateOperatorYAML(requestedExtensionsAPIVersion string, isEnterprise boo
}
manifests["cluster-role.yaml"] = manifest

manifest, err = clusterRoleBindingYAML()
manifest, err = clusterRoleBindingYAML(namespace)
if err != nil {
return nil, errors.Wrap(err, "failed to get cluster binding role")
}
manifests["cluster-role-binding.yaml"] = manifest

manifest, err = namespaceYAML()
if err != nil {
return nil, errors.Wrap(err, "failed to get namespace")
if !isEnterprise {
manifest, err = namespaceYAML(namespace)
if err != nil {
return nil, errors.Wrap(err, "failed to get namespace")
}
manifests["namespace.yaml"] = manifest
}
manifests["namespace.yaml"] = manifest

manifest, err = serviceYAML()
manifest, err = serviceYAML(namespace)
if err != nil {
return nil, errors.Wrap(err, "failed to get service")
}
manifests["service.yaml"] = manifest

manifest, err = secretYAML()
manifest, err = secretYAML(namespace)
if err != nil {
return nil, errors.Wrap(err, "failed to get secret")
}
manifests["secret.yaml"] = manifest

manifest, err = managerYAML(isEnterprise)
manifest, err = managerYAML(isEnterprise, namespace)
if err != nil {
return nil, errors.Wrap(err, "failed to get manager")
}
Expand All @@ -74,7 +76,7 @@ func GenerateOperatorYAML(requestedExtensionsAPIVersion string, isEnterprise boo
return manifests, nil
}

func InstallOperator(isEnterprise bool) error {
func InstallOperator(isEnterprise bool, namespace string) error {
cfg, err := config.GetConfig()
if err != nil {
return errors.Wrap(err, "failed to get kubernetes config")
Expand Down Expand Up @@ -102,23 +104,23 @@ func InstallOperator(isEnterprise bool) error {
return errors.Wrap(err, "failed to create cluster role")
}

if err := ensureClusterRoleBinding(client); err != nil {
if err := ensureClusterRoleBinding(client, namespace); err != nil {
return errors.Wrap(err, "failed to create cluster role binding")
}

if err := ensureNamespace(client); err != nil {
if err := ensureNamespace(client, namespace); err != nil {
return errors.Wrap(err, "failed to create namespace")
}

if err := ensureService(client); err != nil {
if err := ensureService(client, namespace); err != nil {
return errors.Wrap(err, "failed to create service")
}

if err := ensureSecret(client); err != nil {
if err := ensureSecret(client, namespace); err != nil {
return errors.Wrap(err, "failed to create secret")
}

if err := ensureManager(client, isEnterprise); err != nil {
if err := ensureManager(client, isEnterprise, namespace); err != nil {
return errors.Wrap(err, "failed to create manager")
}

Expand Down
56 changes: 28 additions & 28 deletions pkg/installer/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,24 @@ import (
var tenSeconds = int64(10)
var defaultMode = int32(420)

func namespaceYAML() ([]byte, error) {
func namespaceYAML(name string) ([]byte, error) {
s := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
var result bytes.Buffer
if err := s.Encode(namespace(), &result); err != nil {
if err := s.Encode(namespace(name), &result); err != nil {
return nil, errors.Wrap(err, "failed to marshal namespace")
}

return result.Bytes(), nil
}

func ensureNamespace(clientset *kubernetes.Clientset) error {
_, err := clientset.CoreV1().Namespaces().Get("schemahero-system", metav1.GetOptions{})
func ensureNamespace(clientset *kubernetes.Clientset, name string) error {
_, err := clientset.CoreV1().Namespaces().Get(name, metav1.GetOptions{})
if err != nil {
if !kuberneteserrors.IsNotFound(err) {
return errors.Wrap(err, "failed to get namespace")
}

_, err := clientset.CoreV1().Namespaces().Create(namespace())
_, err := clientset.CoreV1().Namespaces().Create(namespace(name))
if err != nil {
return errors.Wrap(err, "failed to create namespace")
}
Expand All @@ -44,36 +44,36 @@ func ensureNamespace(clientset *kubernetes.Clientset) error {
return nil
}

func namespace() *corev1.Namespace {
func namespace(name string) *corev1.Namespace {
return &corev1.Namespace{
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "Namespace",
},
ObjectMeta: metav1.ObjectMeta{
Name: "schemahero-system",
Name: name,
},
}
}

func serviceYAML() ([]byte, error) {
func serviceYAML(namespace string) ([]byte, error) {
s := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
var result bytes.Buffer
if err := s.Encode(service(), &result); err != nil {
if err := s.Encode(service(namespace), &result); err != nil {
return nil, errors.Wrap(err, "failed to marshal service")
}

return result.Bytes(), nil
}

func ensureService(clientset *kubernetes.Clientset) error {
_, err := clientset.CoreV1().Services("schemahero-system").Get("controller-manager-service", metav1.GetOptions{})
func ensureService(clientset *kubernetes.Clientset, namespace string) error {
_, err := clientset.CoreV1().Services(namespace).Get("controller-manager-service", metav1.GetOptions{})
if err != nil {
if !kuberneteserrors.IsNotFound(err) {
return errors.Wrap(err, "failed to get service")
}

_, err := clientset.CoreV1().Secrets("schemahero-system").Create(secret())
_, err := clientset.CoreV1().Secrets(namespace).Create(secret(namespace))
if err != nil {
return errors.Wrap(err, "failed to create service")
}
Expand All @@ -82,15 +82,15 @@ func ensureService(clientset *kubernetes.Clientset) error {
return nil
}

func service() *corev1.Service {
func service(namespace string) *corev1.Service {
return &corev1.Service{
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "Service",
},
ObjectMeta: metav1.ObjectMeta{
Name: "controller-webhook-server",
Namespace: "schemahero-system",
Namespace: namespace,
},
Spec: corev1.ServiceSpec{
Selector: map[string]string{
Expand All @@ -106,24 +106,24 @@ func service() *corev1.Service {
}
}

func secretYAML() ([]byte, error) {
func secretYAML(namespace string) ([]byte, error) {
s := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
var result bytes.Buffer
if err := s.Encode(secret(), &result); err != nil {
if err := s.Encode(secret(namespace), &result); err != nil {
return nil, errors.Wrap(err, "failed to marshal secret")
}

return result.Bytes(), nil
}

func ensureSecret(clientset *kubernetes.Clientset) error {
_, err := clientset.CoreV1().Secrets("schemahero-system").Get("webhook-server-secret", metav1.GetOptions{})
func ensureSecret(clientset *kubernetes.Clientset, namespace string) error {
_, err := clientset.CoreV1().Secrets(namespace).Get("webhook-server-secret", metav1.GetOptions{})
if err != nil {
if !kuberneteserrors.IsNotFound(err) {
return errors.Wrap(err, "failed to get secret")
}

_, err := clientset.CoreV1().Secrets("schemahero-system").Create(secret())
_, err := clientset.CoreV1().Secrets(namespace).Create(secret(namespace))
if err != nil {
return errors.Wrap(err, "failed to create secret")
}
Expand All @@ -132,37 +132,37 @@ func ensureSecret(clientset *kubernetes.Clientset) error {
return nil
}

func secret() *corev1.Secret {
func secret(namespace string) *corev1.Secret {
return &corev1.Secret{
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "Secret",
},
ObjectMeta: metav1.ObjectMeta{
Name: "webhook-server-secret",
Namespace: "schemahero-system",
Namespace: namespace,
},
}
}

func managerYAML(isEnterprise bool) ([]byte, error) {
func managerYAML(isEnterprise bool, namespace string) ([]byte, error) {
s := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
var result bytes.Buffer
if err := s.Encode(manager(isEnterprise), &result); err != nil {
if err := s.Encode(manager(isEnterprise, namespace), &result); err != nil {
return nil, errors.Wrap(err, "failed to marshal manager")
}

return result.Bytes(), nil
}

func ensureManager(clientset *kubernetes.Clientset, isEnterprise bool) error {
_, err := clientset.AppsV1().StatefulSets("schemahero-system").Get("schemahero", metav1.GetOptions{})
func ensureManager(clientset *kubernetes.Clientset, isEnterprise bool, namespace string) error {
_, err := clientset.AppsV1().StatefulSets(namespace).Get("schemahero", metav1.GetOptions{})
if err != nil {
if !kuberneteserrors.IsNotFound(err) {
return errors.Wrap(err, "failed to get statefulset")
}

_, err := clientset.AppsV1().StatefulSets("schemahero-system").Create(manager(isEnterprise))
_, err := clientset.AppsV1().StatefulSets(namespace).Create(manager(isEnterprise, namespace))
if err != nil {
return errors.Wrap(err, "failed to create statefulset")
}
Expand All @@ -171,7 +171,7 @@ func ensureManager(clientset *kubernetes.Clientset, isEnterprise bool) error {
return nil
}

func manager(isEnterprise bool) *appsv1.StatefulSet {
func manager(isEnterprise bool, namespace string) *appsv1.StatefulSet {
env := []corev1.EnvVar{
{
Name: "POD_NAMESPACE",
Expand Down Expand Up @@ -206,7 +206,7 @@ func manager(isEnterprise bool) *appsv1.StatefulSet {
},
ObjectMeta: metav1.ObjectMeta{
Name: "schemahero",
Namespace: "schemahero-system",
Namespace: namespace,
Labels: map[string]string{
"control-plane": "schemahero",
},
Expand Down
12 changes: 6 additions & 6 deletions pkg/installer/rbac.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,24 +109,24 @@ func clusterRole() *rbacv1.ClusterRole {
return clusterRole
}

func clusterRoleBindingYAML() ([]byte, error) {
func clusterRoleBindingYAML(namespace string) ([]byte, error) {
s := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
var result bytes.Buffer
if err := s.Encode(clusterRoleBinding(), &result); err != nil {
if err := s.Encode(clusterRoleBinding(namespace), &result); err != nil {
return nil, errors.Wrap(err, "failed to marshal cluster role binding")
}

return result.Bytes(), nil
}

func ensureClusterRoleBinding(clientset *kubernetes.Clientset) error {
func ensureClusterRoleBinding(clientset *kubernetes.Clientset, namespace string) error {
_, err := clientset.RbacV1().ClusterRoleBindings().Get("schemahero-rolebinding", metav1.GetOptions{})
if err != nil {
if !kuberneteserrors.IsNotFound(err) {
return errors.Wrap(err, "failed to get clusterrolebinding")
}

_, err := clientset.RbacV1().ClusterRoleBindings().Create(clusterRoleBinding())
_, err := clientset.RbacV1().ClusterRoleBindings().Create(clusterRoleBinding(namespace))
if err != nil {
return errors.Wrap(err, "failed to create cluster rolebinding")
}
Expand All @@ -135,7 +135,7 @@ func ensureClusterRoleBinding(clientset *kubernetes.Clientset) error {
return nil
}

func clusterRoleBinding() *rbacv1.ClusterRoleBinding {
func clusterRoleBinding(namespace string) *rbacv1.ClusterRoleBinding {
clusterRoleBinding := &rbacv1.ClusterRoleBinding{
TypeMeta: metav1.TypeMeta{
APIVersion: "rbac.authorization.k8s.io/v1",
Expand All @@ -148,7 +148,7 @@ func clusterRoleBinding() *rbacv1.ClusterRoleBinding {
{
Kind: "ServiceAccount",
Name: "default",
Namespace: "schemahero-system",
Namespace: namespace,
},
},
RoleRef: rbacv1.RoleRef{
Expand Down

0 comments on commit 1786b14

Please sign in to comment.