github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/k8s/console/console.go (about) 1 /* 2 * Copyright contributors to the Hyperledger Fabric Operator project 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at: 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package k8sconsole 20 21 import ( 22 "context" 23 "fmt" 24 "strings" 25 26 current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1" 27 config "github.com/IBM-Blockchain/fabric-operator/operatorconfig" 28 k8sclient "github.com/IBM-Blockchain/fabric-operator/pkg/k8s/controllerclient" 29 "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources" 30 resourcemanager "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/manager" 31 baseconsole "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console" 32 baseconsoleoverride "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console/override" 33 "github.com/IBM-Blockchain/fabric-operator/pkg/offering/common" 34 "github.com/IBM-Blockchain/fabric-operator/pkg/offering/k8s/console/override" 35 "github.com/IBM-Blockchain/fabric-operator/pkg/util" 36 "github.com/IBM-Blockchain/fabric-operator/version" 37 "github.com/pkg/errors" 38 networkingv1 "k8s.io/api/networking/v1" 39 networkingv1beta1 "k8s.io/api/networking/v1beta1" 40 v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 41 "k8s.io/apimachinery/pkg/runtime" 42 "sigs.k8s.io/controller-runtime/pkg/client" 43 logf "sigs.k8s.io/controller-runtime/pkg/log" 44 "sigs.k8s.io/controller-runtime/pkg/reconcile" 45 ) 46 47 var log = logf.Log.WithName("k8s_console") 48 49 type Override interface { 50 baseconsole.Override 51 Ingress(v1.Object, *networkingv1.Ingress, resources.Action) error 52 Ingressv1beta1(v1.Object, *networkingv1beta1.Ingress, resources.Action) error 53 } 54 55 type Console struct { 56 *baseconsole.Console 57 58 IngressManager resources.Manager 59 Ingressv1beta1Manager resources.Manager 60 61 Override Override 62 } 63 64 func New(client k8sclient.Client, scheme *runtime.Scheme, config *config.Config) *Console { 65 o := &override.Override{ 66 Override: baseconsoleoverride.Override{}, 67 } 68 69 console := &Console{ 70 Console: baseconsole.New(client, scheme, config, o), 71 Override: o, 72 } 73 74 console.CreateManagers() 75 return console 76 } 77 78 func (c *Console) CreateManagers() { 79 override := c.Override 80 resourceManager := resourcemanager.New(c.Client, c.Scheme) 81 c.IngressManager = resourceManager.CreateIngressManager("", override.Ingress, c.GetLabels, c.Config.ConsoleInitConfig.IngressFile) 82 c.Ingressv1beta1Manager = resourceManager.CreateIngressv1beta1Manager("", override.Ingressv1beta1, c.GetLabels, c.Config.ConsoleInitConfig.Ingressv1beta1File) 83 } 84 85 func (c *Console) Reconcile(instance *current.IBPConsole, update baseconsole.Update) (common.Result, error) { 86 var err error 87 88 versionSet, err := c.SetVersion(instance) 89 if err != nil { 90 return common.Result{}, errors.Wrap(err, fmt.Sprintf("failed updating CR '%s' to version '%s'", instance.Name, version.Operator)) 91 } 92 if versionSet { 93 log.Info("Instance version updated, requeuing request...") 94 return common.Result{ 95 Result: reconcile.Result{ 96 Requeue: true, 97 }, 98 }, nil 99 } 100 101 instanceUpdated, err := c.PreReconcileChecks(instance) 102 if err != nil { 103 return common.Result{}, errors.Wrap(err, "failed pre reconcile checks") 104 } 105 106 if instanceUpdated { 107 log.Info("Updating instance after pre reconcile checks") 108 err := c.Client.Patch(context.TODO(), instance, nil, k8sclient.PatchOption{ 109 Resilient: &k8sclient.ResilientPatch{ 110 Retry: 3, 111 Into: ¤t.IBPConsole{}, 112 Strategy: client.MergeFrom, 113 }, 114 }) 115 if err != nil { 116 return common.Result{}, errors.Wrap(err, "failed to update instance") 117 } 118 119 log.Info("Instance updated, requeuing request...") 120 return common.Result{ 121 Result: reconcile.Result{ 122 Requeue: true, 123 }, 124 }, nil 125 } 126 127 err = c.ReconcileManagers(instance, update.SpecUpdated()) 128 if err != nil { 129 return common.Result{}, errors.Wrap(err, "failed to reconcile managers") 130 } 131 132 err = c.CheckStates(instance, update.SpecUpdated()) 133 if err != nil { 134 return common.Result{}, errors.Wrap(err, "failed to check and restore state") 135 } 136 137 err = c.CheckForConfigMapUpdates(instance, update) 138 if err != nil { 139 return common.Result{}, errors.Wrap(err, "failed to check for config map updates") 140 } 141 142 err = c.HandleActions(instance, update) 143 if err != nil { 144 return common.Result{}, err 145 } 146 147 if err := c.HandleRestart(instance, update); err != nil { 148 return common.Result{}, err 149 } 150 151 return common.Result{}, nil 152 } 153 154 func (c *Console) ReconcileManagers(instance *current.IBPConsole, update bool) error { 155 var err error 156 157 err = c.Console.ReconcileManagers(instance, update) 158 if err != nil { 159 return err 160 } 161 162 err = c.ReconcileIngressManager(instance, update) 163 if err != nil { 164 return err 165 } 166 167 err = c.NetworkPolicyReconcile(instance) 168 if err != nil { 169 return errors.Wrap(err, "failed Network Policy reconciliation") 170 } 171 172 return nil 173 } 174 175 func (c *Console) ReconcileIngressManager(instance *current.IBPConsole, update bool) error { 176 if c.Config.Operator.Globals.AllowKubernetesEighteen == "true" { 177 // check k8s version 178 version, err := util.GetServerVersion() 179 if err != nil { 180 return err 181 } 182 if strings.Compare(version.Minor, "19") < 0 { // v1beta 183 err = c.Ingressv1beta1Manager.Reconcile(instance, update) 184 if err != nil { 185 return errors.Wrap(err, "failed Ingressv1beta1 reconciliation") 186 } 187 } else { 188 err = c.IngressManager.Reconcile(instance, update) 189 if err != nil { 190 return errors.Wrap(err, "failed Ingress reconciliation") 191 } 192 } 193 } else { 194 err := c.IngressManager.Reconcile(instance, update) 195 if err != nil { 196 return errors.Wrap(err, "failed Ingress reconciliation") 197 } 198 } 199 return nil 200 }