github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/apis/deployer/deployer.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 deployer
    20  
    21  import (
    22  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    23  	"github.com/IBM-Blockchain/fabric-operator/pkg/util/image"
    24  	corev1 "k8s.io/api/core/v1"
    25  )
    26  
    27  type Config struct {
    28  	ClusterType      string        `json:"clusterType"`
    29  	Domain           string        `json:"domain"`
    30  	DashboardURL     string        `json:"dashboardurl"`
    31  	Database         Database      `json:"db"`
    32  	Loglevel         string        `json:"loglevel"`
    33  	Port             int           `json:"port"`
    34  	TLS              TLSConfig     `json:"tls"`
    35  	Auth             BasicAuth     `json:"auth"`
    36  	Namespace        string        `json:"namespace"`
    37  	Defaults         *Defaults     `json:"defaults"`
    38  	Versions         *Versions     `json:"versions"`
    39  	ImagePullSecrets []string      `json:"imagePullSecrets"`
    40  	ServiceConfig    ServiceConfig `json:"serviceConfig"`
    41  	CRN              *current.CRN  `json:"crn"`
    42  	Timeouts         *Timeouts     `json:"timeouts"`
    43  	OtherImages      *OtherImages  `json:"otherImages"`
    44  	ServiceAccount   string        `json:"serviceAccount"`
    45  	UseTags          *bool         `json:"usetags"`
    46  }
    47  
    48  type Versions struct {
    49  	CA      map[string]VersionCA      `json:"ca"`
    50  	Peer    map[string]VersionPeer    `json:"peer"`
    51  	Orderer map[string]VersionOrderer `json:"orderer"`
    52  }
    53  
    54  type VersionCA struct {
    55  	Default bool     `json:"default"`
    56  	Version string   `json:"version"`
    57  	Image   CAImages `json:"image,omitempty"`
    58  }
    59  
    60  type VersionOrderer struct {
    61  	Default bool          `json:"default"`
    62  	Version string        `json:"version"`
    63  	Image   OrdererImages `json:"image,omitempty"`
    64  }
    65  type VersionPeer struct {
    66  	Default bool       `json:"default"`
    67  	Version string     `json:"version"`
    68  	Image   PeerImages `json:"image,omitempty"`
    69  }
    70  
    71  // CAImages is the list of images to be used in CA deployment
    72  type CAImages struct {
    73  	// CAImage is the name of the CA image
    74  	CAImage string `json:"caImage,omitempty"`
    75  
    76  	// CATag is the tag of the CA image
    77  	CATag string `json:"caTag,omitempty"`
    78  
    79  	// CADigest is the digest tag of the CA image
    80  	CADigest string `json:"caDigest,omitempty"`
    81  
    82  	// CAInitImage is the name of the Init image
    83  	CAInitImage string `json:"caInitImage,omitempty"`
    84  
    85  	// CAInitTag is the tag of the Init image
    86  	CAInitTag string `json:"caInitTag,omitempty"`
    87  
    88  	// CAInitDigest is the digest tag of the Init image
    89  	CAInitDigest string `json:"caInitDigest,omitempty"`
    90  
    91  	// HSMImage is the name of the HSM image
    92  	HSMImage string `json:"hsmImage,omitempty"`
    93  
    94  	// HSMTag is the tag of the HSM image
    95  	HSMTag string `json:"hsmTag,omitempty"`
    96  
    97  	// HSMDigest is the tag of the HSM image
    98  	HSMDigest string `json:"hsmDigest,omitempty"`
    99  
   100  	// EnrollerImage is the name of the init image for crypto generation
   101  	EnrollerImage string `json:"enrollerImage,omitempty"`
   102  
   103  	// EnrollerTag is the tag of the init image for crypto generation
   104  	EnrollerTag string `json:"enrollerTag,omitempty"`
   105  
   106  	// EnrollerDigest is the digest tag of the init image for crypto generation
   107  	EnrollerDigest string `json:"enrollerDigest,omitempty"`
   108  }
   109  
   110  // PeerImages is the list of images to be used in peer deployment
   111  type PeerImages struct {
   112  	// PeerInitImage is the name of the peer init image
   113  	PeerInitImage string `json:"peerInitImage,omitempty"`
   114  
   115  	// PeerInitTag is the tag of the peer init image
   116  	PeerInitTag string `json:"peerInitTag,omitempty"`
   117  
   118  	// PeerInitDigest is the digest tag of the peer init image
   119  	PeerInitDigest string `json:"peerInitDigest,omitempty"`
   120  
   121  	// PeerImage is the name of the peer image
   122  	PeerImage string `json:"peerImage,omitempty"`
   123  
   124  	// PeerTag is the tag of the peer image
   125  	PeerTag string `json:"peerTag,omitempty"`
   126  
   127  	// PeerDigest is the digest tag of the peer image
   128  	PeerDigest string `json:"peerDigest,omitempty"`
   129  
   130  	// DindImage is the name of the dind image
   131  	DindImage string `json:"dindImage,omitempty"`
   132  
   133  	// DindTag is the tag of the dind image
   134  	DindTag string `json:"dindTag,omitempty"`
   135  
   136  	// DindDigest is the digest tag of the dind image
   137  	DindDigest string `json:"dindDigest,omitempty"`
   138  
   139  	// GRPCWebImage is the name of the grpc web proxy image
   140  	GRPCWebImage string `json:"grpcwebImage,omitempty"`
   141  
   142  	// GRPCWebTag is the tag of the grpc web proxy image
   143  	GRPCWebTag string `json:"grpcwebTag,omitempty"`
   144  
   145  	// GRPCWebDigest is the digest tag of the grpc web proxy image
   146  	GRPCWebDigest string `json:"grpcwebDigest,omitempty"`
   147  
   148  	// FluentdImage is the name of the fluentd logger image
   149  	FluentdImage string `json:"fluentdImage,omitempty"`
   150  
   151  	// FluentdTag is the tag of the fluentd logger image
   152  	FluentdTag string `json:"fluentdTag,omitempty"`
   153  
   154  	// FluentdDigest is the digest tag of the fluentd logger image
   155  	FluentdDigest string `json:"fluentdDigest,omitempty"`
   156  
   157  	// CouchDBImage is the name of the couchdb image
   158  	CouchDBImage string `json:"couchdbImage,omitempty"`
   159  
   160  	// CouchDBTag is the tag of the couchdb image
   161  	CouchDBTag string `json:"couchdbTag,omitempty"`
   162  
   163  	// CouchDBDigest is the digest tag of the couchdb image
   164  	CouchDBDigest string `json:"couchdbDigest,omitempty"`
   165  
   166  	// CCLauncherImage is the name of the chaincode launcher image
   167  	CCLauncherImage string `json:"chaincodeLauncherImage,omitempty"`
   168  
   169  	// CCLauncherTag is the tag of the chaincode launcher image
   170  	CCLauncherTag string `json:"chaincodeLauncherTag,omitempty"`
   171  
   172  	// CCLauncherDigest is the digest tag of the chaincode launcher image
   173  	CCLauncherDigest string `json:"chaincodeLauncherDigest,omitempty"`
   174  
   175  	// FileTransferImage is the name of the file transfer image
   176  	FileTransferImage string `json:"fileTransferImage,omitempty"`
   177  
   178  	// FileTransferTag is the tag of the file transfer image
   179  	FileTransferTag string `json:"fileTransferTag,omitempty"`
   180  
   181  	// FileTransferDigest is the digest tag of the file transfer image
   182  	FileTransferDigest string `json:"fileTransferDigest,omitempty"`
   183  
   184  	// BuilderImage is the name of the builder image
   185  	BuilderImage string `json:"builderImage,omitempty"`
   186  
   187  	// BuilderTag is the tag of the builder image
   188  	BuilderTag string `json:"builderTag,omitempty"`
   189  
   190  	// BuilderDigest is the digest tag of the builder image
   191  	BuilderDigest string `json:"builderDigest,omitempty"`
   192  
   193  	// GoEnvImage is the name of the goenv image
   194  	GoEnvImage string `json:"goEnvImage,omitempty"`
   195  
   196  	// GoEnvTag is the tag of the goenv image
   197  	GoEnvTag string `json:"goEnvTag,omitempty"`
   198  
   199  	// GoEnvDigest is the digest tag of the goenv image
   200  	GoEnvDigest string `json:"goEnvDigest,omitempty"`
   201  
   202  	// JavaEnvImage is the name of the javaenv image
   203  	JavaEnvImage string `json:"javaEnvImage,omitempty"`
   204  
   205  	// JavaEnvTag is the tag of the javaenv image
   206  	JavaEnvTag string `json:"javaEnvTag,omitempty"`
   207  
   208  	// JavaEnvDigest is the digest tag of the javaenv image
   209  	JavaEnvDigest string `json:"javaEnvDigest,omitempty"`
   210  
   211  	// NodeEnvImage is the name of the nodeenv image
   212  	NodeEnvImage string `json:"nodeEnvImage,omitempty"`
   213  
   214  	// NodeEnvTag is the tag of the nodeenv image
   215  	NodeEnvTag string `json:"nodeEnvTag,omitempty"`
   216  
   217  	// NodeEnvDigest is the digest tag of the nodeenv image
   218  	NodeEnvDigest string `json:"nodeEnvDigest,omitempty"`
   219  
   220  	// HSMImage is the name of the hsm image
   221  	HSMImage string `json:"hsmImage,omitempty"`
   222  
   223  	// HSMTag is the tag of the hsm image
   224  	HSMTag string `json:"hsmTag,omitempty"`
   225  
   226  	// HSMDigest is the digest tag of the hsm image
   227  	HSMDigest string `json:"hsmDigest,omitempty"`
   228  
   229  	// EnrollerImage is the name of the init image for crypto generation
   230  	EnrollerImage string `json:"enrollerImage,omitempty"`
   231  
   232  	// EnrollerTag is the tag of the init image for crypto generation
   233  	EnrollerTag string `json:"enrollerTag,omitempty"`
   234  
   235  	// EnrollerDigest is the digest tag of the init image for crypto generation
   236  	EnrollerDigest string `json:"enrollerDigest,omitempty"`
   237  }
   238  
   239  // OrdererImages is the list of images to be used in orderer deployment
   240  type OrdererImages struct {
   241  	// OrdererInitImage is the name of the orderer init image
   242  	OrdererInitImage string `json:"ordererInitImage,omitempty"`
   243  
   244  	// OrdererInitTag is the tag of the orderer init image
   245  	OrdererInitTag string `json:"ordererInitTag,omitempty"`
   246  
   247  	// OrdererInitDigest is the digest tag of the orderer init image
   248  	OrdererInitDigest string `json:"ordererInitDigest,omitempty"`
   249  
   250  	// OrdererImage is the name of the orderer image
   251  	OrdererImage string `json:"ordererImage,omitempty"`
   252  
   253  	// OrdererTag is the tag of the orderer image
   254  	OrdererTag string `json:"ordererTag,omitempty"`
   255  
   256  	// OrdererDigest is the digest tag of the orderer image
   257  	OrdererDigest string `json:"ordererDigest,omitempty"`
   258  
   259  	// GRPCWebImage is the name of the grpc web proxy image
   260  	GRPCWebImage string `json:"grpcwebImage,omitempty"`
   261  
   262  	// GRPCWebTag is the tag of the grpc web proxy image
   263  	GRPCWebTag string `json:"grpcwebTag,omitempty"`
   264  
   265  	// GRPCWebDigest is the digest tag of the grpc web proxy image
   266  	GRPCWebDigest string `json:"grpcwebDigest,omitempty"`
   267  
   268  	// HSMImage is the name of the hsm image
   269  	HSMImage string `json:"hsmImage,omitempty"`
   270  
   271  	// HSMTag is the tag of the hsm image
   272  	HSMTag string `json:"hsmTag,omitempty"`
   273  
   274  	// HSMDigest is the digest tag of the hsm image
   275  	HSMDigest string `json:"hsmDigest,omitempty"`
   276  
   277  	// EnrollerImage is the name of the init image for crypto generation
   278  	EnrollerImage string `json:"enrollerImage,omitempty"`
   279  
   280  	// EnrollerTag is the tag of the init image for crypto generation
   281  	EnrollerTag string `json:"enrollerTag,omitempty"`
   282  
   283  	// EnrollerDigest is the digest tag of the init image for crypto generation
   284  	EnrollerDigest string `json:"enrollerDigest,omitempty"`
   285  }
   286  
   287  type Defaults struct {
   288  	Storage   *Storage   `json:"storage"`
   289  	Resources *Resources `json:"resources"`
   290  }
   291  
   292  type Storage struct {
   293  	Peer    *current.PeerStorages    `json:"peer"`
   294  	CA      *current.CAStorages      `json:"ca"`
   295  	Orderer *current.OrdererStorages `json:"orderer"`
   296  }
   297  
   298  type Resources struct {
   299  	Peer    *current.PeerResources    `json:"peer"`
   300  	CA      *current.CAResources      `json:"ca"`
   301  	Orderer *current.OrdererResources `json:"orderer"`
   302  }
   303  
   304  type ServiceConfig struct {
   305  	Type corev1.ServiceType `json:"type"`
   306  }
   307  
   308  // IndividualDatabase describes the initialization of databases
   309  type IndividualDatabase struct {
   310  	Name       string   `json:"name"`
   311  	DesignDocs []string `json:"designdocs"`
   312  }
   313  
   314  // Database is connection details to connect to couchdb database
   315  type Database struct {
   316  	ConnectionURL string             `json:"connectionurl"`
   317  	Components    IndividualDatabase `json:"components"`
   318  	CreateDB      bool               `json:"createdb"`
   319  }
   320  
   321  // TLSConfig is to configure the tls server
   322  type TLSConfig struct {
   323  	Enabled       bool   `json:"enabled"`
   324  	ListenAddress string `json:"listenaddress"`
   325  	CertPath      string `json:"certpath"`
   326  	KeyPath       string `json:"keypath"`
   327  }
   328  
   329  // BasicAuth provides implementation to store basic auth info
   330  type BasicAuth struct {
   331  	Username string `json:"username"`
   332  	Password string `json:"password"`
   333  }
   334  
   335  type Timeouts struct {
   336  	Deployment int `json:"componentDeploy"`
   337  	APIServer  int `json:"apiServer"`
   338  }
   339  
   340  // OtherImages contains other images and tags required to run deployer.
   341  type OtherImages struct {
   342  	// MustgatherImage is the name of the mustgather image
   343  	MustgatherImage string `json:"mustgatherImage,omitempty"`
   344  
   345  	// MustgatherTag is the tag of the mustgatherTag image
   346  	MustgatherTag string `json:"mustgatherTag,omitempty"`
   347  
   348  	// MustgatherDigest is the tag of the mustgatherDigest image
   349  	MustgatherDigest string `json:"mustgatherDigest,omitempty"`
   350  }
   351  
   352  // ConsoleImages is the list of images to be used in console deployment
   353  type ConsoleImages struct {
   354  	// ConsoleInitImage is the name of the console init image
   355  	ConsoleInitImage string `json:"consoleInitImage,omitempty"`
   356  	// ConsoleInitTag is the tag of the console init image
   357  	ConsoleInitTag string `json:"consoleInitTag,omitempty"`
   358  	// ConsoleInitDigest is the digest of the console init image
   359  	ConsoleInitDigest string `json:"consoleInitDigest,omitempty"`
   360  
   361  	// ConsoleImage is the name of the console image
   362  	ConsoleImage string `json:"consoleImage,omitempty"`
   363  	// ConsoleTag is the tag of the console image
   364  	ConsoleTag string `json:"consoleTag,omitempty"`
   365  	// ConsoleDigest is the digest of the console image
   366  	ConsoleDigest string `json:"consoleDigest,omitempty"`
   367  
   368  	// ConfigtxlatorImage is the name of the configtxlator image
   369  	ConfigtxlatorImage string `json:"configtxlatorImage,omitempty"`
   370  	// ConfigtxlatorTag is the tag of the configtxlator image
   371  	ConfigtxlatorTag string `json:"configtxlatorTag,omitempty"`
   372  	// ConfigtxlatorDigest is the digest of the configtxlator image
   373  	ConfigtxlatorDigest string `json:"configtxlatorDigest,omitempty"`
   374  
   375  	// DeployerImage is the name of the deployer image
   376  	DeployerImage string `json:"deployerImage,omitempty"`
   377  	// DeployerTag is the tag of the deployer image
   378  	DeployerTag string `json:"deployerTag,omitempty"`
   379  	// DeployerDigest is the digest of the deployer image
   380  	DeployerDigest string `json:"deployerDigest,omitempty"`
   381  
   382  	// CouchDBImage is the name of the couchdb image
   383  	CouchDBImage string `json:"couchdbImage,omitempty"`
   384  	// CouchDBTag is the tag of the couchdb image
   385  	CouchDBTag string `json:"couchdbTag,omitempty"`
   386  	// CouchDBDigest is the digest of the couchdb image
   387  	CouchDBDigest string `json:"couchdbDigest,omitempty"`
   388  
   389  	// MustgatherImage is the name of the mustgather image
   390  	MustgatherImage string `json:"mustgatherImage,omitempty"`
   391  	// MustgatherTag is the tag of the mustgather image
   392  	MustgatherTag string `json:"mustgatherTag,omitempty"`
   393  	// MustgatherDigest is the digest of the mustgather image
   394  	MustgatherDigest string `json:"mustgatherDigest,omitempty"`
   395  }
   396  
   397  func (v *Versions) Override(requestedVersions *Versions, registryURL string, arch string) {
   398  	if requestedVersions == nil {
   399  		return
   400  	}
   401  
   402  	if len(requestedVersions.CA) != 0 {
   403  		CAVersions := map[string]VersionCA{}
   404  		for key, _ := range requestedVersions.CA {
   405  			var caConfig VersionCA
   406  			requestedCAVersion := requestedVersions.CA[key]
   407  			caConfig.Image.Override(&requestedCAVersion.Image, registryURL, arch)
   408  			caConfig.Default = requestedCAVersion.Default
   409  			caConfig.Version = requestedCAVersion.Version
   410  			CAVersions[key] = caConfig
   411  		}
   412  		v.CA = CAVersions
   413  	}
   414  
   415  	if len(requestedVersions.Peer) != 0 {
   416  		PeerVersions := map[string]VersionPeer{}
   417  		for key, _ := range requestedVersions.Peer {
   418  			var peerConfig VersionPeer
   419  			requestedPeerVersion := requestedVersions.Peer[key]
   420  			peerConfig.Image.Override(&requestedPeerVersion.Image, registryURL, arch)
   421  			peerConfig.Default = requestedPeerVersion.Default
   422  			peerConfig.Version = requestedPeerVersion.Version
   423  			PeerVersions[key] = peerConfig
   424  		}
   425  		v.Peer = PeerVersions
   426  	}
   427  
   428  	if len(requestedVersions.Orderer) != 0 {
   429  		OrdererVersions := map[string]VersionOrderer{}
   430  		for key, _ := range requestedVersions.Orderer {
   431  			var ordererConfig VersionOrderer
   432  			requestedOrdererVersion := requestedVersions.Orderer[key]
   433  			ordererConfig.Image.Override(&requestedOrdererVersion.Image, registryURL, arch)
   434  			ordererConfig.Default = requestedOrdererVersion.Default
   435  			ordererConfig.Version = requestedOrdererVersion.Version
   436  			OrdererVersions[key] = ordererConfig
   437  		}
   438  		v.Orderer = OrdererVersions
   439  	}
   440  }
   441  
   442  // Override will look at requested images and use those to override default image
   443  // values. Override also format the image tag to include arch for non-sha based
   444  // tags.
   445  func (i *CAImages) Override(requested *CAImages, registryURL string, arch string) {
   446  	// If requested is nil, we are only interested in properly prepending registry
   447  	// URL to the image and with overriding default values so a empty struct is initialized.
   448  	if requested == nil {
   449  		requested = &CAImages{}
   450  	}
   451  
   452  	// Images
   453  	i.CAInitImage = image.GetImage(registryURL, i.CAInitImage, requested.CAInitImage)
   454  	i.CAImage = image.GetImage(registryURL, i.CAImage, requested.CAImage)
   455  	i.HSMImage = image.GetImage(registryURL, i.HSMImage, requested.HSMImage)
   456  	i.EnrollerImage = image.GetImage(registryURL, i.EnrollerImage, requested.EnrollerImage)
   457  
   458  	// Tags
   459  	i.CAInitTag = image.GetTag(arch, i.CAInitTag, requested.CAInitTag)
   460  	i.CATag = image.GetTag(arch, i.CATag, requested.CATag)
   461  	i.HSMTag = image.GetTag(arch, i.HSMTag, requested.HSMTag)
   462  	i.EnrollerTag = image.GetTag(arch, i.EnrollerTag, requested.EnrollerTag)
   463  
   464  	// Digests
   465  	i.CAInitDigest = image.GetTag(arch, i.CAInitDigest, requested.CAInitDigest)
   466  	i.CADigest = image.GetTag(arch, i.CADigest, requested.CADigest)
   467  	i.HSMDigest = image.GetTag(arch, i.HSMDigest, requested.HSMDigest)
   468  	i.EnrollerDigest = image.GetTag(arch, i.EnrollerDigest, requested.EnrollerDigest)
   469  }
   470  
   471  func (i *PeerImages) Override(requested *PeerImages, registryURL string, arch string) {
   472  	if requested == nil {
   473  		requested = &PeerImages{}
   474  	}
   475  
   476  	// Images
   477  	i.PeerInitImage = image.GetImage(registryURL, i.PeerInitImage, requested.PeerInitImage)
   478  	i.PeerImage = image.GetImage(registryURL, i.PeerImage, requested.PeerImage)
   479  	i.CouchDBImage = image.GetImage(registryURL, i.CouchDBImage, requested.CouchDBImage)
   480  	i.DindImage = image.GetImage(registryURL, i.DindImage, requested.DindImage)
   481  	i.GRPCWebImage = image.GetImage(registryURL, i.GRPCWebImage, requested.GRPCWebImage)
   482  	i.FluentdImage = image.GetImage(registryURL, i.FluentdImage, requested.FluentdImage)
   483  	i.CCLauncherImage = image.GetImage(registryURL, i.CCLauncherImage, requested.CCLauncherImage)
   484  	i.FileTransferImage = image.GetImage(registryURL, i.FileTransferImage, requested.FileTransferImage)
   485  	i.BuilderImage = image.GetImage(registryURL, i.BuilderImage, requested.BuilderImage)
   486  	i.GoEnvImage = image.GetImage(registryURL, i.GoEnvImage, requested.GoEnvImage)
   487  	i.JavaEnvImage = image.GetImage(registryURL, i.JavaEnvImage, requested.JavaEnvImage)
   488  	i.NodeEnvImage = image.GetImage(registryURL, i.NodeEnvImage, requested.NodeEnvImage)
   489  	i.HSMImage = image.GetImage(registryURL, i.HSMImage, requested.HSMImage)
   490  	i.EnrollerImage = image.GetImage(registryURL, i.EnrollerImage, requested.EnrollerImage)
   491  
   492  	// Tags
   493  	i.PeerInitTag = image.GetTag(arch, i.PeerInitTag, requested.PeerInitTag)
   494  	i.PeerTag = image.GetTag(arch, i.PeerTag, requested.PeerTag)
   495  	i.CouchDBTag = image.GetTag(arch, i.CouchDBTag, requested.CouchDBTag)
   496  	i.DindTag = image.GetTag(arch, i.DindTag, requested.DindTag)
   497  	i.GRPCWebTag = image.GetTag(arch, i.GRPCWebTag, requested.GRPCWebTag)
   498  	i.FluentdTag = image.GetTag(arch, i.FluentdTag, requested.FluentdTag)
   499  	i.CCLauncherTag = image.GetTag(arch, i.CCLauncherTag, requested.CCLauncherTag)
   500  	i.FileTransferTag = image.GetTag(arch, i.FileTransferTag, requested.FileTransferTag)
   501  	i.BuilderTag = image.GetTag(arch, i.BuilderTag, requested.BuilderTag)
   502  	i.GoEnvTag = image.GetTag(arch, i.GoEnvTag, requested.GoEnvTag)
   503  	i.JavaEnvTag = image.GetTag(arch, i.JavaEnvTag, requested.JavaEnvTag)
   504  	i.NodeEnvTag = image.GetTag(arch, i.NodeEnvTag, requested.NodeEnvTag)
   505  	i.HSMTag = image.GetTag(arch, i.HSMTag, requested.HSMTag)
   506  	i.EnrollerTag = image.GetTag(arch, i.EnrollerTag, requested.EnrollerTag)
   507  
   508  	// Digests
   509  	i.PeerInitDigest = image.GetTag(arch, i.PeerInitDigest, requested.PeerInitDigest)
   510  	i.PeerDigest = image.GetTag(arch, i.PeerDigest, requested.PeerDigest)
   511  	i.CouchDBDigest = image.GetTag(arch, i.CouchDBDigest, requested.CouchDBDigest)
   512  	i.DindDigest = image.GetTag(arch, i.DindDigest, requested.DindDigest)
   513  	i.GRPCWebDigest = image.GetTag(arch, i.GRPCWebDigest, requested.GRPCWebDigest)
   514  	i.FluentdDigest = image.GetTag(arch, i.FluentdDigest, requested.FluentdDigest)
   515  	i.CCLauncherDigest = image.GetTag(arch, i.CCLauncherDigest, requested.CCLauncherDigest)
   516  	i.FileTransferDigest = image.GetTag(arch, i.FileTransferDigest, requested.FileTransferDigest)
   517  	i.BuilderDigest = image.GetTag(arch, i.BuilderDigest, requested.BuilderDigest)
   518  	i.GoEnvDigest = image.GetTag(arch, i.GoEnvDigest, requested.GoEnvDigest)
   519  	i.JavaEnvDigest = image.GetTag(arch, i.JavaEnvDigest, requested.JavaEnvDigest)
   520  	i.NodeEnvDigest = image.GetTag(arch, i.NodeEnvDigest, requested.NodeEnvDigest)
   521  	i.HSMDigest = image.GetTag(arch, i.HSMDigest, requested.HSMDigest)
   522  	i.EnrollerDigest = image.GetTag(arch, i.EnrollerDigest, requested.EnrollerDigest)
   523  }
   524  
   525  func (i *OrdererImages) Override(requested *OrdererImages, registryURL string, arch string) {
   526  	if requested == nil {
   527  		requested = &OrdererImages{}
   528  	}
   529  	// Images
   530  	i.GRPCWebImage = image.GetImage(registryURL, i.GRPCWebImage, requested.GRPCWebImage)
   531  	i.OrdererInitImage = image.GetImage(registryURL, i.OrdererInitImage, requested.OrdererInitImage)
   532  	i.OrdererImage = image.GetImage(registryURL, i.OrdererImage, requested.OrdererImage)
   533  	i.HSMImage = image.GetImage(registryURL, i.HSMImage, requested.HSMImage)
   534  	i.EnrollerImage = image.GetImage(registryURL, i.EnrollerImage, requested.EnrollerImage)
   535  
   536  	// Tags
   537  	i.GRPCWebTag = image.GetTag(arch, i.GRPCWebTag, requested.GRPCWebTag)
   538  	i.OrdererInitTag = image.GetTag(arch, i.OrdererInitTag, requested.OrdererInitTag)
   539  	i.OrdererTag = image.GetTag(arch, i.OrdererTag, requested.OrdererTag)
   540  	i.HSMTag = image.GetTag(arch, i.HSMTag, requested.HSMTag)
   541  	i.EnrollerTag = image.GetTag(arch, i.EnrollerTag, requested.EnrollerTag)
   542  
   543  	// Digests
   544  	i.GRPCWebDigest = image.GetTag(arch, i.GRPCWebDigest, requested.GRPCWebDigest)
   545  	i.OrdererInitDigest = image.GetTag(arch, i.OrdererInitDigest, requested.OrdererInitDigest)
   546  	i.OrdererDigest = image.GetTag(arch, i.OrdererDigest, requested.OrdererDigest)
   547  	i.HSMDigest = image.GetTag(arch, i.HSMDigest, requested.HSMDigest)
   548  	i.EnrollerDigest = image.GetTag(arch, i.EnrollerDigest, requested.EnrollerDigest)
   549  }