2022-07-18 10:48:00 +00:00
//
// DISCLAIMER
//
2024-02-08 14:25:48 +00:00
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
2022-07-18 10:48:00 +00:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
"context"
2023-11-15 09:20:18 +00:00
"fmt"
2022-07-18 10:48:00 +00:00
"os"
2023-11-15 09:20:18 +00:00
"strconv"
"strings"
2022-07-18 10:48:00 +00:00
"time"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/crd"
2023-11-15 09:20:18 +00:00
"github.com/arangodb/kube-arangodb/pkg/crd/crds"
2024-02-08 14:25:48 +00:00
"github.com/arangodb/kube-arangodb/pkg/util/errors"
2022-07-18 10:48:00 +00:00
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
2024-04-29 09:56:10 +00:00
"github.com/arangodb/kube-arangodb/pkg/util/shutdown"
2022-07-18 10:48:00 +00:00
)
var (
cmdCRD = & cobra . Command {
Use : "crd" ,
Run : executeUsage ,
Short : "CRD operations" ,
}
cmdCRDInstall = & cobra . Command {
Use : "install" ,
Run : cmdCRDInstallRun ,
Short : "Install and update all required CRDs" ,
}
)
2023-11-15 09:20:18 +00:00
var (
crdInstallOptions struct {
validationSchema [ ] string
2024-03-22 10:37:31 +00:00
force bool
2023-11-15 09:20:18 +00:00
}
)
var (
defaultValidationSchemaEnabled [ ] string
)
2022-07-18 10:48:00 +00:00
func init ( ) {
cmdMain . AddCommand ( cmdCRD )
cmdOps . AddCommand ( cmdCRD )
2023-11-15 09:20:18 +00:00
f := cmdCRDInstall . Flags ( )
f . StringArrayVar ( & crdInstallOptions . validationSchema , "crd.validation-schema" , defaultValidationSchemaEnabled , "Controls which CRD should have validation schema <crd-name>=<true/false>." )
2024-03-22 10:37:31 +00:00
f . BoolVar ( & crdInstallOptions . force , "crd.force-update" , false , "Enforce CRD Schema update" )
2022-07-18 10:48:00 +00:00
cmdCRD . AddCommand ( cmdCRDInstall )
}
2023-11-15 09:20:18 +00:00
func prepareCRDOptions ( schemaEnabledArgs [ ] string ) ( map [ string ] crds . CRDOptions , error ) {
defaultOptions := crd . GetDefaultCRDOptions ( )
result := make ( map [ string ] crds . CRDOptions )
var err error
for _ , arg := range schemaEnabledArgs {
parts := strings . Split ( arg , "=" )
crdName := parts [ 0 ]
opts , ok := defaultOptions [ crdName ]
if ! ok {
return nil , fmt . Errorf ( "unknown CRD %s" , crdName )
}
if len ( parts ) == 2 {
opts . WithSchema , err = strconv . ParseBool ( parts [ 1 ] )
if err != nil {
return nil , errors . Wrapf ( err , "not a bool value: %s" , parts [ 1 ] )
}
}
result [ crdName ] = opts
}
return result , nil
}
2022-07-18 10:48:00 +00:00
func cmdCRDInstallRun ( cmd * cobra . Command , args [ ] string ) {
2023-11-15 09:20:18 +00:00
crdOpts , err := prepareCRDOptions ( crdInstallOptions . validationSchema )
if err != nil {
logger . Fatal ( "Invalid --crd.validation-schema args: %s" , err )
return
}
2022-07-18 10:48:00 +00:00
client , ok := kclient . GetDefaultFactory ( ) . Client ( )
if ! ok {
logger . Fatal ( "Failed to get client" )
2023-11-15 09:20:18 +00:00
return
2022-07-18 10:48:00 +00:00
}
2024-04-29 09:56:10 +00:00
ctx , cancel := context . WithTimeout ( shutdown . Context ( ) , time . Minute )
2022-07-18 10:48:00 +00:00
defer cancel ( )
2024-03-22 10:37:31 +00:00
err = crd . EnsureCRDWithOptions ( ctx , client , crd . EnsureCRDOptions { IgnoreErrors : false , CRDOptions : crdOpts , ForceUpdate : crdInstallOptions . force } )
2022-07-18 10:48:00 +00:00
if err != nil {
os . Exit ( 1 )
}
}