Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ app-sre-saas-template: hypershift
# Run tests
.PHONY: test
test: build
$(GO) test -race -count=25 ./... -coverprofile cover.out
$(GO) test -race -count=25 -timeout=30m ./... -coverprofile cover.out

.PHONY: e2e
e2e:
Expand Down Expand Up @@ -216,13 +216,14 @@ ci-install-hypershift-private:
--oidc-storage-provider-s3-credentials=/etc/hypershift-pool-aws-credentials/credentials \
--oidc-storage-provider-s3-bucket-name=hypershift-ci-oidc \
--oidc-storage-provider-s3-region=us-east-1 \
--enable-webhook \
--enable-validating-webhook \
--private-platform=AWS \
--aws-private-creds=/etc/hypershift-pool-aws-credentials/credentials \
--aws-private-region=us-east-1 \
--external-dns-provider=aws \
--external-dns-credentials=/etc/hypershift-pool-aws-credentials/credentials \
--external-dns-domain-filter=service.ci.hypershift.devcluster.openshift.com
--external-dns-domain-filter=service.ci.hypershift.devcluster.openshift.com \
--wait-until-available

.PHONY: ci-test-e2e
ci-test-e2e:
Expand Down
24 changes: 8 additions & 16 deletions api/fixtures/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ import (

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/utils/pointer"

"github.com/openshift/hypershift/api/util/ipnet"
hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1 "github.com/openshift/hypershift/api/v1beta1"

configv1 "github.com/openshift/api/config/v1"
crclient "sigs.k8s.io/controller-runtime/pkg/client"
Expand Down Expand Up @@ -133,7 +132,7 @@ func (o ExampleOptions) Resources() *ExampleResources {
var resources []crclient.Object
var services []hyperv1.ServicePublishingStrategyMapping
var secretEncryption *hyperv1.SecretEncryptionSpec
var globalOpts []runtime.RawExtension
var proxyConfig *configv1.ProxySpec

switch {
case o.AWS != nil:
Expand Down Expand Up @@ -183,16 +182,10 @@ web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
}

if o.AWS.ProxyAddress != "" {
globalOpts = append(globalOpts, runtime.RawExtension{Object: &configv1.Proxy{
TypeMeta: metav1.TypeMeta{
APIVersion: configv1.GroupVersion.String(),
Kind: "Proxy",
},
Spec: configv1.ProxySpec{
HTTPProxy: o.AWS.ProxyAddress,
HTTPSProxy: o.AWS.ProxyAddress,
},
}})
proxyConfig = &configv1.ProxySpec{
HTTPProxy: o.AWS.ProxyAddress,
HTTPSProxy: o.AWS.ProxyAddress,
}
}

if kmsCredsSecret != nil {
Expand Down Expand Up @@ -390,7 +383,6 @@ web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
},
KubeCloudControllerCreds: corev1.LocalObjectReference{Name: powerVSResources.KubeCloudControllerCreds.Name},
NodePoolManagementCreds: corev1.LocalObjectReference{Name: powerVSResources.NodePoolManagementCreds.Name},
ControlPlaneOperatorCreds: corev1.LocalObjectReference{Name: powerVSResources.ControlPlaneOperatorCreds.Name},
IngressOperatorCloudCreds: corev1.LocalObjectReference{Name: powerVSResources.IngressOperatorCloudCreds.Name},
},
}
Expand Down Expand Up @@ -474,8 +466,8 @@ web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
cluster.Spec.Networking.MachineNetwork = []hyperv1.MachineNetworkEntry{{CIDR: *ipnet.MustParseCIDR(o.MachineCIDR)}}
}

if len(globalOpts) > 0 {
cluster.Spec.Configuration = &hyperv1.ClusterConfiguration{Items: globalOpts}
if proxyConfig != nil {
cluster.Spec.Configuration = &hyperv1.ClusterConfiguration{Proxy: proxyConfig}
}

var userCABundleCM *corev1.ConfigMap
Expand Down
2 changes: 1 addition & 1 deletion api/fixtures/example_aws.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fixtures

import (
hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1 "github.com/openshift/hypershift/api/v1beta1"
corev1 "k8s.io/api/core/v1"
crclient "sigs.k8s.io/controller-runtime/pkg/client"
)
Expand Down
3 changes: 2 additions & 1 deletion api/fixtures/example_ibmcloud_powervs.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fixtures

import (
hyperv1 "github.com/openshift/hypershift/api/v1beta1"
corev1 "k8s.io/api/core/v1"
crclient "sigs.k8s.io/controller-runtime/pkg/client"
)
Expand All @@ -22,7 +23,7 @@ type ExamplePowerVSOptions struct {

// nodepool related options
SysType string
ProcType string
ProcType hyperv1.PowerVSNodePoolProcType
Processors string
Memory int32
}
Expand Down
2 changes: 1 addition & 1 deletion api/fixtures/example_kubevirt.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
"strings"

hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1 "github.com/openshift/hypershift/api/v1beta1"
apiresource "k8s.io/apimachinery/pkg/api/resource"
)

Expand Down
6 changes: 4 additions & 2 deletions api/scheme.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import (
routev1 "github.com/openshift/api/route/v1"
securityv1 "github.com/openshift/api/security/v1"
agentv1 "github.com/openshift/cluster-api-provider-agent/api/v1alpha1"
hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1alpha1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1beta1 "github.com/openshift/hypershift/api/v1beta1"
prometheusoperatorv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
Expand Down Expand Up @@ -44,7 +45,8 @@ func init() {
capiaws.AddToScheme(Scheme)
capiibm.AddToScheme(Scheme)
clientgoscheme.AddToScheme(Scheme)
hyperv1.AddToScheme(Scheme)
hyperv1alpha1.AddToScheme(Scheme)
hyperv1beta1.AddToScheme(Scheme)
capiv1.AddToScheme(Scheme)
configv1.AddToScheme(Scheme)
operatorv1.AddToScheme(Scheme)
Expand Down
112 changes: 26 additions & 86 deletions support/globalconfig/globalconfig.go → api/util/configrefs/refs.go
Original file line number Diff line number Diff line change
@@ -1,102 +1,42 @@
package globalconfig
package configrefs

import (
"context"
"fmt"

configv1 "github.com/openshift/api/config/v1"
"k8s.io/apimachinery/pkg/util/sets"
ctrl "sigs.k8s.io/controller-runtime"

hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
"github.com/openshift/hypershift/support/api"
)

type GlobalConfig struct {
APIServer *configv1.APIServer
Authentication *configv1.Authentication
FeatureGate *configv1.FeatureGate
Image *configv1.Image
Ingress *configv1.Ingress
Network *configv1.Network
OAuth *configv1.OAuth
Scheduler *configv1.Scheduler
Proxy *configv1.Proxy
Build *configv1.Build
Project *configv1.Project
}

type ObservedConfig struct {
Image *configv1.Image
Build *configv1.Build
Project *configv1.Project
}

func ParseGlobalConfig(ctx context.Context, cfg *hyperv1.ClusterConfiguration) (GlobalConfig, error) {
globalConfig := GlobalConfig{}
if cfg == nil {
return globalConfig, nil
}
kinds := sets.NewString() // keeps track of which kinds have been found
for i, cfg := range cfg.Items {
cfgObject, gvk, err := api.TolerantYAMLSerializer.Decode(cfg.Raw, nil, nil)
if err != nil {
return globalConfig, fmt.Errorf("cannot parse configuration at index %d: %w", i, err)
}
if gvk.GroupVersion().String() != configv1.GroupVersion.String() {
return globalConfig, fmt.Errorf("invalid resource type found in configuration: kind: %s, apiVersion: %s", gvk.Kind, gvk.GroupVersion().String())
}
if kinds.Has(gvk.Kind) {
return globalConfig, fmt.Errorf("duplicate config type found: %s", gvk.Kind)
}
kinds.Insert(gvk.Kind)
switch obj := cfgObject.(type) {
case *configv1.APIServer:
if obj.Spec.Audit.Profile == "" {
// Populate kubebuilder default for comparison
// https://github.com/openshift/api/blob/f120778bee805ad1a7a4f05a6430332cf5811813/config/v1/types_apiserver.go#L57
obj.Spec.Audit.Profile = configv1.DefaultAuditProfileType
}
globalConfig.APIServer = obj
case *configv1.Authentication:
globalConfig.Authentication = obj
case *configv1.FeatureGate:
globalConfig.FeatureGate = obj
case *configv1.Ingress:
globalConfig.Ingress = obj
case *configv1.Network:
globalConfig.Network = obj
case *configv1.OAuth:
globalConfig.OAuth = obj
case *configv1.Scheduler:
globalConfig.Scheduler = obj
case *configv1.Proxy:
globalConfig.Proxy = obj
default:
log := ctrl.LoggerFrom(ctx)
log.Info("WARNING: unrecognized config found", "kind", gvk.Kind)
}
}
return globalConfig, nil
// ClusterConfiguration is an interface for the ClusterConfiguration type in the API
// It is needed to avoid a circular import reference, given that this package is
// used by the conversion code in the API package.
type ClusterConfiguration interface {
GetAPIServer() *configv1.APIServerSpec
GetAuthentication() *configv1.AuthenticationSpec
GetFeatureGate() *configv1.FeatureGateSpec
GetImage() *configv1.ImageSpec
GetIngress() *configv1.IngressSpec
GetNetwork() *configv1.NetworkSpec
GetOAuth() *configv1.OAuthSpec
GetScheduler() *configv1.SchedulerSpec
GetProxy() *configv1.ProxySpec
}

func SecretRefs(cfg *hyperv1.ClusterConfiguration) []string {
func SecretRefs(cfg ClusterConfiguration) []string {
result := sets.NewString()
result = result.Union(apiServerSecretRefs(cfg.APIServer))
result = result.Union(authenticationSecretRefs(cfg.Authentication))
result = result.Union(ingressSecretRefs(cfg.Ingress))
result = result.Union(oauthSecretRefs(cfg.OAuth))
result = result.Union(apiServerSecretRefs(cfg.GetAPIServer()))
result = result.Union(authenticationSecretRefs(cfg.GetAuthentication()))
result = result.Union(ingressSecretRefs(cfg.GetIngress()))
result = result.Union(oauthSecretRefs(cfg.GetOAuth()))
return result.List()
}

func ConfigMapRefs(cfg *hyperv1.ClusterConfiguration) []string {
func ConfigMapRefs(cfg ClusterConfiguration) []string {
result := sets.NewString()
result = result.Union(apiServerConfigMapRefs(cfg.APIServer))
result = result.Union(authenticationConfigMapRefs(cfg.Authentication))
result = result.Union(imageConfigMapRefs(cfg.Image))
result = result.Union(oauthConfigMapRefs(cfg.OAuth))
result = result.Union(proxyConfigMapRefs(cfg.Proxy))
result = result.Union(schedulerConfigMapRefs(cfg.Scheduler))
result = result.Union(apiServerConfigMapRefs(cfg.GetAPIServer()))
result = result.Union(authenticationConfigMapRefs(cfg.GetAuthentication()))
result = result.Union(imageConfigMapRefs(cfg.GetImage()))
result = result.Union(oauthConfigMapRefs(cfg.GetOAuth()))
result = result.Union(proxyConfigMapRefs(cfg.GetProxy()))
result = result.Union(schedulerConfigMapRefs(cfg.GetScheduler()))
return result.List()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,15 @@
package globalconfig
package configrefs

import (
"context"
"reflect"
"testing"

"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/sets"

configv1 "github.com/openshift/api/config/v1"
hyperv1 "github.com/openshift/hypershift/api/v1alpha1"
hyperv1 "github.com/openshift/hypershift/api/v1beta1"
)

var featureGateBytes = `
apiVersion: config.openshift.io/v1
kind: FeatureGate
metadata:
name: cluster
spec:
featureSet: LatencySensitive
unknownField: example
`

func TestParseGlobalConfig(t *testing.T) {
config := &hyperv1.ClusterConfiguration{
Items: []runtime.RawExtension{
{
Raw: []byte(featureGateBytes),
},
},
}

globalConfig, err := ParseGlobalConfig(context.Background(), config)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if globalConfig.FeatureGate == nil {
t.Fatalf("feature gate config not found")
}
if globalConfig.FeatureGate.Spec.FeatureSet != configv1.LatencySensitive {
t.Errorf("unexpected featureset: %q", globalConfig.FeatureGate.Spec.FeatureSet)
}
}

func TestKnownConfigMapRefs(t *testing.T) {
actual := findRefs(reflect.TypeOf(hyperv1.ClusterConfiguration{}), "", "ConfigMapNameReference")
expected := sets.NewString(
Expand Down
9 changes: 8 additions & 1 deletion api/util/ipnet/ipnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
)

var nullString = "null"
var nilString = "<nil>"
var nullBytes = []byte(nullString)

// IPNet wraps net.IPNet to get CIDR serialization.
Expand Down Expand Up @@ -42,7 +43,7 @@ func (ipnet *IPNet) String() string {

// MarshalJSON interface for an IPNet
func (ipnet *IPNet) MarshalJSON() (data []byte, err error) {
if len(ipnet.IP) == 0 {
if ipnet == nil || len(ipnet.IP) == 0 {
return nullBytes, nil
}

Expand All @@ -63,6 +64,12 @@ func (ipnet *IPNet) UnmarshalJSON(b []byte) (err error) {
return fmt.Errorf("could not unmarshal string: %w", err)
}

if cidr == nilString {
ipnet.IP = net.IP{}
ipnet.Mask = net.IPMask{}
return nil
}

parsedIPNet, err := ParseCIDR(cidr)
if err != nil {
return fmt.Errorf("could not parse cidr %s: %w", cidr, err)
Expand Down
15 changes: 15 additions & 0 deletions api/v1alpha1/clusterconfig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package v1alpha1

import configv1 "github.com/openshift/api/config/v1"

func (c *ClusterConfiguration) GetAPIServer() *configv1.APIServerSpec { return c.APIServer }
func (c *ClusterConfiguration) GetAuthentication() *configv1.AuthenticationSpec {
return c.Authentication
}
func (c *ClusterConfiguration) GetFeatureGate() *configv1.FeatureGateSpec { return c.FeatureGate }
func (c *ClusterConfiguration) GetImage() *configv1.ImageSpec { return c.Image }
func (c *ClusterConfiguration) GetIngress() *configv1.IngressSpec { return c.Ingress }
func (c *ClusterConfiguration) GetNetwork() *configv1.NetworkSpec { return c.Network }
func (c *ClusterConfiguration) GetOAuth() *configv1.OAuthSpec { return c.OAuth }
func (c *ClusterConfiguration) GetScheduler() *configv1.SchedulerSpec { return c.Scheduler }
func (c *ClusterConfiguration) GetProxy() *configv1.ProxySpec { return c.Proxy }
4 changes: 2 additions & 2 deletions api/v1alpha1/endpointservice_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,12 @@ type AWSEndpointServiceStatus struct {
// and the error reported in the message.
//
// Current condition types are: "Available"
Conditions []metav1.Condition `json:"conditions"`
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:path=awsendpointservices,scope=Namespaced
// +kubebuilder:storageversion
// +kubebuilder:subresource:status
// AWSEndpointService specifies a request for an Endpoint Service in AWS
type AWSEndpointService struct {
Expand Down
Loading