github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/openshift/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 openshiftconsole
    20  
    21  import (
    22  	"context"
    23  	"fmt"
    24  
    25  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    26  	config "github.com/IBM-Blockchain/fabric-operator/operatorconfig"
    27  	k8sclient "github.com/IBM-Blockchain/fabric-operator/pkg/k8s/controllerclient"
    28  	"github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources"
    29  	resourcemanager "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/manager"
    30  	baseconsole "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console"
    31  	baseconsoleoverride "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console/override"
    32  	"github.com/IBM-Blockchain/fabric-operator/pkg/offering/common"
    33  	"github.com/IBM-Blockchain/fabric-operator/pkg/offering/openshift/console/override"
    34  	"github.com/IBM-Blockchain/fabric-operator/version"
    35  	routev1 "github.com/openshift/api/route/v1"
    36  	"github.com/pkg/errors"
    37  	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    38  	"k8s.io/apimachinery/pkg/runtime"
    39  	"sigs.k8s.io/controller-runtime/pkg/client"
    40  	logf "sigs.k8s.io/controller-runtime/pkg/log"
    41  	"sigs.k8s.io/controller-runtime/pkg/reconcile"
    42  )
    43  
    44  const (
    45  	defaultRoute = "./definitions/console/route.yaml"
    46  )
    47  
    48  var log = logf.Log.WithName("openshift_console")
    49  
    50  type Override interface {
    51  	baseconsole.Override
    52  	ConsoleRoute(object v1.Object, route *routev1.Route, action resources.Action) error
    53  	ProxyRoute(object v1.Object, route *routev1.Route, action resources.Action) error
    54  }
    55  
    56  var _ baseconsole.IBPConsole = &Console{}
    57  
    58  type Console struct {
    59  	*baseconsole.Console
    60  
    61  	RouteManager      resources.Manager
    62  	ProxyRouteManager resources.Manager
    63  
    64  	Override Override
    65  }
    66  
    67  func New(client k8sclient.Client, scheme *runtime.Scheme, config *config.Config) *Console {
    68  	o := &override.Override{
    69  		Override: baseconsoleoverride.Override{},
    70  	}
    71  
    72  	console := &Console{
    73  		Console:  baseconsole.New(client, scheme, config, o),
    74  		Override: o,
    75  	}
    76  	console.CreateManagers()
    77  	return console
    78  }
    79  
    80  func (c *Console) CreateManagers() {
    81  	resourceManager := resourcemanager.New(c.Client, c.Scheme)
    82  	c.RouteManager = resourceManager.CreateRouteManager("console", c.Override.ConsoleRoute, c.GetLabels, c.Config.ConsoleInitConfig.RouteFile)
    83  	c.ProxyRouteManager = resourceManager.CreateRouteManager("console-proxy", c.Override.ProxyRoute, c.GetLabels, c.Config.ConsoleInitConfig.RouteFile)
    84  }
    85  
    86  func (c *Console) Reconcile(instance *current.IBPConsole, update baseconsole.Update) (common.Result, error) {
    87  
    88  	var err error
    89  
    90  	versionSet, err := c.SetVersion(instance)
    91  	if err != nil {
    92  		return common.Result{}, errors.Wrap(err, fmt.Sprintf("failed updating CR '%s' to version '%s'", instance.Name, version.Operator))
    93  	}
    94  	if versionSet {
    95  		log.Info("Instance version updated, requeuing request...")
    96  		return common.Result{
    97  			Result: reconcile.Result{
    98  				Requeue: true,
    99  			},
   100  		}, nil
   101  	}
   102  
   103  	instanceUpdated, err := c.PreReconcileChecks(instance)
   104  	if err != nil {
   105  		return common.Result{}, errors.Wrap(err, "failed pre reconcile checks")
   106  	}
   107  
   108  	if instanceUpdated {
   109  		log.Info("Updating instance after pre reconcile checks")
   110  		err = c.Client.Patch(context.TODO(), instance, nil, k8sclient.PatchOption{
   111  			Resilient: &k8sclient.ResilientPatch{
   112  				Retry:    3,
   113  				Into:     &current.IBPConsole{},
   114  				Strategy: client.MergeFrom,
   115  			},
   116  		})
   117  		if err != nil {
   118  			return common.Result{}, errors.Wrap(err, "failed to update instance")
   119  		}
   120  
   121  		log.Info("Instance updated, requeuing request...")
   122  		return common.Result{
   123  			Result: reconcile.Result{
   124  				Requeue: true,
   125  			},
   126  		}, nil
   127  	}
   128  
   129  	err = c.ReconcileManagers(instance, update.SpecUpdated())
   130  	if err != nil {
   131  		return common.Result{}, errors.Wrap(err, "failed to reconcile managers")
   132  	}
   133  
   134  	err = c.CheckStates(instance, update.SpecUpdated())
   135  	if err != nil {
   136  		return common.Result{}, errors.Wrap(err, "failed to check and restore state")
   137  	}
   138  
   139  	err = c.CheckForConfigMapUpdates(instance, update)
   140  	if err != nil {
   141  		return common.Result{}, errors.Wrap(err, "failed to check for config map updates")
   142  	}
   143  
   144  	err = c.HandleActions(instance, update)
   145  	if err != nil {
   146  		return common.Result{}, err
   147  	}
   148  
   149  	if err := c.HandleRestart(instance, update); err != nil {
   150  		return common.Result{}, err
   151  	}
   152  
   153  	return common.Result{}, nil
   154  }
   155  
   156  func (c *Console) ReconcileManagers(instance *current.IBPConsole, update bool) error {
   157  	err := c.Console.ReconcileManagers(instance, update)
   158  	if err != nil {
   159  		return err
   160  	}
   161  
   162  	err = c.RouteManager.Reconcile(instance, update)
   163  	if err != nil {
   164  		return errors.Wrap(err, "failed Console Route reconciliation")
   165  	}
   166  
   167  	err = c.ProxyRouteManager.Reconcile(instance, update)
   168  	if err != nil {
   169  		return errors.Wrap(err, "failed Proxy Route reconciliation")
   170  	}
   171  
   172  	err = c.NetworkPolicyReconcile(instance)
   173  	if err != nil {
   174  		return errors.Wrap(err, "failed Network Policy reconciliation")
   175  	}
   176  	return nil
   177  }