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:     &current.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  }