diff --git a/go.mod b/go.mod index fb4c4a68ab1..7a468216ad0 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/clarketm/json v1.14.1 github.com/containers/image v3.0.2+incompatible github.com/coreos/ignition/v2 v2.9.0 - github.com/coreos/stream-metadata-go v0.1.3 + github.com/coreos/stream-metadata-go v0.1.8 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/go-playground/validator/v10 v10.2.0 github.com/golang/mock v1.6.0 @@ -87,6 +87,32 @@ require ( sigs.k8s.io/controller-tools v0.8.0 ) +require ( + github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/zclconf/go-cty v1.10.0 // indirect + go.mongodb.org/mongo-driver v1.8.3 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/mod v0.4.2 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/go-playground/validator.v9 v9.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + k8s.io/component-base v0.23.0 // indirect + k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect + sigs.k8s.io/controller-runtime v0.11.0 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) + require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect @@ -129,7 +155,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/renameio v1.0.0 // indirect github.com/googleapis/gax-go/v2 v2.0.5 // indirect github.com/googleapis/gnostic v0.5.5 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -164,29 +189,6 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect github.com/satori/go.uuid v1.2.0 // indirect - github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/zclconf/go-cty v1.10.0 // indirect - go.mongodb.org/mongo-driver v1.8.3 // indirect - go.opencensus.io v0.23.0 // indirect - golang.org/x/mod v0.4.2 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/go-playground/validator.v9 v9.31.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - k8s.io/component-base v0.23.0 // indirect - k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - sigs.k8s.io/controller-runtime v0.11.0 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) // OpenShift Forks diff --git a/go.sum b/go.sum index 4093daa8df8..02013398288 100644 --- a/go.sum +++ b/go.sum @@ -308,8 +308,8 @@ github.com/coreos/ignition/v2 v2.9.0/go.mod h1:A5lFFzA2/zvZQPVEvI1lR5WPLWRb7KZ7Q github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/stream-metadata-go v0.1.3 h1:i/mUQBANlYirNAU4ybH6x/SCuc/Rh6uiopph6XZhROk= -github.com/coreos/stream-metadata-go v0.1.3/go.mod h1:zxVoWUDB0H8+tZRhTs0LeLeR/QdmBsuo7FN1oOBrWTE= +github.com/coreos/stream-metadata-go v0.1.8 h1:EbLlLia+Ekuqgh8nF4NNFs0jUqmhUbN4mWd1O8u8TQE= +github.com/coreos/stream-metadata-go v0.1.8/go.mod h1:RTjQyHgO/G37oJ3qnqYK6Z4TPZ5EsaabOtfMjVXmgko= github.com/coreos/vcontext v0.0.0-20190529201340-22b159166068/go.mod h1:E+6hug9bFSe0KZ2ZAzr8M9F5JlArJjv5D1JS7KSkPKE= github.com/coreos/vcontext v0.0.0-20191017033345-260217907eb5/go.mod h1:E+6hug9bFSe0KZ2ZAzr8M9F5JlArJjv5D1JS7KSkPKE= github.com/coreos/vcontext v0.0.0-20201120045928-b0e13dab675c h1:jA28WeORitsxGFVWhyWB06sAG2HbLHPQuHwDydhU2CQ= @@ -766,8 +766,6 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/renameio v1.0.0 h1:xhp2CnJmgQmpJU4RY8chagahUq5mbPPAbiSQstKpVMA= -github.com/google/renameio v1.0.0/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v0.0.0-20170306145142-6a5e28554805/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/pkg/asset/cluster/tfvars.go b/pkg/asset/cluster/tfvars.go index 7adbbaa176d..2ada7af0b2f 100644 --- a/pkg/asset/cluster/tfvars.go +++ b/pkg/asset/cluster/tfvars.go @@ -14,6 +14,7 @@ import ( libvirtprovider "github.com/openshift/cluster-api-provider-libvirt/pkg/apis/libvirtproviderconfig/v1beta1" ovirtprovider "github.com/openshift/cluster-api-provider-ovirt/pkg/apis/ovirtprovider/v1beta1" nutanixprovider "github.com/openshift/machine-api-provider-nutanix/pkg/apis/nutanixprovider/v1beta1" + powervsprovider "github.com/openshift/machine-api-provider-powervs/pkg/apis/powervsprovider/v1alpha1" "github.com/pkg/errors" "github.com/sirupsen/logrus" awsprovider "sigs.k8s.io/cluster-api-provider-aws/pkg/apis/awsprovider/v1beta1" @@ -47,6 +48,7 @@ import ( nutanixtfvars "github.com/openshift/installer/pkg/tfvars/nutanix" openstacktfvars "github.com/openshift/installer/pkg/tfvars/openstack" ovirttfvars "github.com/openshift/installer/pkg/tfvars/ovirt" + powervstfvars "github.com/openshift/installer/pkg/tfvars/powervs" vspheretfvars "github.com/openshift/installer/pkg/tfvars/vsphere" "github.com/openshift/installer/pkg/types" "github.com/openshift/installer/pkg/types/alibabacloud" @@ -60,6 +62,7 @@ import ( "github.com/openshift/installer/pkg/types/nutanix" "github.com/openshift/installer/pkg/types/openstack" "github.com/openshift/installer/pkg/types/ovirt" + "github.com/openshift/installer/pkg/types/powervs" "github.com/openshift/installer/pkg/types/vsphere" ) @@ -676,6 +679,51 @@ func (t *TerraformVariables) Generate(parents asset.Parents) error { Filename: TfPlatformVarsFileName, Data: data, }) + case powervs.Name: + client, err := installConfig.PowerVS.Client() + if err != nil { + return err + } + + masters, err := mastersAsset.Machines() + if err != nil { + return err + } + + // Get CISInstanceCRN from InstallConfig metadata + crn, err := installConfig.PowerVS.CISInstanceCRN(ctx) + if err != nil { + return err + } + + masterConfigs := make([]*powervsprovider.PowerVSMachineProviderConfig, len(masters)) + for i, m := range masters { + masterConfigs[i] = m.Spec.ProviderSpec.Value.Object.(*powervsprovider.PowerVSMachineProviderConfig) + } + + data, err = powervstfvars.TFVars( + powervstfvars.TFVarsSources{ + MasterConfigs: masterConfigs, + Region: installConfig.Config.Platform.PowerVS.Region, + Zone: installConfig.Config.Platform.PowerVS.Zone, + APIKey: client.APIKey, + SSHKey: installConfig.Config.SSHKey, + PowerVSResourceGroup: installConfig.Config.PowerVS.PowerVSResourceGroup, + ImageBucketFileName: string(*rhcosImage), + NetworkName: installConfig.Config.PowerVS.PVSNetworkName, + CISInstanceCRN: crn, + VPCSubnetName: installConfig.Config.PowerVS.Subnets[0], + VPCName: installConfig.Config.PowerVS.VPC, + }, + ) + if err != nil { + return errors.Wrapf(err, "failed to get %s Terraform variables", platform) + } + t.FileList = append(t.FileList, &asset.File{ + Filename: TfPlatformVarsFileName, + Data: data, + }) + case vsphere.Name: controlPlanes, err := mastersAsset.Machines() if err != nil { diff --git a/pkg/asset/installconfig/powervs/client.go b/pkg/asset/installconfig/powervs/client.go index ec4094d4bcf..d02afca735e 100644 --- a/pkg/asset/installconfig/powervs/client.go +++ b/pkg/asset/installconfig/powervs/client.go @@ -3,7 +3,6 @@ package powervs import ( "context" "fmt" - "os" "time" "github.com/IBM/go-sdk-core/v5/core" @@ -55,9 +54,13 @@ type DNSZoneResponse struct { // NewClient initializes a client with a session. func NewClient() (*Client, error) { - apiKey := os.Getenv("IC_API_KEY") + ssn, err := GetSession() + if err != nil { + return nil, err + } + client := &Client{ - APIKey: apiKey, + APIKey: ssn.APIKey, } if err := client.loadSDKServices(); err != nil { diff --git a/pkg/asset/installconfig/powervs/session.go b/pkg/asset/installconfig/powervs/session.go index 885f8e46db5..af7389093ca 100644 --- a/pkg/asset/installconfig/powervs/session.go +++ b/pkg/asset/installconfig/powervs/session.go @@ -75,9 +75,6 @@ func getPISession() (*ibmpisession.IBMPISession, string, error) { return nil, "", err } - // This is needed by ibmcloud code to gather DNS information later. - os.Setenv("IC_API_KEY", pisv.APIKey) - piOpts := ibmpisession.IBMPIOptions{ Authenticator: &core.IamAuthenticator{ ApiKey: pisv.APIKey, diff --git a/pkg/asset/rhcos/image.go b/pkg/asset/rhcos/image.go index dcd6e02c218..c4682912df0 100644 --- a/pkg/asset/rhcos/image.go +++ b/pkg/asset/rhcos/image.go @@ -25,6 +25,7 @@ import ( "github.com/openshift/installer/pkg/types/nutanix" "github.com/openshift/installer/pkg/types/openstack" "github.com/openshift/installer/pkg/types/ovirt" + "github.com/openshift/installer/pkg/types/powervs" "github.com/openshift/installer/pkg/types/vsphere" ) @@ -163,6 +164,20 @@ func osImage(config *types.InstallConfig) (string, error) { return "", err } return osimage, nil + case powervs.Name: + // Check for image URL override + if config.Platform.PowerVS.ClusterOSImage != "" { + return config.Platform.PowerVS.ClusterOSImage, nil + } + + if streamArch.Images.PowerVS != nil { + vpcRegion := powervs.Regions[config.Platform.PowerVS.Region].VPCRegion + img := streamArch.Images.PowerVS.Regions[vpcRegion] + logrus.Debug("Power VS using image ", img.Object) + return img.Object, nil + } + + return "", fmt.Errorf("%s: No Power VS build found", st.FormatPrefix(archName)) case none.Name: return "", nil case nutanix.Name: diff --git a/pkg/terraform/stages/platform/stages.go b/pkg/terraform/stages/platform/stages.go index 0a2ee0b29b6..eff65f51288 100644 --- a/pkg/terraform/stages/platform/stages.go +++ b/pkg/terraform/stages/platform/stages.go @@ -14,6 +14,7 @@ import ( "github.com/openshift/installer/pkg/terraform/stages/nutanix" "github.com/openshift/installer/pkg/terraform/stages/openstack" "github.com/openshift/installer/pkg/terraform/stages/ovirt" + "github.com/openshift/installer/pkg/terraform/stages/powervs" "github.com/openshift/installer/pkg/terraform/stages/vsphere" alibabacloudtypes "github.com/openshift/installer/pkg/types/alibabacloud" awstypes "github.com/openshift/installer/pkg/types/aws" @@ -25,6 +26,7 @@ import ( nutanixtypes "github.com/openshift/installer/pkg/types/nutanix" openstacktypes "github.com/openshift/installer/pkg/types/openstack" ovirttypes "github.com/openshift/installer/pkg/types/ovirt" + powervstypes "github.com/openshift/installer/pkg/types/powervs" vspheretypes "github.com/openshift/installer/pkg/types/vsphere" ) @@ -49,6 +51,8 @@ func StagesForPlatform(platform string) []terraform.Stage { return libvirt.PlatformStages case nutanixtypes.Name: return nutanix.PlatformStages + case powervstypes.Name: + return powervs.PlatformStages case openstacktypes.Name: return openstack.PlatformStages case ovirttypes.Name: diff --git a/pkg/terraform/stages/powervs/stages.go b/pkg/terraform/stages/powervs/stages.go new file mode 100644 index 00000000000..6c86ce04caa --- /dev/null +++ b/pkg/terraform/stages/powervs/stages.go @@ -0,0 +1,17 @@ +package powervs + +import ( + "github.com/openshift/installer/pkg/terraform" + "github.com/openshift/installer/pkg/terraform/providers" + "github.com/openshift/installer/pkg/terraform/stages" +) + +// PlatformStages are the stages to run to provision the infrastructure in PowerVS. +var PlatformStages = []terraform.Stage{ + stages.NewStage("powervs", + "cluster", + []providers.Provider{providers.IBM, providers.Ignition}), + stages.NewStage("powervs", + "post-install", + []providers.Provider{providers.IBM}), +} diff --git a/pkg/tfvars/powervs/powervs.go b/pkg/tfvars/powervs/powervs.go new file mode 100644 index 00000000000..e5791b6f9bb --- /dev/null +++ b/pkg/tfvars/powervs/powervs.go @@ -0,0 +1,87 @@ +// Package powervs contains Power Virtual Servers-specific Terraform-variable logic. +package powervs + +import ( + "encoding/json" + "fmt" + "math/rand" + "time" + + "github.com/openshift/installer/pkg/types/powervs" + "github.com/openshift/machine-api-provider-powervs/pkg/apis/powervsprovider/v1alpha1" +) + +type config struct { + ServiceInstanceID string `json:"powervs_cloud_instance_id"` + APIKey string `json:"powervs_api_key"` + SSHKey string `json:"powervs_ssh_key"` + PowerVSRegion string `json:"powervs_region"` + PowerVSZone string `json:"powervs_zone"` + VPCRegion string `json:"powervs_vpc_region"` + VPCZone string `json:"powervs_vpc_zone"` + PowerVSResourceGroup string `json:"powervs_resource_group"` + CISInstanceCRN string `json:"powervs_cis_crn"` + ImageBucketFileName string `json:"powervs_image_bucket_file_name"` + NetworkName string `json:"powervs_network_name"` + VPCName string `json:"powervs_vpc_name"` + VPCSubnetName string `json:"powervs_vpc_subnet_name"` + BootstrapMemory string `json:"powervs_bootstrap_memory"` + BootstrapProcessors string `json:"powervs_bootstrap_processors"` + MasterMemory string `json:"powervs_master_memory"` + MasterProcessors string `json:"powervs_master_processors"` + ProcType string `json:"powervs_proc_type"` + SysType string `json:"powervs_sys_type"` +} + +// TFVarsSources contains the parameters to be converted into Terraform variables +type TFVarsSources struct { + MasterConfigs []*v1alpha1.PowerVSMachineProviderConfig + APIKey string + SSHKey string + Region string + Zone string + ImageBucketFileName string + NetworkName string + PowerVSResourceGroup string + CISInstanceCRN string + VPCName string + VPCSubnetName string +} + +// TFVars generates Power VS-specific Terraform variables launching the cluster. +func TFVars(sources TFVarsSources) ([]byte, error) { + masterConfig := sources.MasterConfigs[0] + // TODO(mjturek): Allow user to specify vpcRegion in install config like we're doing for vpcZone + vpcRegion := powervs.Regions[sources.Region].VPCRegion + + // Randomly select a zone in the VPC region. + // @TODO: Align this with a region later. + rand.Seed(time.Now().UnixNano()) + // All supported Regions are MZRs and have Zones named "region-[1-3]" + vpcZone := fmt.Sprintf("%s-%d", vpcRegion, rand.Intn(3)) + + //@TODO: Add resource group to platform + cfg := &config{ + ServiceInstanceID: masterConfig.ServiceInstanceID, + APIKey: sources.APIKey, + SSHKey: sources.SSHKey, + PowerVSRegion: sources.Region, + PowerVSZone: sources.Zone, + VPCRegion: vpcRegion, + VPCZone: vpcZone, + PowerVSResourceGroup: sources.PowerVSResourceGroup, + CISInstanceCRN: sources.CISInstanceCRN, + ImageBucketFileName: sources.ImageBucketFileName, + NetworkName: *masterConfig.Network.Name, + VPCName: sources.VPCName, + VPCSubnetName: sources.VPCSubnetName, + BootstrapMemory: masterConfig.Memory, + BootstrapProcessors: masterConfig.Processors, + MasterMemory: masterConfig.Memory, + MasterProcessors: masterConfig.Processors, + ProcType: masterConfig.ProcType, + SysType: masterConfig.SysType, + } + + return json.MarshalIndent(cfg, "", " ") +} diff --git a/vendor/github.com/coreos/stream-metadata-go/stream/artifact_utils.go b/vendor/github.com/coreos/stream-metadata-go/stream/artifact_utils.go index 88f40ef7adc..e23886f03ee 100644 --- a/vendor/github.com/coreos/stream-metadata-go/stream/artifact_utils.go +++ b/vendor/github.com/coreos/stream-metadata-go/stream/artifact_utils.go @@ -4,12 +4,12 @@ import ( "crypto/sha256" "fmt" "io" + "io/ioutil" "net/http" "net/url" + "os" "path" "path/filepath" - - "github.com/google/renameio" ) // Fetch an artifact, validating its checksum. If applicable, @@ -63,26 +63,34 @@ func (a *Artifact) Download(destdir string) (string, error) { return "", err } destfile := filepath.Join(destdir, name) - w, err := renameio.TempFile("", destfile) + w, err := ioutil.TempFile(destdir, ".coreos-artifact-") if err != nil { return "", err } - + finalized := false defer func() { - // Ignore an error to unlink - _ = w.Cleanup() + if !finalized { + // Ignore an error to unlink + _ = os.Remove(w.Name()) + } }() - err = a.Fetch(w) - if err != nil { + + if err := a.Fetch(w); err != nil { return "", err } - if err := w.File.Chmod(0644); err != nil { + if err := w.Sync(); err != nil { return "", err } - err = w.CloseAtomicallyReplace() - if err != nil { + if err := w.Chmod(0644); err != nil { + return "", err + } + if err := w.Close(); err != nil { + return "", err + } + if err := os.Rename(w.Name(), destfile); err != nil { return "", err } + finalized = true return destfile, nil } diff --git a/vendor/github.com/coreos/stream-metadata-go/stream/stream.go b/vendor/github.com/coreos/stream-metadata-go/stream/stream.go index 216f5ff2d16..3f9b11c5018 100644 --- a/vendor/github.com/coreos/stream-metadata-go/stream/stream.go +++ b/vendor/github.com/coreos/stream-metadata-go/stream/stream.go @@ -45,16 +45,23 @@ type ImageFormat struct { // Artifact represents one image file, plus its metadata type Artifact struct { Location string `json:"location"` - Signature string `json:"signature"` + Signature string `json:"signature,omitempty"` Sha256 string `json:"sha256"` UncompressedSha256 string `json:"uncompressed-sha256,omitempty"` } +type KubeVirtContainerDisk struct { + Image string `json:"image"` +} + // Images contains images available in cloud providers type Images struct { - Aliyun *ReplicatedImage `json:"aliyun,omitempty"` - Aws *AwsImage `json:"aws,omitempty"` - Gcp *GcpImage `json:"gcp,omitempty"` + Aliyun *ReplicatedImage `json:"aliyun,omitempty"` + Aws *AwsImage `json:"aws,omitempty"` + Gcp *GcpImage `json:"gcp,omitempty"` + Ibmcloud *ReplicatedObject `json:"ibmcloud,omitempty"` + KubeVirt *KubeVirtContainerDisk `json:"kubevirt,omitempty"` + PowerVS *ReplicatedObject `json:"powervs,omitempty"` } // ReplicatedImage represents an image in all regions of an AWS-like cloud @@ -76,7 +83,21 @@ type AwsRegionImage = RegionImage // GcpImage represents a GCP cloud image type GcpImage struct { - Project string `json:"project,omitempty"` + Release string `json:"release"` + Project string `json:"project"` Family string `json:"family,omitempty"` - Name string `json:"name,omitempty"` + Name string `json:"name"` +} + +// ReplicatedObject represents an object in all regions of an IBMCloud-like cloud +type ReplicatedObject struct { + Regions map[string]RegionObject `json:"regions,omitempty"` +} + +// RegionObject represents an IBMCloud/PowerVS cloud image +type RegionObject struct { + Release string `json:"release"` + Object string `json:"object"` + Bucket string `json:"bucket"` + Url string `json:"url"` } diff --git a/vendor/github.com/google/renameio/.golangci.yml b/vendor/github.com/google/renameio/.golangci.yml deleted file mode 100644 index abfb6ca0a0f..00000000000 --- a/vendor/github.com/google/renameio/.golangci.yml +++ /dev/null @@ -1,5 +0,0 @@ -linters: - disable: - - errcheck - enable: - - gofmt diff --git a/vendor/github.com/google/renameio/CONTRIBUTING.md b/vendor/github.com/google/renameio/CONTRIBUTING.md deleted file mode 100644 index 939e5341e74..00000000000 --- a/vendor/github.com/google/renameio/CONTRIBUTING.md +++ /dev/null @@ -1,28 +0,0 @@ -# How to Contribute - -We'd love to accept your patches and contributions to this project. There are -just a few small guidelines you need to follow. - -## Contributor License Agreement - -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution; -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. - -## Code reviews - -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult -[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more -information on using pull requests. - -## Community Guidelines - -This project follows [Google's Open Source Community -Guidelines](https://opensource.google.com/conduct/). diff --git a/vendor/github.com/google/renameio/LICENSE b/vendor/github.com/google/renameio/LICENSE deleted file mode 100644 index d6456956733..00000000000 --- a/vendor/github.com/google/renameio/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/vendor/github.com/google/renameio/README.md b/vendor/github.com/google/renameio/README.md deleted file mode 100644 index 2c992f14e9e..00000000000 --- a/vendor/github.com/google/renameio/README.md +++ /dev/null @@ -1,61 +0,0 @@ -[![Build Status](https://github.com/google/renameio/workflows/Test/badge.svg)](https://github.com/google/renameio/actions?query=workflow%3ATest) -[![PkgGoDev](https://pkg.go.dev/badge/github.com/google/renameio)](https://pkg.go.dev/github.com/google/renameio) -[![Go Report Card](https://goreportcard.com/badge/github.com/google/renameio)](https://goreportcard.com/report/github.com/google/renameio) - -The `renameio` Go package provides a way to atomically create or replace a file or -symbolic link. - -## Atomicity vs durability - -`renameio` concerns itself *only* with atomicity, i.e. making sure applications -never see unexpected file content (a half-written file, or a 0-byte file). - -As a practical example, consider https://manpages.debian.org/: if there is a -power outage while the site is updating, we are okay with losing the manpages -which were being rendered at the time of the power outage. They will be added in -a later run of the software. We are not okay with having a manpage replaced by a -0-byte file under any circumstances, though. - -## Advantages of this package - -There are other packages for atomically replacing files, and sometimes ad-hoc -implementations can be found in programs. - -A naive approach to the problem is to create a temporary file followed by a call -to `os.Rename()`. However, there are a number of subtleties which make the -correct sequence of operations hard to identify: - -* The temporary file should be removed when an error occurs, but a remove must - not be attempted if the rename succeeded, as a new file might have been - created with the same name. This renders a throwaway `defer - os.Remove(t.Name())` insufficient; state must be kept. - -* The temporary file must be created on the same file system (same mount point) - for the rename to work, but the TMPDIR environment variable should still be - respected, e.g. to direct temporary files into a separate directory outside of - the webserver’s document root but on the same file system. - -* On POSIX operating systems, the - [`fsync`](https://manpages.debian.org/stretch/manpages-dev/fsync.2) system - call must be used to ensure that the `os.Rename()` call will not result in a - 0-length file. - -This package attempts to get all of these details right, provides an intuitive, -yet flexible API and caters to use-cases where high performance is required. - -## Windows support - -It is [not possible to reliably write files atomically on -Windows](https://github.com/golang/go/issues/22397#issuecomment-498856679), and -[`chmod` is not reliably supported by the Go standard library on -Windows](https://github.com/google/renameio/issues/17). - -As it is not possible to provide a correct implementation, this package does not -export any functions on Windows. - -## Disclaimer - -This is not an official Google product (experimental or otherwise), it -is just code that happens to be owned by Google. - -This project is not affiliated with the Go project. diff --git a/vendor/github.com/google/renameio/doc.go b/vendor/github.com/google/renameio/doc.go deleted file mode 100644 index 67416df4810..00000000000 --- a/vendor/github.com/google/renameio/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2018 Google Inc. -// -// 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. - -// Package renameio provides a way to atomically create or replace a file or -// symbolic link. -// -// Caveat: this package requires the file system rename(2) implementation to be -// atomic. Notably, this is not the case when using NFS with multiple clients: -// https://stackoverflow.com/a/41396801 -package renameio diff --git a/vendor/github.com/google/renameio/tempfile.go b/vendor/github.com/google/renameio/tempfile.go deleted file mode 100644 index 059033a0109..00000000000 --- a/vendor/github.com/google/renameio/tempfile.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2018 Google Inc. -// -// 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. - -// +build !windows - -package renameio - -import ( - "io/ioutil" - "os" - "path/filepath" -) - -// TempDir checks whether os.TempDir() can be used as a temporary directory for -// later atomically replacing files within dest. If no (os.TempDir() resides on -// a different mount point), dest is returned. -// -// Note that the returned value ceases to be valid once either os.TempDir() -// changes (e.g. on Linux, once the TMPDIR environment variable changes) or the -// file system is unmounted. -func TempDir(dest string) string { - return tempDir("", filepath.Join(dest, "renameio-TempDir")) -} - -func tempDir(dir, dest string) string { - if dir != "" { - return dir // caller-specified directory always wins - } - - // Chose the destination directory as temporary directory so that we - // definitely can rename the file, for which both temporary and destination - // file need to point to the same mount point. - fallback := filepath.Dir(dest) - - // The user might have overridden the os.TempDir() return value by setting - // the TMPDIR environment variable. - tmpdir := os.TempDir() - - testsrc, err := ioutil.TempFile(tmpdir, "."+filepath.Base(dest)) - if err != nil { - return fallback - } - cleanup := true - defer func() { - if cleanup { - os.Remove(testsrc.Name()) - } - }() - testsrc.Close() - - testdest, err := ioutil.TempFile(filepath.Dir(dest), "."+filepath.Base(dest)) - if err != nil { - return fallback - } - defer os.Remove(testdest.Name()) - testdest.Close() - - if err := os.Rename(testsrc.Name(), testdest.Name()); err != nil { - return fallback - } - cleanup = false // testsrc no longer exists - return tmpdir -} - -// PendingFile is a pending temporary file, waiting to replace the destination -// path in a call to CloseAtomicallyReplace. -type PendingFile struct { - *os.File - - path string - done bool - closed bool -} - -// Cleanup is a no-op if CloseAtomicallyReplace succeeded, and otherwise closes -// and removes the temporary file. -func (t *PendingFile) Cleanup() error { - if t.done { - return nil - } - // An error occurred. Close and remove the tempfile. Errors are returned for - // reporting, there is nothing the caller can recover here. - var closeErr error - if !t.closed { - closeErr = t.Close() - } - if err := os.Remove(t.Name()); err != nil { - return err - } - return closeErr -} - -// CloseAtomicallyReplace closes the temporary file and atomically replaces -// the destination file with it, i.e., a concurrent open(2) call will either -// open the file previously located at the destination path (if any), or the -// just written file, but the file will always be present. -func (t *PendingFile) CloseAtomicallyReplace() error { - // Even on an ordered file system (e.g. ext4 with data=ordered) or file - // systems with write barriers, we cannot skip the fsync(2) call as per - // Theodore Ts'o (ext2/3/4 lead developer): - // - // > data=ordered only guarantees the avoidance of stale data (e.g., the previous - // > contents of a data block showing up after a crash, where the previous data - // > could be someone's love letters, medical records, etc.). Without the fsync(2) - // > a zero-length file is a valid and possible outcome after the rename. - if err := t.Sync(); err != nil { - return err - } - t.closed = true - if err := t.Close(); err != nil { - return err - } - if err := os.Rename(t.Name(), t.path); err != nil { - return err - } - t.done = true - return nil -} - -// TempFile wraps ioutil.TempFile for the use case of atomically creating or -// replacing the destination file at path. -// -// If dir is the empty string, TempDir(filepath.Base(path)) is used. If you are -// going to write a large number of files to the same file system, store the -// result of TempDir(filepath.Base(path)) and pass it instead of the empty -// string. -// -// The file's permissions will be 0600 by default. You can change these by -// explicitly calling Chmod on the returned PendingFile. -func TempFile(dir, path string) (*PendingFile, error) { - f, err := ioutil.TempFile(tempDir(dir, path), "."+filepath.Base(path)) - if err != nil { - return nil, err - } - - return &PendingFile{File: f, path: path}, nil -} - -// Symlink wraps os.Symlink, replacing an existing symlink with the same name -// atomically (os.Symlink fails when newname already exists, at least on Linux). -func Symlink(oldname, newname string) error { - // Fast path: if newname does not exist yet, we can skip the whole dance - // below. - if err := os.Symlink(oldname, newname); err == nil || !os.IsExist(err) { - return err - } - - // We need to use ioutil.TempDir, as we cannot overwrite a ioutil.TempFile, - // and removing+symlinking creates a TOCTOU race. - d, err := ioutil.TempDir(filepath.Dir(newname), "."+filepath.Base(newname)) - if err != nil { - return err - } - cleanup := true - defer func() { - if cleanup { - os.RemoveAll(d) - } - }() - - symlink := filepath.Join(d, "tmp.symlink") - if err := os.Symlink(oldname, symlink); err != nil { - return err - } - - if err := os.Rename(symlink, newname); err != nil { - return err - } - - cleanup = false - return os.RemoveAll(d) -} diff --git a/vendor/github.com/google/renameio/writefile.go b/vendor/github.com/google/renameio/writefile.go deleted file mode 100644 index fbf5c798898..00000000000 --- a/vendor/github.com/google/renameio/writefile.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2018 Google Inc. -// -// 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. - -// +build !windows - -package renameio - -import "os" - -// WriteFile mirrors ioutil.WriteFile, replacing an existing file with the same -// name atomically. -func WriteFile(filename string, data []byte, perm os.FileMode) error { - t, err := TempFile("", filename) - if err != nil { - return err - } - defer t.Cleanup() - - // Set permissions before writing data, in case the data is sensitive. - if err := t.Chmod(perm); err != nil { - return err - } - - if _, err := t.Write(data); err != nil { - return err - } - - return t.CloseAtomicallyReplace() -} diff --git a/vendor/modules.txt b/vendor/modules.txt index b0113267dcc..22799503a86 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -257,7 +257,7 @@ github.com/coreos/ignition/v2/config/shared/errors github.com/coreos/ignition/v2/config/shared/validations github.com/coreos/ignition/v2/config/util github.com/coreos/ignition/v2/config/v3_2/types -# github.com/coreos/stream-metadata-go v0.1.3 +# github.com/coreos/stream-metadata-go v0.1.8 ## explicit; go 1.15 github.com/coreos/stream-metadata-go/arch github.com/coreos/stream-metadata-go/stream @@ -381,9 +381,6 @@ github.com/google/go-cmp/cmp/internal/value ## explicit; go 1.12 github.com/google/gofuzz github.com/google/gofuzz/bytesource -# github.com/google/renameio v1.0.0 -## explicit; go 1.13 -github.com/google/renameio # github.com/google/uuid v1.2.0 ## explicit github.com/google/uuid