From ecf03eb6ae9e7c0f04a5a7f76b53332aafab986f Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 24 May 2022 19:31:35 +0530 Subject: [PATCH 01/37] cephfs: add set/Get/List/Remove metadata utility functions Add utility functions to set/Get/List/Remove PV/PVC/PVCNamespace metadata on subvolume. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/core/metadata.go | 69 ++++++++++++++++++++++++++++++++ internal/cephfs/core/volume.go | 5 +++ 2 files changed, 74 insertions(+) create mode 100644 internal/cephfs/core/metadata.go diff --git a/internal/cephfs/core/metadata.go b/internal/cephfs/core/metadata.go new file mode 100644 index 000000000..369aaf772 --- /dev/null +++ b/internal/cephfs/core/metadata.go @@ -0,0 +1,69 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +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 core + +import ( + "fmt" + "strings" +) + +// setMetadata sets custom metadata on the subvolume in a volume as a +// key-value pair. +func (s *subVolumeClient) setMetadata(key, value string) error { + fsa, err := s.conn.GetFSAdmin() + if err != nil { + return err + } + + return fsa.SetMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key, value) +} + +// removeMetadata removes custom metadata set on the subvolume in a volume +// using the metadata key. +func (s *subVolumeClient) removeMetadata(key string) error { + fsa, err := s.conn.GetFSAdmin() + if err != nil { + return err + } + + return fsa.RemoveMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key) +} + +// SetAllMetadata set all the metadata from arg parameters on Ssubvolume. +func (s *subVolumeClient) SetAllMetadata(parameters map[string]string) error { + for k, v := range parameters { + err := s.setMetadata(k, v) + if err != nil { + return fmt.Errorf("failed to set metadata key %q, value %q on subvolume %v: %w", k, v, s, err) + } + } + + return nil +} + +// UnsetAllMetadata unset all the metadata from arg keys on subvolume. +func (s *subVolumeClient) UnsetAllMetadata(keys []string) error { + for _, key := range keys { + err := s.removeMetadata(key) + // TODO: replace string comparison with errno. + if err != nil && !strings.Contains(err.Error(), "No such file or directory") { + return fmt.Errorf("failed to unset metadata key %q on subvolume %v: %w", key, s, err) + } + } + + return nil +} diff --git a/internal/cephfs/core/volume.go b/internal/cephfs/core/volume.go index 3c1d9b784..c5792c5bb 100644 --- a/internal/cephfs/core/volume.go +++ b/internal/cephfs/core/volume.go @@ -72,6 +72,11 @@ type SubVolumeClient interface { CreateCloneFromSnapshot(ctx context.Context, snap Snapshot) error // CleanupSnapshotFromSubvolume removes the snapshot from the subvolume. CleanupSnapshotFromSubvolume(ctx context.Context, parentVol *SubVolume) error + + // SetAllMetadata set all the metadata from arg parameters on Ssubvolume. + SetAllMetadata(parameters map[string]string) error + // UnsetAllMetadata unset all the metadata from arg keys on subvolume. + UnsetAllMetadata(keys []string) error } // subVolumeClient implements SubVolumeClient interface. From 6bcb8ecc68b674bf8145794df8bfd08083d02b5c Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 24 May 2022 19:35:23 +0530 Subject: [PATCH 02/37] cephfs: set PV/PVC details on the subvolume as metadata on create This helps Monitoring solutions without access to Kubernetes clusters to display the details of the PV/PVC/NameSpace in their dashboard. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index dc314976d..298b09598 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -386,6 +386,13 @@ func (cs *ControllerServer) CreateVolume( return nil, status.Error(codes.Internal, err.Error()) } + + // Set Metadata on PV Create + metadata := k8s.GetVolumeMetadata(req.GetParameters()) + err = volClient.SetAllMetadata(metadata) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } } log.DebugLog(ctx, "cephfs: successfully created backing volume named %s for request name %s", From 466bdf97b23102a0f035425b1ab59ea89916f436 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 24 May 2022 19:36:52 +0530 Subject: [PATCH 03/37] cephfs: set metadata on restart of provisioner pod Make sure to set metadata when subvolume exist, i.e. if the provisioner pod is restarted while createVolume is in progress, say it created the subvolume but didn't yet set the metadata. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index 298b09598..14d3db153 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -287,9 +287,10 @@ func (cs *ControllerServer) CreateVolume( } // TODO return error message if requested vol size greater than found volume return error + metadata := k8s.GetVolumeMetadata(req.GetParameters()) if vID != nil { + volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) if sID != nil || pvID != nil && !volOptions.BackingSnapshot { - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) err = volClient.ExpandVolume(ctx, volOptions.Size) if err != nil { purgeErr := volClient.PurgeVolume(ctx, false) @@ -311,6 +312,14 @@ func (cs *ControllerServer) CreateVolume( } } + if !volOptions.BackingSnapshot { + // Set metadata on restart of provisioner pod when subvolume exist + err = volClient.SetAllMetadata(metadata) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + } + // remove kubernetes csi prefixed parameters. volumeContext := k8s.RemoveCSIPrefixedParameters(req.GetParameters()) volumeContext["subvolumeName"] = vID.FsSubvolName @@ -388,7 +397,6 @@ func (cs *ControllerServer) CreateVolume( } // Set Metadata on PV Create - metadata := k8s.GetVolumeMetadata(req.GetParameters()) err = volClient.SetAllMetadata(metadata) if err != nil { return nil, status.Error(codes.Internal, err.Error()) From 25ce21f496bb4da77512afb14204b81ab001464c Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 24 May 2022 19:38:12 +0530 Subject: [PATCH 04/37] e2e: add test cases for subvolume metadata validation create a PVC and check PVC/PV metadata on cephFS subvolume Fixes: #2875 Signed-off-by: Prasanna Kumar Kalever --- e2e/cephfs.go | 58 ++++++++++++++++++++++++++++++++++++++++++++ e2e/cephfs_helper.go | 32 ++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 4520c8adc..38a930481 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -397,6 +397,64 @@ var _ = Describe(cephfsType, func() { } }) + By("create a PVC and check PVC/PV metadata on CephFS subvolume", func() { + err := createCephfsStorageClass(f.ClientSet, f, true, nil) + if err != nil { + e2elog.Failf("failed to create CephFS storageclass: %v", err) + } + pvc, err := loadPVC(pvcPath) + if err != nil { + e2elog.Failf("failed to load PVC: %v", err) + } + pvc.Namespace = f.UniqueName + + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to create PVC: %v", err) + } + + validateSubvolumeCount(f, 1, fileSystemName, subvolumegroup) + validateOmapCount(f, 1, cephfsType, metadataPool, volumesType) + + pvcObj, err := getPersistentVolumeClaim(c, pvc.Namespace, pvc.Name) + if err != nil { + e2elog.Logf("error getting pvc %q in namespace %q: %v", pvc.Name, pvc.Namespace, err) + } + if pvcObj.Spec.VolumeName == "" { + e2elog.Logf("pv name is empty %q in namespace %q: %v", pvc.Name, pvc.Namespace, err) + } + subvol, err := listCephFSSubVolumes(f, fileSystemName, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list CephFS subvolumes: %v", err) + } + if len(subvol) == 0 { + e2elog.Failf("cephFS subvolumes list is empty %s", fileSystemName) + } + metadata, err := listCephFSSubvolumeMetadata(f, fileSystemName, subvol[0].Name, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list subvolume metadata: %v", err) + } + + if metadata.PVCNameKey != pvc.Name { + e2elog.Failf("expected pvcName %q got %q", pvc.Name, metadata.PVCNameKey) + } else if metadata.PVCNamespaceKey != pvc.Namespace { + e2elog.Failf("expected pvcNamespace %q got %q", pvc.Namespace, metadata.PVCNamespaceKey) + } else if metadata.PVNameKey != pvcObj.Spec.VolumeName { + e2elog.Failf("expected pvName %q got %q", pvcObj.Spec.VolumeName, metadata.PVNameKey) + } + + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete PVC: %v", err) + } + validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) + validateOmapCount(f, 0, cephfsType, metadataPool, volumesType) + err = deleteResource(cephFSExamplePath + "storageclass.yaml") + if err != nil { + e2elog.Failf("failed to delete CephFS storageclass: %v", err) + } + }) + By("create PVC in storageClass with volumeNamePrefix", func() { volumeNamePrefix := "foo-bar-" err := createCephfsStorageClass( diff --git a/e2e/cephfs_helper.go b/e2e/cephfs_helper.go index 4cdd25d0e..2d2553b7e 100644 --- a/e2e/cephfs_helper.go +++ b/e2e/cephfs_helper.go @@ -212,6 +212,38 @@ func listCephFSSubVolumes(f *framework.Framework, filesystem, groupname string) return subVols, nil } +type cephfsSubvolumeMetadata struct { + PVCNameKey string `json:"csi.storage.k8s.io/pvc/name"` + PVCNamespaceKey string `json:"csi.storage.k8s.io/pvc/namespace"` + PVNameKey string `json:"csi.storage.k8s.io/pv/name"` +} + +func listCephFSSubvolumeMetadata( + f *framework.Framework, + filesystem, + subvolume, + groupname string, +) (cephfsSubvolumeMetadata, error) { + var metadata cephfsSubvolumeMetadata + stdout, stdErr, err := execCommandInToolBoxPod( + f, + fmt.Sprintf("ceph fs subvolume metadata ls %s %s --group_name=%s --format=json", filesystem, subvolume, groupname), + rookNamespace) + if err != nil { + return metadata, err + } + if stdErr != "" { + return metadata, fmt.Errorf("error listing subvolume metadata %v", stdErr) + } + + err = json.Unmarshal([]byte(stdout), &metadata) + if err != nil { + return metadata, err + } + + return metadata, nil +} + // getSubvolumepath validates whether subvolumegroup is present. func getSubvolumePath(f *framework.Framework, filesystem, subvolgrp, subvolume string) (string, error) { cmd := fmt.Sprintf("ceph fs subvolume getpath %s %s --group_name=%s", filesystem, subvolume, subvolgrp) From 21d811096b8261d7309da404b1c3069b151655fe Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 14 Jun 2022 18:53:29 +0530 Subject: [PATCH 05/37] cephfs: set cluster Name as metadata on the subvolume This change helps read the cluster name from the cmdline args, the provisioner will set the same on the subvolume. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 52 +++++++++++++++--------- internal/cephfs/core/metadata.go | 13 ++++++ internal/cephfs/core/volume.go | 16 ++++---- internal/cephfs/driver.go | 1 + internal/cephfs/nodeserver.go | 2 +- internal/cephfs/store/backingsnapshot.go | 3 +- internal/cephfs/store/fsjournal.go | 3 +- internal/cephfs/store/volumeoptions.go | 19 +++++---- 8 files changed, 72 insertions(+), 37 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index 14d3db153..d7f5fd6d7 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -52,6 +52,9 @@ type ControllerServer struct { // A map storing all volumes/snapshots with ongoing operations. OperationLocks *util.OperationLock + + // Cluster name + ClusterName string } // createBackingVolume creates the backing subvolume and on any error cleans up any created entities. @@ -63,7 +66,8 @@ func (cs *ControllerServer) createBackingVolume( sID *store.SnapshotIdentifier, ) error { var err error - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) + volClient := core.NewSubVolume(volOptions.GetConnection(), + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) if sID != nil { return cs.createBackingVolumeFromSnapshotSource(ctx, volOptions, parentVolOpt, volClient, sID) @@ -97,7 +101,7 @@ func (cs *ControllerServer) createBackingVolumeFromSnapshotSource( defer cs.OperationLocks.ReleaseRestoreLock(sID.SnapshotID) if volOptions.BackingSnapshot { - if err := store.AddSnapshotBackedVolumeRef(ctx, volOptions); err != nil { + if err := store.AddSnapshotBackedVolumeRef(ctx, volOptions, cs.ClusterName); err != nil { log.ErrorLog(ctx, "failed to create snapshot-backed volume from snapshot %s: %v", sID.FsSnapshotName, err) @@ -146,6 +150,7 @@ func checkContentSource( ctx context.Context, req *csi.CreateVolumeRequest, cr *util.Credentials, + clusterName string, ) (*store.VolumeOptions, *store.VolumeIdentifier, *store.SnapshotIdentifier, error) { if req.VolumeContentSource == nil { return nil, nil, nil, nil @@ -154,7 +159,7 @@ func checkContentSource( switch volumeSource.Type.(type) { case *csi.VolumeContentSource_Snapshot: snapshotID := req.VolumeContentSource.GetSnapshot().GetSnapshotId() - volOpt, _, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr) + volOpt, _, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, clusterName) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { return nil, nil, nil, status.Error(codes.NotFound, err.Error()) @@ -167,7 +172,7 @@ func checkContentSource( case *csi.VolumeContentSource_Volume: // Find the volume using the provided VolumeID volID := req.VolumeContentSource.GetVolume().GetVolumeId() - parentVol, pvID, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, req.Secrets) + parentVol, pvID, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, req.Secrets, clusterName) if err != nil { if !errors.Is(err, cerrors.ErrVolumeNotFound) { return nil, nil, nil, status.Error(codes.NotFound, err.Error()) @@ -252,7 +257,7 @@ func (cs *ControllerServer) CreateVolume( } defer cs.VolumeLocks.Release(requestName) - volOptions, err := store.NewVolumeOptions(ctx, requestName, req, cr) + volOptions, err := store.NewVolumeOptions(ctx, requestName, cs.ClusterName, req, cr) if err != nil { log.ErrorLog(ctx, "validation and extraction of volume options failed: %v", err) @@ -264,7 +269,7 @@ func (cs *ControllerServer) CreateVolume( volOptions.Size = util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes()) } - parentVol, pvID, sID, err := checkContentSource(ctx, req, cr) + parentVol, pvID, sID, err := checkContentSource(ctx, req, cr, cs.ClusterName) if err != nil { return nil, err } @@ -277,7 +282,7 @@ func (cs *ControllerServer) CreateVolume( return nil, status.Error(codes.InvalidArgument, err.Error()) } - vID, err := store.CheckVolExists(ctx, volOptions, parentVol, pvID, sID, cr) + vID, err := store.CheckVolExists(ctx, volOptions, parentVol, pvID, sID, cr, cs.ClusterName) if err != nil { if cerrors.IsCloneRetryError(err) { return nil, status.Error(codes.Aborted, err.Error()) @@ -289,7 +294,8 @@ func (cs *ControllerServer) CreateVolume( metadata := k8s.GetVolumeMetadata(req.GetParameters()) if vID != nil { - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) + volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, + volOptions.ClusterID, cs.ClusterName) if sID != nil || pvID != nil && !volOptions.BackingSnapshot { err = volClient.ExpandVolume(ctx, volOptions.Size) if err != nil { @@ -369,12 +375,13 @@ func (cs *ControllerServer) CreateVolume( return nil, err } + volClient := core.NewSubVolume(volOptions.GetConnection(), + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) if !volOptions.BackingSnapshot { // Get root path for the created subvolume. // Note that root path for snapshot-backed volumes has been already set when // building VolumeOptions. - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) volOptions.RootPath, err = volClient.GetVolumeRootPathCeph(ctx) if err != nil { purgeErr := volClient.PurgeVolume(ctx, true) @@ -457,7 +464,7 @@ func (cs *ControllerServer) DeleteVolume( defer cs.OperationLocks.ReleaseDeleteLock(req.GetVolumeId()) // Find the volume using the provided VolumeID - volOptions, vID, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), nil, secrets) + volOptions, vID, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), nil, secrets, cs.ClusterName) if err != nil { // if error is ErrPoolNotFound, the pool is already deleted we dont // need to worry about deleting subvolume or omap data, return success @@ -512,7 +519,7 @@ func (cs *ControllerServer) DeleteVolume( } defer cr.DeleteCredentials() - if err := cleanUpBackingVolume(ctx, volOptions, vID, cr); err != nil { + if err := cleanUpBackingVolume(ctx, volOptions, vID, cr, cs.ClusterName); err != nil { return nil, err } @@ -530,11 +537,13 @@ func cleanUpBackingVolume( volOptions *store.VolumeOptions, volID *store.VolumeIdentifier, cr *util.Credentials, + clusterName string, ) error { if !volOptions.BackingSnapshot { // Regular volumes need to be purged. - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) + volClient := core.NewSubVolume(volOptions.GetConnection(), + &volOptions.SubVolume, volOptions.ClusterID, clusterName) if err := volClient.PurgeVolume(ctx, false); err != nil { log.ErrorLog(ctx, "failed to delete volume %s: %v", volID, err) if errors.Is(err, cerrors.ErrVolumeHasSnapshots) { @@ -566,7 +575,8 @@ func cleanUpBackingVolume( return nil } - snapParentVolOptions, _, snapID, err := store.NewSnapshotOptionsFromID(ctx, volOptions.BackingSnapshotID, cr) + snapParentVolOptions, _, snapID, err := store.NewSnapshotOptionsFromID(ctx, + volOptions.BackingSnapshotID, cr, clusterName) if err != nil { absorbErrs := []error{ util.ErrPoolNotFound, @@ -659,7 +669,7 @@ func (cs *ControllerServer) ControllerExpandVolume( } defer cr.DeleteCredentials() - volOptions, volIdentifier, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, secret) + volOptions, volIdentifier, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, secret, cs.ClusterName) if err != nil { log.ErrorLog(ctx, "validation and extraction of volume options failed: %v", err) @@ -673,7 +683,8 @@ func (cs *ControllerServer) ControllerExpandVolume( RoundOffSize := util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes()) - volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) + volClient := core.NewSubVolume(volOptions.GetConnection(), + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) if err = volClient.ResizeVolume(ctx, RoundOffSize); err != nil { log.ErrorLog(ctx, "failed to expand volume %s: %v", fsutil.VolumeID(volIdentifier.FsSubvolName), err) @@ -726,7 +737,8 @@ func (cs *ControllerServer) CreateSnapshot( defer cs.OperationLocks.ReleaseSnapshotCreateLock(sourceVolID) // Find the volume using the provided VolumeID - parentVolOptions, vid, err := store.NewVolumeOptionsFromVolID(ctx, sourceVolID, nil, req.GetSecrets()) + parentVolOptions, vid, err := store.NewVolumeOptionsFromVolID(ctx, + sourceVolID, nil, req.GetSecrets(), cs.ClusterName) if err != nil { if errors.Is(err, util.ErrPoolNotFound) { log.WarningLog(ctx, "failed to get backend volume for %s: %v", sourceVolID, err) @@ -780,7 +792,8 @@ func (cs *ControllerServer) CreateSnapshot( // too. volClient := core.NewSubVolume(parentVolOptions.GetConnection(), &parentVolOptions.SubVolume, - parentVolOptions.ClusterID) + parentVolOptions.ClusterID, + cs.ClusterName) info, err := volClient.GetSubVolumeInfo(ctx) if err != nil { // Check error code value against ErrInvalidCommand to understand the cluster @@ -806,7 +819,8 @@ func (cs *ControllerServer) CreateSnapshot( // check snapshot is protected protected := true if !(snapInfo.Protected == core.SnapshotIsProtected) { - snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), sid.FsSnapshotName, &parentVolOptions.SubVolume) + snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), + sid.FsSnapshotName, &parentVolOptions.SubVolume) err = snapClient.ProtectSnapshot(ctx) if err != nil { protected = false @@ -956,7 +970,7 @@ func (cs *ControllerServer) DeleteSnapshot( } defer cs.OperationLocks.ReleaseDeleteLock(snapshotID) - volOpt, snapInfo, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr) + volOpt, snapInfo, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, cs.ClusterName) if err != nil { switch { case errors.Is(err, util.ErrPoolNotFound): diff --git a/internal/cephfs/core/metadata.go b/internal/cephfs/core/metadata.go index 369aaf772..f15e662c7 100644 --- a/internal/cephfs/core/metadata.go +++ b/internal/cephfs/core/metadata.go @@ -21,6 +21,11 @@ import ( "strings" ) +const ( + // clusterNameKey cluster Key, set on cephfs subvolume. + clusterNameKey = "csi.ceph.com/cluster/name" +) + // setMetadata sets custom metadata on the subvolume in a volume as a // key-value pair. func (s *subVolumeClient) setMetadata(key, value string) error { @@ -52,6 +57,14 @@ func (s *subVolumeClient) SetAllMetadata(parameters map[string]string) error { } } + if s.clusterName != "" { + err := s.setMetadata(clusterNameKey, s.clusterName) + if err != nil { + return fmt.Errorf("failed to set metadata key %q, value %q on subvolume %v: %w", + clusterNameKey, s.clusterName, s, err) + } + } + return nil } diff --git a/internal/cephfs/core/volume.go b/internal/cephfs/core/volume.go index c5792c5bb..ab255f166 100644 --- a/internal/cephfs/core/volume.go +++ b/internal/cephfs/core/volume.go @@ -81,9 +81,10 @@ type SubVolumeClient interface { // subVolumeClient implements SubVolumeClient interface. type subVolumeClient struct { - *SubVolume // Embedded SubVolume struct. - clusterID string // Cluster ID to check subvolumegroup and resize functionality. - conn *util.ClusterConnection // Cluster connection. + *SubVolume // Embedded SubVolume struct. + clusterID string // Cluster ID to check subvolumegroup and resize functionality. + clusterName string // Cluster name + conn *util.ClusterConnection // Cluster connection. } // SubVolume holds the information about the subvolume. @@ -97,11 +98,12 @@ type SubVolume struct { } // NewSubVolume returns a new subvolume client. -func NewSubVolume(conn *util.ClusterConnection, vol *SubVolume, clusterID string) SubVolumeClient { +func NewSubVolume(conn *util.ClusterConnection, vol *SubVolume, clusterID, clusterName string) SubVolumeClient { return &subVolumeClient{ - SubVolume: vol, - clusterID: clusterID, - conn: conn, + SubVolume: vol, + clusterID: clusterID, + clusterName: clusterName, + conn: conn, } } diff --git a/internal/cephfs/driver.go b/internal/cephfs/driver.go index b9e39cb68..94d4d2d4d 100644 --- a/internal/cephfs/driver.go +++ b/internal/cephfs/driver.go @@ -135,6 +135,7 @@ func (fs *Driver) Run(conf *util.Config) { if conf.IsControllerServer { fs.cs = NewControllerServer(fs.cd) + fs.cs.ClusterName = conf.ClusterName } if !conf.IsControllerServer && !conf.IsNodeServer { topology, err = util.GetTopologyFromDomainLabels(conf.DomainLabels, conf.NodeID, conf.DriverName) diff --git a/internal/cephfs/nodeserver.go b/internal/cephfs/nodeserver.go index 4f9af2253..d8cdf0063 100644 --- a/internal/cephfs/nodeserver.go +++ b/internal/cephfs/nodeserver.go @@ -82,7 +82,7 @@ func (ns *NodeServer) getVolumeOptions( volContext, volSecrets map[string]string, ) (*store.VolumeOptions, error) { - volOptions, _, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), volContext, volSecrets) + volOptions, _, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), volContext, volSecrets, "") if err != nil { if !errors.Is(err, cerrors.ErrInvalidVolID) { return nil, status.Error(codes.Internal, err.Error()) diff --git a/internal/cephfs/store/backingsnapshot.go b/internal/cephfs/store/backingsnapshot.go index 2c22839d3..d9500e28c 100644 --- a/internal/cephfs/store/backingsnapshot.go +++ b/internal/cephfs/store/backingsnapshot.go @@ -34,6 +34,7 @@ func fmtBackingSnapshotReftrackerName(backingSnapID string) string { func AddSnapshotBackedVolumeRef( ctx context.Context, volOptions *VolumeOptions, + clusterName string, ) error { ioctx, err := volOptions.conn.GetIoctx(volOptions.MetadataPool) if err != nil { @@ -95,7 +96,7 @@ func AddSnapshotBackedVolumeRef( // There may have been a race between adding a ref to the reftracker and // deleting the backing snapshot. Make sure the snapshot still exists by // trying to retrieve it again. - _, _, _, err = NewSnapshotOptionsFromID(ctx, volOptions.BackingSnapshotID, volOptions.conn.Creds) + _, _, _, err = NewSnapshotOptionsFromID(ctx, volOptions.BackingSnapshotID, volOptions.conn.Creds, clusterName) if err != nil { log.ErrorLog(ctx, "failed to get backing snapshot %s: %v", volOptions.BackingSnapshotID, err) } diff --git a/internal/cephfs/store/fsjournal.go b/internal/cephfs/store/fsjournal.go index 9d84256fd..82c226de0 100644 --- a/internal/cephfs/store/fsjournal.go +++ b/internal/cephfs/store/fsjournal.go @@ -78,6 +78,7 @@ func CheckVolExists(ctx context.Context, pvID *VolumeIdentifier, sID *SnapshotIdentifier, cr *util.Credentials, + clusterName string, ) (*VolumeIdentifier, error) { var vid VolumeIdentifier // Connect to cephfs' default radosNamespace (csi) @@ -99,7 +100,7 @@ func CheckVolExists(ctx context.Context, vid.FsSubvolName = imageData.ImageAttributes.ImageName volOptions.VolID = vid.FsSubvolName - vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID) + vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName) if (sID != nil || pvID != nil) && imageData.ImageAttributes.BackingSnapshotID == "" { cloneState, cloneStateErr := vol.GetCloneState(ctx) if cloneStateErr != nil { diff --git a/internal/cephfs/store/volumeoptions.go b/internal/cephfs/store/volumeoptions.go index b1765d2f1..70ace8cb1 100644 --- a/internal/cephfs/store/volumeoptions.go +++ b/internal/cephfs/store/volumeoptions.go @@ -196,7 +196,7 @@ func fmtBackingSnapshotOptionMismatch(optName, expected, actual string) error { // NewVolumeOptions generates a new instance of volumeOptions from the provided // CSI request parameters. -func NewVolumeOptions(ctx context.Context, requestName string, req *csi.CreateVolumeRequest, +func NewVolumeOptions(ctx context.Context, requestName, clusterName string, req *csi.CreateVolumeRequest, cr *util.Credentials, ) (*VolumeOptions, error) { var ( @@ -289,7 +289,7 @@ func NewVolumeOptions(ctx context.Context, requestName string, req *csi.CreateVo opts.BackingSnapshotID = req.GetVolumeContentSource().GetSnapshot().GetSnapshotId() - err = opts.populateVolumeOptionsFromBackingSnapshot(ctx, cr) + err = opts.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName) if err != nil { return nil, err } @@ -304,6 +304,7 @@ func NewVolumeOptionsFromVolID( ctx context.Context, volID string, volOpt, secrets map[string]string, + clusterName string, ) (*VolumeOptions, *VolumeIdentifier, error) { var ( vi util.CSIIdentifier @@ -407,16 +408,16 @@ func NewVolumeOptionsFromVolID( volOptions.SubVolume.VolID = vid.FsSubvolName if volOptions.BackingSnapshot { - err = volOptions.populateVolumeOptionsFromBackingSnapshot(ctx, cr) + err = volOptions.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName) } else { - err = volOptions.populateVolumeOptionsFromSubvolume(ctx) + err = volOptions.populateVolumeOptionsFromSubvolume(ctx, clusterName) } return &volOptions, &vid, err } -func (vo *VolumeOptions) populateVolumeOptionsFromSubvolume(ctx context.Context) error { - vol := core.NewSubVolume(vo.conn, &vo.SubVolume, vo.ClusterID) +func (vo *VolumeOptions) populateVolumeOptionsFromSubvolume(ctx context.Context, clusterName string) error { + vol := core.NewSubVolume(vo.conn, &vo.SubVolume, vo.ClusterID, clusterName) var info *core.Subvolume info, err := vol.GetSubVolumeInfo(ctx) @@ -436,6 +437,7 @@ func (vo *VolumeOptions) populateVolumeOptionsFromSubvolume(ctx context.Context) func (vo *VolumeOptions) populateVolumeOptionsFromBackingSnapshot( ctx context.Context, cr *util.Credentials, + clusterName string, ) error { // As of CephFS snapshot v2 API, snapshots may be found in two locations: // @@ -457,7 +459,7 @@ func (vo *VolumeOptions) populateVolumeOptionsFromBackingSnapshot( return nil } - parentBackingSnapVolOpts, _, snapID, err := NewSnapshotOptionsFromID(ctx, vo.BackingSnapshotID, cr) + parentBackingSnapVolOpts, _, snapID, err := NewSnapshotOptionsFromID(ctx, vo.BackingSnapshotID, cr, clusterName) if err != nil { return fmt.Errorf("failed to retrieve backing snapshot %s: %w", vo.BackingSnapshotID, err) } @@ -652,6 +654,7 @@ func NewSnapshotOptionsFromID( ctx context.Context, snapID string, cr *util.Credentials, + clusterName string, ) (*VolumeOptions, *core.SnapshotInfo, *SnapshotIdentifier, error) { var ( vi util.CSIIdentifier @@ -723,7 +726,7 @@ func NewSnapshotOptionsFromID( sid.FsSubvolName = imageAttributes.SourceName volOptions.SubVolume.VolID = sid.FsSubvolName - vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID) + vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName) subvolInfo, err := vol.GetSubVolumeInfo(ctx) if err != nil { From 11d51ed9b087925fcdab856c2c2e1944aca4a056 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 14 Jun 2022 18:56:46 +0530 Subject: [PATCH 06/37] cephfs: unset cluster Name metadata unsets the cluster name metadata key and value on the subvolume Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/core/metadata.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/cephfs/core/metadata.go b/internal/cephfs/core/metadata.go index f15e662c7..5096f7f78 100644 --- a/internal/cephfs/core/metadata.go +++ b/internal/cephfs/core/metadata.go @@ -78,5 +78,11 @@ func (s *subVolumeClient) UnsetAllMetadata(keys []string) error { } } + err := s.removeMetadata(clusterNameKey) + // TODO: replace string comparison with errno. + if err != nil && !strings.Contains(err.Error(), "No such file or directory") { + return fmt.Errorf("failed to unset metadata key %q on subvolume %v: %w", clusterNameKey, s, err) + } + return nil } From cc9e8aa7b63a643f905ed91a8802f2ef38acba07 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 14 Jun 2022 18:57:40 +0530 Subject: [PATCH 07/37] deploy: add cluster name in the templates added in helm charts which should help users. Signed-off-by: Prasanna Kumar Kalever --- charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml | 3 +++ charts/ceph-csi-cephfs/values.yaml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml index 40ecfea4f..36591eb9e 100644 --- a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml +++ b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml @@ -123,6 +123,9 @@ spec: - "--drivername=$(DRIVER_NAME)" {{- if .Values.provisioner.profiling.enabled }} - "--enableprofiling={{ .Values.provisioner.profiling.enabled }}" +{{- end }} +{{- if .Values.provisioner.clustername }} + - "--clustername={{ .Values.provisioner.clustername }}" {{- end }} env: - name: POD_IP diff --git a/charts/ceph-csi-cephfs/values.yaml b/charts/ceph-csi-cephfs/values.yaml index 7529e07ca..71ffbf964 100644 --- a/charts/ceph-csi-cephfs/values.yaml +++ b/charts/ceph-csi-cephfs/values.yaml @@ -125,6 +125,8 @@ provisioner: maxUnavailable: 50% # Timeout for waiting for creation or deletion of a volume timeout: 60s + # cluster name to set on the subvolume + # clustername: "k8s-cluster-1" # set user created priorityclassName for csi provisioner pods. default is # system-cluster-critical which is less priority than system-node-critical From 3ddb8c289c503b7597817e90e3562979ecf02143 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 14 Jun 2022 19:05:04 +0530 Subject: [PATCH 08/37] doc: add documentation about --clustername option Signed-off-by: Prasanna Kumar Kalever --- charts/ceph-csi-cephfs/README.md | 1 + docs/deploy-cephfs.md | 1 + 2 files changed, 2 insertions(+) diff --git a/charts/ceph-csi-cephfs/README.md b/charts/ceph-csi-cephfs/README.md index dc8d28dc5..c22c657c3 100644 --- a/charts/ceph-csi-cephfs/README.md +++ b/charts/ceph-csi-cephfs/README.md @@ -105,6 +105,7 @@ charts and their default values. | `provisioner.name` | Specifies the name of provisioner | `provisioner` | | `provisioner.replicaCount` | Specifies the replicaCount | `3` | | `provisioner.timeout` | GRPC timeout for waiting for creation or deletion of a volume | `60s` | +| `provisioner.clustername` | Cluster name to set on the subvolume | "" | | `provisioner.priorityClassName` | Set user created priorityclassName for csi provisioner pods. Default is `system-cluster-critical` which is less priority than `system-node-critical` | `system-cluster-critical` | | `provisioner.enableHostNetwork` | Specifies whether hostNetwork is enabled for provisioner pod. | `false` | | `provisioner.profiling.enabled` | Specifies whether profiling should be enabled | `false` | diff --git a/docs/deploy-cephfs.md b/docs/deploy-cephfs.md index b135fc7dc..59a0f7b33 100644 --- a/docs/deploy-cephfs.md +++ b/docs/deploy-cephfs.md @@ -57,6 +57,7 @@ that should be resolved in v14.2.3. | `--enablegrpcmetrics` | `false` | [Deprecated] Enable grpc metrics collection and start prometheus server | | `--polltime` | `60s` | Time interval in between each poll | | `--timeout` | `3s` | Probe timeout in seconds | +| `--clustername` | _empty_ | Cluster name to set on subvolume | | `--histogramoption` | `0.5,2,6` | [Deprecated] Histogram option for grpc metrics, should be comma separated value (ex:= "0.5,2,6" where start=0.5 factor=2, count=6) | | `--forcecephkernelclient` | `false` | Force enabling Ceph Kernel clients for mounting on kernels < 4.17 | | `--kernelmountoptions` | _empty_ | Comma separated string of mount options accepted by cephfs kernel mounter | From 2390a43415ba15c95c63ba90ddbff825cb9ace6c Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 14 Jun 2022 19:20:42 +0530 Subject: [PATCH 09/37] e2e: add tests to validate cluster name Signed-off-by: Prasanna Kumar Kalever --- e2e/cephfs.go | 10 ++++++++++ e2e/cephfs_helper.go | 1 + 2 files changed, 11 insertions(+) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 38a930481..6b757ef50 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -194,6 +194,14 @@ var _ = Describe(cephfsType, func() { if err != nil { e2elog.Failf("failed to create node secret: %v", err) } + + // wait for cluster name update in deployment + containers := []string{cephFSContainerName} + err = waitForContainersArgsUpdate(c, cephCSINamespace, cephFSDeploymentName, + "clustername", defaultClusterName, containers, deployTimeout) + if err != nil { + e2elog.Failf("timeout waiting for deployment update %s/%s: %v", cephCSINamespace, cephFSDeploymentName, err) + } }) AfterEach(func() { @@ -441,6 +449,8 @@ var _ = Describe(cephfsType, func() { e2elog.Failf("expected pvcNamespace %q got %q", pvc.Namespace, metadata.PVCNamespaceKey) } else if metadata.PVNameKey != pvcObj.Spec.VolumeName { e2elog.Failf("expected pvName %q got %q", pvcObj.Spec.VolumeName, metadata.PVNameKey) + } else if metadata.ClusterNameKey != defaultClusterName { + e2elog.Failf("expected clusterName %q got %q", defaultClusterName, metadata.ClusterNameKey) } err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) diff --git a/e2e/cephfs_helper.go b/e2e/cephfs_helper.go index 2d2553b7e..9f641415f 100644 --- a/e2e/cephfs_helper.go +++ b/e2e/cephfs_helper.go @@ -216,6 +216,7 @@ type cephfsSubvolumeMetadata struct { PVCNameKey string `json:"csi.storage.k8s.io/pvc/name"` PVCNamespaceKey string `json:"csi.storage.k8s.io/pvc/namespace"` PVNameKey string `json:"csi.storage.k8s.io/pv/name"` + ClusterNameKey string `json:"csi.ceph.com/cluster/name"` } func listCephFSSubvolumeMetadata( From 51099d60fe0c22ab6b7cfee78eda03813202596d Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 19 Jul 2022 15:24:26 +0530 Subject: [PATCH 10/37] cephfs: handle metadata op-failures with unsupported ceph versions Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/core/metadata.go | 47 ++++++++++++++++++++++++++++++-- internal/cephfs/core/volume.go | 3 +- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/internal/cephfs/core/metadata.go b/internal/cephfs/core/metadata.go index 5096f7f78..bb02e0a9e 100644 --- a/internal/cephfs/core/metadata.go +++ b/internal/cephfs/core/metadata.go @@ -17,8 +17,11 @@ limitations under the License. package core import ( + "errors" "fmt" "strings" + + fsAdmin "github.com/ceph/go-ceph/cephfs/admin" ) const ( @@ -26,26 +29,66 @@ const ( clusterNameKey = "csi.ceph.com/cluster/name" ) +// ErrSubVolMetadataNotSupported is returned when set/get/list/remove subvolume metadata options are not supported. +var ErrSubVolMetadataNotSupported = errors.New("subvolume metadata operations are not supported") + +func (s *subVolumeClient) supportsSubVolMetadata() bool { + if _, keyPresent := clusterAdditionalInfo[s.clusterID]; !keyPresent { + clusterAdditionalInfo[s.clusterID] = &localClusterState{} + } + + return clusterAdditionalInfo[s.clusterID].subVolMetadataState != unsupported +} + +func (s *subVolumeClient) isUnsupportedSubVolMetadata(err error) bool { + var invalid fsAdmin.NotImplementedError + if err != nil && errors.Is(err, &invalid) { + // In case the error is other than invalid command return error to the caller. + clusterAdditionalInfo[s.clusterID].subVolMetadataState = unsupported + + return false + } + clusterAdditionalInfo[s.clusterID].subVolMetadataState = supported + + return true +} + // setMetadata sets custom metadata on the subvolume in a volume as a // key-value pair. func (s *subVolumeClient) setMetadata(key, value string) error { + var err error + if !s.supportsSubVolMetadata() { + return ErrSubVolMetadataNotSupported + } fsa, err := s.conn.GetFSAdmin() if err != nil { return err } + err = fsa.SetMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key, value) + if !s.isUnsupportedSubVolMetadata(err) { + return ErrSubVolMetadataNotSupported + } - return fsa.SetMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key, value) + return err } // removeMetadata removes custom metadata set on the subvolume in a volume // using the metadata key. func (s *subVolumeClient) removeMetadata(key string) error { + var err error + if !s.supportsSubVolMetadata() { + return ErrSubVolMetadataNotSupported + } fsa, err := s.conn.GetFSAdmin() if err != nil { return err } + err = fsa.RemoveMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key) + if !s.isUnsupportedSubVolMetadata(err) { + return ErrSubVolMetadataNotSupported + } - return fsa.RemoveMetadata(s.FsName, s.SubvolumeGroup, s.VolID, key) + return err } // SetAllMetadata set all the metadata from arg parameters on Ssubvolume. diff --git a/internal/cephfs/core/volume.go b/internal/cephfs/core/volume.go index ab255f166..9cdec5e00 100644 --- a/internal/cephfs/core/volume.go +++ b/internal/cephfs/core/volume.go @@ -191,7 +191,8 @@ const ( type localClusterState struct { // set the enum value i.e., unknown, supported, // unsupported as per the state of the cluster. - resizeState operationState + resizeState operationState + subVolMetadataState operationState // set true once a subvolumegroup is created // for corresponding cluster. subVolumeGroupCreated bool From 76ddf8e3061af8e9c35775745191ff1977333346 Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Tue, 26 Jul 2022 10:22:19 +0530 Subject: [PATCH 11/37] deploy: introduce new log level for sidecar controllers At present we have single log level configuration for all the containers running for our CSI pods, which has been defaulted to log Level 5. However this cause many logs to be spitted in a cluster and cause log spamming to an extent. This commit introduce one more log level control for CSI pods called sidecarLogLevel which defaults to log Level 1. The sidecar controllers like snapshotter, resizer, attacher..etc has been configured with this new log level and driver pods are with old configruation value. This allow us to have different configuration options for sidecar constrollers and driver pods. With this, we will also have a choice of different configuation setting instead of locking onto one variable for the containers deployed via CSI driver. To summarize the CSI containers maintained by Ceph CSI driver has log level 5 and controllers/sidecars not maintained by Ceph CSI driver has log level 1 configuration. Signed-off-by: Humble Chirammal --- charts/ceph-csi-cephfs/README.md | 1 + .../ceph-csi-cephfs/templates/provisioner-deployment.yaml | 6 +++--- charts/ceph-csi-cephfs/values.yaml | 3 +++ charts/ceph-csi-rbd/README.md | 1 + charts/ceph-csi-rbd/templates/provisioner-deployment.yaml | 8 ++++---- charts/ceph-csi-rbd/values.yaml | 3 +++ .../cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml | 6 +++--- deploy/cephfs/kubernetes/csi-cephfsplugin.yaml | 2 +- deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml | 6 +++--- deploy/nfs/kubernetes/csi-nfsplugin.yaml | 4 ++-- deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml | 8 ++++---- deploy/rbd/kubernetes/csi-rbdplugin.yaml | 2 +- 12 files changed, 29 insertions(+), 21 deletions(-) diff --git a/charts/ceph-csi-cephfs/README.md b/charts/ceph-csi-cephfs/README.md index c22c657c3..4fd98aab8 100644 --- a/charts/ceph-csi-cephfs/README.md +++ b/charts/ceph-csi-cephfs/README.md @@ -86,6 +86,7 @@ charts and their default values. | `serviceAccounts.provisioner.name` | The name of the provisioner ServiceAccount of provisioner to use. If not set and create is true, a name is generated using the fullname | "" | | `csiConfig` | Configuration for the CSI to connect to the cluster | [] | | `logLevel` | Set logging level for csi containers. Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity. | `5` | +| `sidecarLogLevel` | Set logging level for csi sidecar containers. Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity. | `1` | | `nodeplugin.name` | Specifies the nodeplugin name | `nodeplugin` | | `nodeplugin.updateStrategy` | Specifies the update Strategy. If you are using ceph-fuse client set this value to OnDelete | `RollingUpdate` | | `nodeplugin.priorityClassName` | Set user created priorityclassName for csi plugin pods. default is system-node-critical which is highest priority | `system-node-critical` | diff --git a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml index 36591eb9e..bba91272a 100644 --- a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml +++ b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml @@ -58,7 +58,7 @@ spec: imagePullPolicy: {{ .Values.provisioner.provisioner.image.pullPolicy }} args: - "--csi-address=$(ADDRESS)" - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election=true" - "--retry-interval-start=500ms" @@ -78,7 +78,7 @@ spec: imagePullPolicy: {{ .Values.provisioner.snapshotter.image.pullPolicy }} args: - "--csi-address=$(ADDRESS)" - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election=true" env: @@ -94,7 +94,7 @@ spec: image: "{{ .Values.provisioner.resizer.image.repository }}:{{ .Values.provisioner.resizer.image.tag }}" imagePullPolicy: {{ .Values.provisioner.resizer.image.pullPolicy }} args: - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--csi-address=$(ADDRESS)" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election" diff --git a/charts/ceph-csi-cephfs/values.yaml b/charts/ceph-csi-cephfs/values.yaml index 71ffbf964..0ad9d5253 100644 --- a/charts/ceph-csi-cephfs/values.yaml +++ b/charts/ceph-csi-cephfs/values.yaml @@ -33,7 +33,10 @@ csiConfig: [] # Set logging level for csi containers. # Supported values from 0 to 5. 0 for general useful logs, # 5 for trace level verbosity. +# logLevel is the variable for CSI driver containers's log level logLevel: 5 +# sidecarLogLevel is the variable for Kubernetes sidecar container's log level +sidecarLogLevel: 1 nodeplugin: name: nodeplugin diff --git a/charts/ceph-csi-rbd/README.md b/charts/ceph-csi-rbd/README.md index 12ecbf832..4fcf89e91 100644 --- a/charts/ceph-csi-rbd/README.md +++ b/charts/ceph-csi-rbd/README.md @@ -88,6 +88,7 @@ charts and their default values. | `csiMapping` | Configuration details of clusterID,PoolID,FscID mapping | [] | | `encryptionKMSConfig` | Configuration for the encryption KMS | `{}` | | `logLevel` | Set logging level for csi containers. Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity. | `5` | +| `sidecarLogLevel` | Set logging level for csi sidecar containers. Supported values from 0 to 5. 0 for general useful logs, 5 for trace level verbosity. | `1` | | `nodeplugin.name` | Specifies the nodeplugins name | `nodeplugin` | | `nodeplugin.updateStrategy` | Specifies the update Strategy. If you are using ceph-fuse client set this value to OnDelete | `RollingUpdate` | | `nodeplugin.priorityClassName` | Set user created priorityclassName for csi plugin pods. default is system-node-critical which is highest priority | `system-node-critical` | diff --git a/charts/ceph-csi-rbd/templates/provisioner-deployment.yaml b/charts/ceph-csi-rbd/templates/provisioner-deployment.yaml index 3f81e7631..9e3b30f3e 100644 --- a/charts/ceph-csi-rbd/templates/provisioner-deployment.yaml +++ b/charts/ceph-csi-rbd/templates/provisioner-deployment.yaml @@ -58,7 +58,7 @@ spec: imagePullPolicy: {{ .Values.provisioner.provisioner.image.pullPolicy }} args: - "--csi-address=$(ADDRESS)" - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election=true" - "--retry-interval-start=500ms" @@ -82,7 +82,7 @@ spec: image: "{{ .Values.provisioner.resizer.image.repository }}:{{ .Values.provisioner.resizer.image.tag }}" imagePullPolicy: {{ .Values.provisioner.resizer.image.pullPolicy }} args: - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--csi-address=$(ADDRESS)" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election" @@ -103,7 +103,7 @@ spec: imagePullPolicy: {{ .Values.provisioner.snapshotter.image.pullPolicy }} args: - "--csi-address=$(ADDRESS)" - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election=true" - "--extra-create-metadata=true" @@ -120,7 +120,7 @@ spec: image: "{{ .Values.provisioner.attacher.image.repository }}:{{ .Values.provisioner.attacher.image.tag }}" imagePullPolicy: {{ .Values.provisioner.attacher.image.pullPolicy }} args: - - "--v={{ .Values.logLevel }}" + - "--v={{ .Values.sidecarLogLevel }}" - "--csi-address=$(ADDRESS)" - "--leader-election=true" - "--retry-interval-start=500ms" diff --git a/charts/ceph-csi-rbd/values.yaml b/charts/ceph-csi-rbd/values.yaml index e84baf497..5b395584e 100644 --- a/charts/ceph-csi-rbd/values.yaml +++ b/charts/ceph-csi-rbd/values.yaml @@ -56,7 +56,10 @@ encryptionKMSConfig: {} # Set logging level for csi containers. # Supported values from 0 to 5. 0 for general useful logs, # 5 for trace level verbosity. +# logLevel is the variable for CSI driver containers's log level logLevel: 5 +# sidecarLogLevel is the variable for Kubernetes sidecar container's log level +sidecarLogLevel: 1 nodeplugin: name: nodeplugin diff --git a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml index dd0af9326..9aa3512ac 100644 --- a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml +++ b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml @@ -46,7 +46,7 @@ spec: image: registry.k8s.io/sig-storage/csi-provisioner:v3.2.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election=true" - "--retry-interval-start=500ms" @@ -65,7 +65,7 @@ spec: image: registry.k8s.io/sig-storage/csi-resizer:v1.5.0 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election" - "--retry-interval-start=500ms" @@ -82,7 +82,7 @@ spec: image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election=true" env: diff --git a/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml b/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml index be90c3515..4bf6d7278 100644 --- a/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml +++ b/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml @@ -29,7 +29,7 @@ spec: allowPrivilegeEscalation: true image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1 args: - - "--v=5" + - "--v=1" - "--csi-address=/csi/csi.sock" - "--kubelet-registration-path=/var/lib/kubelet/plugins/cephfs.csi.ceph.com/csi.sock" env: diff --git a/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml b/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml index 360743e9c..61f105906 100644 --- a/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml +++ b/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml @@ -43,7 +43,7 @@ spec: image: registry.k8s.io/sig-storage/csi-provisioner:v3.2.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election=true" - "--retry-interval-start=500ms" @@ -62,7 +62,7 @@ spec: image: registry.k8s.io/sig-storage/csi-resizer:v1.5.0 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election" - "--retry-interval-start=500ms" @@ -78,7 +78,7 @@ spec: image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election=true" env: diff --git a/deploy/nfs/kubernetes/csi-nfsplugin.yaml b/deploy/nfs/kubernetes/csi-nfsplugin.yaml index ab466af8f..856ba20e6 100644 --- a/deploy/nfs/kubernetes/csi-nfsplugin.yaml +++ b/deploy/nfs/kubernetes/csi-nfsplugin.yaml @@ -33,7 +33,7 @@ spec: - mountPath: /csi name: socket-dir - args: - - --v=5 + - --v=1 - --csi-address=/csi/csi.sock - --kubelet-registration-path=$(DRIVER_REG_SOCK_PATH) env: @@ -74,7 +74,7 @@ spec: - mountPath: /registration name: registration-dir - args: - - -v=5 + - -v=1 - --drivername=nfs.csi.ceph.com - --nodeid=$(NODE_ID) - --endpoint=$(CSI_ENDPOINT) diff --git a/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml b/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml index bc18167fe..fcafe925e 100644 --- a/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml +++ b/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml @@ -50,7 +50,7 @@ spec: image: k8s.gcr.io/sig-storage/csi-provisioner:v3.2.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--retry-interval-start=500ms" - "--leader-election=true" @@ -72,7 +72,7 @@ spec: image: registry.k8s.io/sig-storage/csi-snapshotter:v6.0.1 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election=true" - "--extra-create-metadata=true" @@ -86,7 +86,7 @@ spec: - name: csi-attacher image: registry.k8s.io/sig-storage/csi-attacher:v3.5.0 args: - - "--v=5" + - "--v=1" - "--csi-address=$(ADDRESS)" - "--leader-election=true" - "--retry-interval-start=500ms" @@ -101,7 +101,7 @@ spec: image: registry.k8s.io/sig-storage/csi-resizer:v1.5.0 args: - "--csi-address=$(ADDRESS)" - - "--v=5" + - "--v=1" - "--timeout=150s" - "--leader-election" - "--retry-interval-start=500ms" diff --git a/deploy/rbd/kubernetes/csi-rbdplugin.yaml b/deploy/rbd/kubernetes/csi-rbdplugin.yaml index b9c894cee..76cf86262 100644 --- a/deploy/rbd/kubernetes/csi-rbdplugin.yaml +++ b/deploy/rbd/kubernetes/csi-rbdplugin.yaml @@ -31,7 +31,7 @@ spec: allowPrivilegeEscalation: true image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1 args: - - "--v=5" + - "--v=1" - "--csi-address=/csi/csi.sock" - "--kubelet-registration-path=/var/lib/kubelet/plugins/rbd.csi.ceph.com/csi.sock" env: From 8c0dd482fa81fd70e3123a40b53a8b9cf9c87362 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 7 Jun 2022 13:25:30 +0530 Subject: [PATCH 12/37] cephfs: add set/Remove subvolume snapshot metadata utility functions Add utility functions to set/Remove snapshot-name/snapshot-namespace/snapshotcontent-name metadata on subvolume snapshots. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/core/snapshot.go | 6 ++ internal/cephfs/core/snapshot_metadata.go | 73 +++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 internal/cephfs/core/snapshot_metadata.go diff --git a/internal/cephfs/core/snapshot.go b/internal/cephfs/core/snapshot.go index 30b23177f..939b825d6 100644 --- a/internal/cephfs/core/snapshot.go +++ b/internal/cephfs/core/snapshot.go @@ -51,6 +51,12 @@ type SnapshotClient interface { UnprotectSnapshot(ctx context.Context) error // CloneSnapshot clones the snapshot of the subvolume. CloneSnapshot(ctx context.Context, cloneVolOptions *SubVolume) error + // SetAllSnapshotMetadata set all the metadata from arg parameters on + // subvolume snapshot. + SetAllSnapshotMetadata(parameters map[string]string) error + // UnsetAllSnapshotMetadata unset all the metadata from arg keys on + // subvolume snapshot. + UnsetAllSnapshotMetadata(keys []string) error } // snapshotClient is the implementation of SnapshotClient interface. diff --git a/internal/cephfs/core/snapshot_metadata.go b/internal/cephfs/core/snapshot_metadata.go new file mode 100644 index 000000000..ed893ffb1 --- /dev/null +++ b/internal/cephfs/core/snapshot_metadata.go @@ -0,0 +1,73 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +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 core + +import ( + "fmt" + "strings" +) + +// setSnapshotMetadata sets custom metadata on the subvolume snapshot in a +// volume as a key-value pair. +func (s *snapshotClient) setSnapshotMetadata(key, value string) error { + fsa, err := s.conn.GetFSAdmin() + if err != nil { + return err + } + + return fsa.SetSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key, value) +} + +// removeSnapshotMetadata removes custom metadata set on the subvolume +// snapshot in a volume using the metadata key. +func (s *snapshotClient) removeSnapshotMetadata(key string) error { + fsa, err := s.conn.GetFSAdmin() + if err != nil { + return err + } + + return fsa.RemoveSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key) +} + +// SetAllSnapshotMetadata set all the metadata from arg parameters on +// subvolume snapshot. +func (s *snapshotClient) SetAllSnapshotMetadata(parameters map[string]string) error { + for k, v := range parameters { + err := s.setSnapshotMetadata(k, v) + if err != nil { + return fmt.Errorf("failed to set metadata key %q, value %q on subvolume snapshot %s %s in fs %s: %w", + k, v, s.SnapshotID, s.VolID, s.FsName, err) + } + } + + return nil +} + +// UnsetAllSnapshotMetadata unset all the metadata from arg keys on subvolume +// snapshot. +func (s *snapshotClient) UnsetAllSnapshotMetadata(keys []string) error { + for _, key := range keys { + err := s.removeSnapshotMetadata(key) + // TODO: replace string comparison with errno. + if err != nil && !strings.Contains(err.Error(), "No such file or directory") { + return fmt.Errorf("failed to unset metadata key %q on subvolume snapshot %s %s in fs %s: %w", + key, s.SnapshotID, s.VolID, s.FsName, err) + } + } + + return nil +} From 7c9259a45e1fcae86f471b68a8d02db32a9dd0b8 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 7 Jun 2022 13:29:22 +0530 Subject: [PATCH 13/37] cephfs: set metadata on the subvolume snapshot on create Set snapshot-name/snapshot-namespace/snapshotcontent-name details on subvolume snapshots as metadata on create. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index d7f5fd6d7..dce5e7593 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -854,7 +854,8 @@ func (cs *ControllerServer) CreateSnapshot( } } }() - snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName) + metadata := k8s.GetSnapshotMetadata(req.GetParameters()) + snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, metadata) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -874,6 +875,7 @@ func doSnapshot( ctx context.Context, volOpt *store.VolumeOptions, snapshotName string, + metadata map[string]string, ) (core.SnapshotInfo, error) { snapID := fsutil.VolumeID(snapshotName) snap := core.SnapshotInfo{} @@ -909,6 +911,15 @@ func doSnapshot( log.ErrorLog(ctx, "failed to protect snapshot %s %v", snapID, err) } + // Set snapshot-name/snapshot-namespace/snapshotcontent-name details + // on subvolume snapshot as metadata on create + if len(metadata) != 0 { + err = snapClient.SetAllSnapshotMetadata(metadata) + if err != nil { + return snap, err + } + } + return snap, err } From 5f36f7e8bda75245c5f3563da4c41a92d3fbba0f Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 8 Jun 2022 19:52:55 +0530 Subject: [PATCH 14/37] cephfs: update subvolume snapshot metadata if snapshot already exists. Make sure to set metadata when subvolume snapshot exist, i.e. if the provisioner pod is restarted while createSnapShot is in progress, say it created the subvolume snapshot but didn't yet set the metadata. Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index dce5e7593..6a2867c52 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -699,7 +699,7 @@ func (cs *ControllerServer) ControllerExpandVolume( // CreateSnapshot creates the snapshot in backend and stores metadata // in store -// nolint:gocyclo,cyclop // golangci-lint did not catch this earlier, needs to get fixed late +// nolint:gocognit,gocyclo,cyclop // golangci-lint did not catch this earlier, needs to get fixed late func (cs *ControllerServer) CreateSnapshot( ctx context.Context, req *csi.CreateSnapshotRequest, @@ -815,12 +815,12 @@ func (cs *ControllerServer) CreateSnapshot( return nil, status.Error(codes.Internal, err.Error()) } + metadata := k8s.GetSnapshotMetadata(req.GetParameters()) if sid != nil { // check snapshot is protected protected := true + snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), sid.FsSnapshotName, &parentVolOptions.SubVolume) if !(snapInfo.Protected == core.SnapshotIsProtected) { - snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), - sid.FsSnapshotName, &parentVolOptions.SubVolume) err = snapClient.ProtectSnapshot(ctx) if err != nil { protected = false @@ -829,6 +829,15 @@ func (cs *ControllerServer) CreateSnapshot( } } + // Update snapshot-name/snapshot-namespace/snapshotcontent-name details on + // subvolume snapshot as metadata in case snapshot already exist + if len(metadata) != 0 { + err = snapClient.SetAllSnapshotMetadata(metadata) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + } + return &csi.CreateSnapshotResponse{ Snapshot: &csi.Snapshot{ SizeBytes: info.BytesQuota, @@ -854,7 +863,6 @@ func (cs *ControllerServer) CreateSnapshot( } } }() - metadata := k8s.GetSnapshotMetadata(req.GetParameters()) snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, metadata) if err != nil { return nil, status.Error(codes.Internal, err.Error()) From f84265fdf54144b25c2443ccb1a27cfbf7c3337d Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 8 Jun 2022 12:41:41 +0530 Subject: [PATCH 15/37] deploy: add --extra-create-metadata arg to csi-snapshotter sidecar This argument in csi-snapshotter sidecar allows us to receive snapshot-name/snapshot-namespace/snapshotcontent-name metadata in the CreateSnapshot() request. For ex: csi.storage.k8s.io/volumesnapshot/name csi.storage.k8s.io/volumesnapshot/namespace csi.storage.k8s.io/volumesnapshotcontent/name This is a useful information which can be used depend on the use case we have at our driver. The features like adding metadata to snapshot image can consume this based on the need. Signed-off-by: Prasanna Kumar Kalever --- charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml | 1 + deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml index bba91272a..16ddd5d1a 100644 --- a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml +++ b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml @@ -81,6 +81,7 @@ spec: - "--v={{ .Values.sidecarLogLevel }}" - "--timeout={{ .Values.provisioner.timeout }}" - "--leader-election=true" + - "--extra-create-metadata=true" env: - name: ADDRESS value: "unix:///csi/{{ .Values.provisionerSocketFile }}" diff --git a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml index 9aa3512ac..d6d2d1caa 100644 --- a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml +++ b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml @@ -85,6 +85,7 @@ spec: - "--v=1" - "--timeout=150s" - "--leader-election=true" + - "--extra-create-metadata=true" env: - name: ADDRESS value: unix:///csi/csi-provisioner.sock From eb55096ebd02aafd03ac1ac73e2590d199e37491 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 8 Jun 2022 14:47:09 +0530 Subject: [PATCH 16/37] e2e: add test case for snapshot metadata validation Signed-off-by: Prasanna Kumar Kalever --- e2e/cephfs.go | 76 ++++++++++++++++++++++++++++++++++++++++++++ e2e/cephfs_helper.go | 71 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 141 insertions(+), 6 deletions(-) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 6b757ef50..57b91a695 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -916,6 +916,82 @@ var _ = Describe(cephfsType, func() { } }) + By("Test subvolume snapshot metadata feature", func() { + err := createCephFSSnapshotClass(f) + if err != nil { + e2elog.Failf("failed to create CephFS snapshotclass: %v", err) + } + pvc, err := loadPVC(pvcPath) + if err != nil { + e2elog.Failf("failed to load PVC: %v", err) + } + pvc.Namespace = f.UniqueName + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to create PVC: %v", err) + } + snap := getSnapshot(snapshotPath) + snap.Namespace = f.UniqueName + snap.Spec.Source.PersistentVolumeClaimName = &pvc.Name + // create snapshot + snap.Name = f.UniqueName + err = createSnapshot(&snap, deployTimeout) + if err != nil { + e2elog.Failf("failed to create snapshot (%s): %v", snap.Name, err) + } + _, pv, err := getPVCAndPV(f.ClientSet, pvc.Name, pvc.Namespace) + if err != nil { + e2elog.Failf("failed to get PV object for %s: %v", pvc.Name, err) + } + subVolumeName := pv.Spec.CSI.VolumeAttributes["subvolumeName"] + snaps, err := listCephFSSnapshots(f, fileSystemName, subVolumeName, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list subvolume snapshots: %v", err) + } + if len(snaps) == 0 { + e2elog.Failf("cephFS snapshots list is empty %s/%s", fileSystemName, subVolumeName) + } + + content, err := getVolumeSnapshotContent(snap.Namespace, snap.Name) + if err != nil { + e2elog.Failf("failed to get snapshotcontent for %s in namespace %s: %v", + snap.Name, snap.Namespace, err) + } + + metadata, err := listCephFSSnapshotMetadata(f, + fileSystemName, subVolumeName, snaps[0].Name, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list subvolume snapshots metadata: %v", err) + } + if metadata.VolSnapNameKey != snap.Name { + e2elog.Failf("failed, snapname expected:%s got:%s", + snap.Name, metadata.VolSnapNameKey) + } else if metadata.VolSnapNamespaceKey != snap.Namespace { + e2elog.Failf("failed, snapnamespace expected:%s got:%s", + snap.Namespace, metadata.VolSnapNamespaceKey) + } else if metadata.VolSnapContentNameKey != content.Name { + e2elog.Failf("failed, contentname expected:%s got:%s", + content.Name, metadata.VolSnapContentNameKey) + } + + // delete snapshot + err = deleteSnapshot(&snap, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete snapshot (%s): %v", f.UniqueName, err) + } + // Delete the parent pvc + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete PVC: %v", err) + } + validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) + validateOmapCount(f, 0, cephfsType, metadataPool, volumesType) + err = deleteResource(cephFSExamplePath + "snapshotclass.yaml") + if err != nil { + e2elog.Failf("failed to delete CephFS snapshotclass: %v", err) + } + }) + By("Delete snapshot after deleting subvolume and snapshot from backend", func() { err := createCephFSSnapshotClass(f) if err != nil { diff --git a/e2e/cephfs_helper.go b/e2e/cephfs_helper.go index 9f641415f..e096734e5 100644 --- a/e2e/cephfs_helper.go +++ b/e2e/cephfs_helper.go @@ -201,7 +201,7 @@ func listCephFSSubVolumes(f *framework.Framework, filesystem, groupname string) return subVols, err } if stdErr != "" { - return subVols, fmt.Errorf("error listing subolumes %v", stdErr) + return subVols, fmt.Errorf("error listing subvolumes %v", stdErr) } err = json.Unmarshal([]byte(stdout), &subVols) @@ -224,20 +224,20 @@ func listCephFSSubvolumeMetadata( filesystem, subvolume, groupname string, -) (cephfsSubvolumeMetadata, error) { - var metadata cephfsSubvolumeMetadata +) (*cephfsSubvolumeMetadata, error) { stdout, stdErr, err := execCommandInToolBoxPod( f, fmt.Sprintf("ceph fs subvolume metadata ls %s %s --group_name=%s --format=json", filesystem, subvolume, groupname), rookNamespace) if err != nil { - return metadata, err + return nil, err } if stdErr != "" { - return metadata, fmt.Errorf("error listing subvolume metadata %v", stdErr) + return nil, fmt.Errorf("error listing subvolume metadata %v", stdErr) } - err = json.Unmarshal([]byte(stdout), &metadata) + metadata := &cephfsSubvolumeMetadata{} + err = json.Unmarshal([]byte(stdout), metadata) if err != nil { return metadata, err } @@ -245,6 +245,65 @@ func listCephFSSubvolumeMetadata( return metadata, nil } +type cephfsSnapshotMetadata struct { + VolSnapNameKey string `json:"csi.storage.k8s.io/volumesnapshot/name"` + VolSnapNamespaceKey string `json:"csi.storage.k8s.io/volumesnapshot/namespace"` + VolSnapContentNameKey string `json:"csi.storage.k8s.io/volumesnapshotcontent/name"` +} + +func listCephFSSnapshotMetadata( + f *framework.Framework, + filesystem, + subvolume, + snapname, + groupname string, +) (*cephfsSnapshotMetadata, error) { + stdout, stdErr, err := execCommandInToolBoxPod( + f, + fmt.Sprintf("ceph fs subvolume snapshot metadata ls %s %s %s --group_name=%s --format=json", + filesystem, subvolume, snapname, groupname), + rookNamespace) + if err != nil { + return nil, err + } + if stdErr != "" { + return nil, fmt.Errorf("error listing subvolume snapshots metadata %v", stdErr) + } + + metadata := &cephfsSnapshotMetadata{} + err = json.Unmarshal([]byte(stdout), metadata) + if err != nil { + return metadata, err + } + + return metadata, nil +} + +type cephfsSnapshot struct { + Name string `json:"name"` +} + +func listCephFSSnapshots(f *framework.Framework, filesystem, subvolume, groupname string) ([]cephfsSnapshot, error) { + var snaps []cephfsSnapshot + stdout, stdErr, err := execCommandInToolBoxPod( + f, + fmt.Sprintf("ceph fs subvolume snapshot ls %s %s --group_name=%s --format=json", filesystem, subvolume, groupname), + rookNamespace) + if err != nil { + return snaps, err + } + if stdErr != "" { + return snaps, fmt.Errorf("error listing subolume snapshots %v", stdErr) + } + + err = json.Unmarshal([]byte(stdout), &snaps) + if err != nil { + return snaps, err + } + + return snaps, nil +} + // getSubvolumepath validates whether subvolumegroup is present. func getSubvolumePath(f *framework.Framework, filesystem, subvolgrp, subvolume string) (string, error) { cmd := fmt.Sprintf("ceph fs subvolume getpath %s %s --group_name=%s", filesystem, subvolume, subvolgrp) From c32e71b31c75df18fd8b236d47777bd8868c74cf Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Thu, 9 Jun 2022 15:09:21 +0530 Subject: [PATCH 17/37] e2e: CephFS validate restore and clone metadata Signed-off-by: Prasanna Kumar Kalever --- e2e/cephfs.go | 101 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 8 deletions(-) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 57b91a695..afb8d7835 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -916,7 +916,7 @@ var _ = Describe(cephfsType, func() { } }) - By("Test subvolume snapshot metadata feature", func() { + By("Test subvolume snapshot and restored PVC metadata", func() { err := createCephFSSnapshotClass(f) if err != nil { e2elog.Failf("failed to create CephFS snapshotclass: %v", err) @@ -951,13 +951,11 @@ var _ = Describe(cephfsType, func() { if len(snaps) == 0 { e2elog.Failf("cephFS snapshots list is empty %s/%s", fileSystemName, subVolumeName) } - content, err := getVolumeSnapshotContent(snap.Namespace, snap.Name) if err != nil { e2elog.Failf("failed to get snapshotcontent for %s in namespace %s: %v", snap.Name, snap.Namespace, err) } - metadata, err := listCephFSSnapshotMetadata(f, fileSystemName, subVolumeName, snaps[0].Name, subvolumegroup) if err != nil { @@ -973,17 +971,52 @@ var _ = Describe(cephfsType, func() { e2elog.Failf("failed, contentname expected:%s got:%s", content.Name, metadata.VolSnapContentNameKey) } + // Delete the parent pvc before restoring + // another one from snapshot. + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete PVC: %v", err) + } + // Test Restore snapshot + pvcClone, err := loadPVC(pvcClonePath) + if err != nil { + e2elog.Failf("failed to load PVC: %v", err) + } + pvcClone.Namespace = f.UniqueName + pvcClone.Spec.DataSource.Name = snap.Name + // create PVC from the snapshot + err = createPVCAndvalidatePV(f.ClientSet, pvcClone, deployTimeout) + if err != nil { + e2elog.Failf("failed to create pvc clone: %v", err) + } + pvcCloneObj, pvCloneObj, err := getPVCAndPV(f.ClientSet, pvcClone.Name, pvcClone.Namespace) + if err != nil { + e2elog.Logf("error getting pvc %q in namespace %q: %v", pvcClone.Name, pvcClone.Namespace, err) + } + subVolumeCloneName := pvCloneObj.Spec.CSI.VolumeAttributes["subvolumeName"] + cloneMetadata, err := listCephFSSubvolumeMetadata(f, fileSystemName, subVolumeCloneName, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list subvolume clone metadata: %v", err) + } + if cloneMetadata.PVCNameKey != pvcClone.Name { + e2elog.Failf("expected pvcName %q got %q", pvcClone.Name, cloneMetadata.PVCNameKey) + } else if cloneMetadata.PVCNamespaceKey != pvcClone.Namespace { + e2elog.Failf("expected pvcNamespace %q got %q", pvcClone.Namespace, cloneMetadata.PVCNamespaceKey) + } else if cloneMetadata.PVNameKey != pvcCloneObj.Spec.VolumeName { + e2elog.Failf("expected pvName %q got %q", pvcCloneObj.Spec.VolumeName, cloneMetadata.PVNameKey) + } + + // delete clone + err = deletePVCAndValidatePV(f.ClientSet, pvcClone, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete pvc clone: %v", err) + } // delete snapshot err = deleteSnapshot(&snap, deployTimeout) if err != nil { e2elog.Failf("failed to delete snapshot (%s): %v", f.UniqueName, err) } - // Delete the parent pvc - err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) - if err != nil { - e2elog.Failf("failed to delete PVC: %v", err) - } validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) validateOmapCount(f, 0, cephfsType, metadataPool, volumesType) err = deleteResource(cephFSExamplePath + "snapshotclass.yaml") @@ -992,6 +1025,58 @@ var _ = Describe(cephfsType, func() { } }) + By("Test Clone metadata", func() { + pvc, err := loadPVC(pvcPath) + if err != nil { + e2elog.Failf("failed to load PVC: %v", err) + } + pvc.Namespace = f.UniqueName + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to create pvc: %v", err) + } + + pvcClone, err := loadPVC(pvcSmartClonePath) + if err != nil { + e2elog.Failf("failed to load PVC: %v", err) + } + pvcClone.Namespace = f.UniqueName + pvcClone.Spec.DataSource.Name = pvc.Name + err = createPVCAndvalidatePV(f.ClientSet, pvcClone, deployTimeout) + if err != nil { + e2elog.Failf("failed to create pvc clone: %v", err) + } + // delete parent PVC + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete pvc: %v", err) + } + + pvcCloneObj, pvCloneObj, err := getPVCAndPV(f.ClientSet, pvcClone.Name, pvcClone.Namespace) + if err != nil { + e2elog.Logf("error getting pvc %q in namespace %q: %v", pvcClone.Name, pvcClone.Namespace, err) + } + subVolumeCloneName := pvCloneObj.Spec.CSI.VolumeAttributes["subvolumeName"] + cloneMetadata, err := listCephFSSubvolumeMetadata(f, fileSystemName, subVolumeCloneName, subvolumegroup) + if err != nil { + e2elog.Failf("failed to list subvolume clone metadata: %v", err) + } + if cloneMetadata.PVCNameKey != pvcClone.Name { + e2elog.Failf("expected pvcName %q got %q", pvc.Name, cloneMetadata.PVCNameKey) + } else if cloneMetadata.PVCNamespaceKey != pvcClone.Namespace { + e2elog.Failf("expected pvcNamespace %q got %q", pvc.Namespace, cloneMetadata.PVCNamespaceKey) + } else if cloneMetadata.PVNameKey != pvcCloneObj.Spec.VolumeName { + e2elog.Failf("expected pvName %q got %q", pvcCloneObj.Spec.VolumeName, cloneMetadata.PVNameKey) + } + + err = deletePVCAndValidatePV(f.ClientSet, pvcClone, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete pvc clone: %v", err) + } + validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) + validateOmapCount(f, 0, cephfsType, metadataPool, volumesType) + }) + By("Delete snapshot after deleting subvolume and snapshot from backend", func() { err := createCephFSSnapshotClass(f) if err != nil { From 856d7c264c2d4f89b3b7371595902697a76b24b0 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 19 Jul 2022 16:02:58 +0530 Subject: [PATCH 18/37] cephfs: handle metadata op-failures with unsupported ceph versions Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 11 +++-- internal/cephfs/core/clone.go | 6 +-- internal/cephfs/core/snapshot.go | 6 ++- internal/cephfs/core/snapshot_metadata.go | 49 ++++++++++++++++++++++- internal/cephfs/core/volume.go | 5 ++- internal/cephfs/store/fsjournal.go | 2 +- internal/cephfs/store/volumeoptions.go | 2 +- 7 files changed, 67 insertions(+), 14 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index 6a2867c52..ea54f245a 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -601,6 +601,7 @@ func cleanUpBackingVolume( snapClient := core.NewSnapshot( snapParentVolOptions.GetConnection(), snapID.FsSnapshotName, + volOptions.ClusterID, &snapParentVolOptions.SubVolume, ) @@ -819,7 +820,11 @@ func (cs *ControllerServer) CreateSnapshot( if sid != nil { // check snapshot is protected protected := true - snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), sid.FsSnapshotName, &parentVolOptions.SubVolume) + snapClient := core.NewSnapshot( + parentVolOptions.GetConnection(), + sid.FsSnapshotName, + parentVolOptions.ClusterID, + &parentVolOptions.SubVolume) if !(snapInfo.Protected == core.SnapshotIsProtected) { err = snapClient.ProtectSnapshot(ctx) if err != nil { @@ -887,7 +892,7 @@ func doSnapshot( ) (core.SnapshotInfo, error) { snapID := fsutil.VolumeID(snapshotName) snap := core.SnapshotInfo{} - snapClient := core.NewSnapshot(volOpt.GetConnection(), snapshotName, &volOpt.SubVolume) + snapClient := core.NewSnapshot(volOpt.GetConnection(), snapshotName, volOpt.ClusterID, &volOpt.SubVolume) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapID, err) @@ -1044,7 +1049,7 @@ func (cs *ControllerServer) DeleteSnapshot( if snapInfo.HasPendingClones == "yes" { return nil, status.Errorf(codes.FailedPrecondition, "snapshot %s has pending clones", snapshotID) } - snapClient := core.NewSnapshot(volOpt.GetConnection(), sid.FsSnapshotName, &volOpt.SubVolume) + snapClient := core.NewSnapshot(volOpt.GetConnection(), sid.FsSnapshotName, volOpt.ClusterID, &volOpt.SubVolume) if snapInfo.Protected == core.SnapshotIsProtected { err = snapClient.UnprotectSnapshot(ctx) if err != nil { diff --git a/internal/cephfs/core/clone.go b/internal/cephfs/core/clone.go index ca88a4914..d2a7f6c87 100644 --- a/internal/cephfs/core/clone.go +++ b/internal/cephfs/core/clone.go @@ -66,7 +66,7 @@ func (s *subVolumeClient) CreateCloneFromSubvolume( parentvolOpt *SubVolume, ) error { snapshotID := s.VolID - snapClient := NewSnapshot(s.conn, snapshotID, parentvolOpt) + snapClient := NewSnapshot(s.conn, snapshotID, s.clusterID, parentvolOpt) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapshotID, err) @@ -165,7 +165,7 @@ func (s *subVolumeClient) CleanupSnapshotFromSubvolume( // snapshot name is same as clone name as we need a name which can be // identified during PVC-PVC cloning. snapShotID := s.VolID - snapClient := NewSnapshot(s.conn, snapShotID, parentVol) + snapClient := NewSnapshot(s.conn, snapShotID, s.clusterID, parentVol) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { @@ -198,7 +198,7 @@ func (s *subVolumeClient) CreateCloneFromSnapshot( ctx context.Context, snap Snapshot, ) error { snapID := snap.SnapshotID - snapClient := NewSnapshot(s.conn, snapID, snap.SubVolume) + snapClient := NewSnapshot(s.conn, snapID, s.clusterID, snap.SubVolume) err := snapClient.CloneSnapshot(ctx, s.SubVolume) if err != nil { return err diff --git a/internal/cephfs/core/snapshot.go b/internal/cephfs/core/snapshot.go index 939b825d6..52b0146e9 100644 --- a/internal/cephfs/core/snapshot.go +++ b/internal/cephfs/core/snapshot.go @@ -62,6 +62,7 @@ type SnapshotClient interface { // snapshotClient is the implementation of SnapshotClient interface. type snapshotClient struct { *Snapshot // Embedded snapshot struct. + clusterID string // Cluster ID. conn *util.ClusterConnection // Cluster connection. } @@ -72,13 +73,14 @@ type Snapshot struct { } // NewSnapshot creates a new snapshot client. -func NewSnapshot(conn *util.ClusterConnection, snapshotID string, vol *SubVolume) SnapshotClient { +func NewSnapshot(conn *util.ClusterConnection, snapshotID, clusterID string, vol *SubVolume) SnapshotClient { return &snapshotClient{ Snapshot: &Snapshot{ SnapshotID: snapshotID, SubVolume: vol, }, - conn: conn, + clusterID: clusterID, + conn: conn, } } diff --git a/internal/cephfs/core/snapshot_metadata.go b/internal/cephfs/core/snapshot_metadata.go index ed893ffb1..f4f2c2cfc 100644 --- a/internal/cephfs/core/snapshot_metadata.go +++ b/internal/cephfs/core/snapshot_metadata.go @@ -17,30 +17,75 @@ limitations under the License. package core import ( + "errors" "fmt" "strings" + + fsAdmin "github.com/ceph/go-ceph/cephfs/admin" ) +// ErrSubVolSnapMetadataNotSupported is returned when set/get/list/remove +// subvolume snapshot metadata options are not supported. +var ErrSubVolSnapMetadataNotSupported = errors.New("subvolume snapshot metadata operations are not supported") + +func (s *snapshotClient) supportsSubVolSnapMetadata() bool { + if _, keyPresent := clusterAdditionalInfo[s.clusterID]; !keyPresent { + clusterAdditionalInfo[s.clusterID] = &localClusterState{} + } + + return clusterAdditionalInfo[s.clusterID].subVolSnapshotMetadataState != unsupported +} + +func (s *snapshotClient) isUnsupportedSubVolSnapMetadata(err error) bool { + var invalid fsAdmin.NotImplementedError + if err != nil && errors.Is(err, &invalid) { + // In case the error is other than invalid command return error to + // the caller. + clusterAdditionalInfo[s.clusterID].subVolSnapshotMetadataState = unsupported + + return false + } + clusterAdditionalInfo[s.clusterID].subVolSnapshotMetadataState = supported + + return true +} + // setSnapshotMetadata sets custom metadata on the subvolume snapshot in a // volume as a key-value pair. func (s *snapshotClient) setSnapshotMetadata(key, value string) error { + if !s.supportsSubVolSnapMetadata() { + return ErrSubVolSnapMetadataNotSupported + } fsa, err := s.conn.GetFSAdmin() if err != nil { return err } - return fsa.SetSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key, value) + err = fsa.SetSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key, value) + if !s.isUnsupportedSubVolSnapMetadata(err) { + return ErrSubVolSnapMetadataNotSupported + } + + return err } // removeSnapshotMetadata removes custom metadata set on the subvolume // snapshot in a volume using the metadata key. func (s *snapshotClient) removeSnapshotMetadata(key string) error { + if !s.supportsSubVolSnapMetadata() { + return ErrSubVolSnapMetadataNotSupported + } fsa, err := s.conn.GetFSAdmin() if err != nil { return err } - return fsa.RemoveSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key) + err = fsa.RemoveSnapshotMetadata(s.FsName, s.SubvolumeGroup, s.VolID, s.SnapshotID, key) + if !s.isUnsupportedSubVolSnapMetadata(err) { + return ErrSubVolSnapMetadataNotSupported + } + + return err } // SetAllSnapshotMetadata set all the metadata from arg parameters on diff --git a/internal/cephfs/core/volume.go b/internal/cephfs/core/volume.go index 9cdec5e00..61e32c3bb 100644 --- a/internal/cephfs/core/volume.go +++ b/internal/cephfs/core/volume.go @@ -191,8 +191,9 @@ const ( type localClusterState struct { // set the enum value i.e., unknown, supported, // unsupported as per the state of the cluster. - resizeState operationState - subVolMetadataState operationState + resizeState operationState + subVolMetadataState operationState + subVolSnapshotMetadataState operationState // set true once a subvolumegroup is created // for corresponding cluster. subVolumeGroupCreated bool diff --git a/internal/cephfs/store/fsjournal.go b/internal/cephfs/store/fsjournal.go index 82c226de0..e5fab689d 100644 --- a/internal/cephfs/store/fsjournal.go +++ b/internal/cephfs/store/fsjournal.go @@ -398,7 +398,7 @@ func CheckSnapExists( snapUUID := snapData.ImageUUID snapID := snapData.ImageAttributes.ImageName sid.FsSnapshotName = snapData.ImageAttributes.ImageName - snapClient := core.NewSnapshot(volOptions.conn, snapID, &volOptions.SubVolume) + snapClient := core.NewSnapshot(volOptions.conn, snapID, volOptions.ClusterID, &volOptions.SubVolume) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { diff --git a/internal/cephfs/store/volumeoptions.go b/internal/cephfs/store/volumeoptions.go index 70ace8cb1..8830ae733 100644 --- a/internal/cephfs/store/volumeoptions.go +++ b/internal/cephfs/store/volumeoptions.go @@ -735,7 +735,7 @@ func NewSnapshotOptionsFromID( volOptions.Features = subvolInfo.Features volOptions.Size = subvolInfo.BytesQuota volOptions.RootPath = subvolInfo.Path - snap := core.NewSnapshot(volOptions.conn, sid.FsSnapshotName, &volOptions.SubVolume) + snap := core.NewSnapshot(volOptions.conn, sid.FsSnapshotName, volOptions.ClusterID, &volOptions.SubVolume) info, err := snap.GetSnapshotInfo(ctx) if err != nil { return &volOptions, nil, &sid, err From a04a0ecc9f21bad74ca1141e1a6041e2557ee7b9 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 26 Jul 2022 15:28:59 +0200 Subject: [PATCH 19/37] ci: retry command in Pod on "unable to upgrade connection" error Sometimes executing a command in a Pod fails with "unable to upgrade connection". This is most likely a temporary situation, and retrying hopefully reduces the number of spurious failures because of it. Signed-off-by: Niels de Vos --- e2e/errors.go | 5 +++++ e2e/pod.go | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/e2e/errors.go b/e2e/errors.go index a9a5d6b5a..ad32b5c88 100644 --- a/e2e/errors.go +++ b/e2e/errors.go @@ -41,6 +41,11 @@ func isRetryableAPIError(err error) bool { return true } + // "unable to upgrade connection" happens occasionally when executing commands in Pods + if strings.Contains(err.Error(), "unable to upgrade connection") { + return true + } + // "transport is closing" is an internal gRPC err, we can not use ErrConnClosing if strings.Contains(err.Error(), "transport is closing") { return true diff --git a/e2e/pod.go b/e2e/pod.go index cf281caa3..ec6b0ff93 100644 --- a/e2e/pod.go +++ b/e2e/pod.go @@ -197,7 +197,7 @@ func execCommandInDaemonsetPod( CaptureStderr: true, } - _ /* stdout */, stderr, err := f.ExecWithOptions(podOpt) + _ /* stdout */, stderr, err := execWithRetry(f, &podOpt) return stderr, err } @@ -212,12 +212,35 @@ func listPods(f *framework.Framework, ns string, opt *metav1.ListOptions) ([]v1. return podList.Items, err } +func execWithRetry(f *framework.Framework, opts *framework.ExecOptions) (string, string, error) { + timeout := time.Duration(deployTimeout) * time.Minute + var stdOut, stdErr string + err := wait.PollImmediate(poll, timeout, func() (bool, error) { + var execErr error + stdOut, stdErr, execErr = f.ExecWithOptions(*opts) + if execErr != nil { + if isRetryableAPIError(execErr) { + return false, nil + } + + e2elog.Logf("failed to execute command: %v", execErr) + + return false, fmt.Errorf("failed to execute command: %w", execErr) + } + + return true, nil + }) + + return stdOut, stdErr, err +} + func execCommandInPod(f *framework.Framework, c, ns string, opt *metav1.ListOptions) (string, string, error) { podOpt, err := getCommandInPodOpts(f, c, ns, "", opt) if err != nil { return "", "", err } - stdOut, stdErr, err := f.ExecWithOptions(podOpt) + + stdOut, stdErr, err := execWithRetry(f, &podOpt) if stdErr != "" { e2elog.Logf("stdErr occurred: %v", stdErr) } @@ -232,7 +255,8 @@ func execCommandInContainer( if err != nil { return "", "", err } - stdOut, stdErr, err := f.ExecWithOptions(podOpt) + + stdOut, stdErr, err := execWithRetry(f, &podOpt) if stdErr != "" { e2elog.Logf("stdErr occurred: %v", stdErr) } @@ -255,7 +279,7 @@ func execCommandInContainerByPodName( PreserveWhitespace: true, } - stdOut, stdErr, err := f.ExecWithOptions(execOpts) + stdOut, stdErr, err := execWithRetry(f, &execOpts) if stdErr != "" { e2elog.Logf("stdErr occurred: %v", stdErr) } @@ -271,7 +295,8 @@ func execCommandInToolBoxPod(f *framework.Framework, c, ns string) (string, stri if err != nil { return "", "", err } - stdOut, stdErr, err := f.ExecWithOptions(podOpt) + + stdOut, stdErr, err := execWithRetry(f, &podOpt) if stdErr != "" { e2elog.Logf("stdErr occurred: %v", stdErr) } @@ -284,7 +309,8 @@ func execCommandInPodAndAllowFail(f *framework.Framework, c, ns string, opt *met if err != nil { return "", err.Error() } - stdOut, stdErr, err := f.ExecWithOptions(podOpt) + + stdOut, stdErr, err := execWithRetry(f, &podOpt) if err != nil { e2elog.Logf("command %s failed: %v", c, err) } From 48dc0c95a6e74848d0581994a8a121646dc4d675 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Jul 2022 20:26:55 +0000 Subject: [PATCH 20/37] rebase: bump github.com/aws/aws-sdk-go from 1.44.28 to 1.44.62 Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.28 to 1.44.62. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Changelog](https://github.com/aws/aws-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.28...v1.44.62) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 +- .../aws/aws-sdk-go/aws/endpoints/defaults.go | 1490 ++++++- .../github.com/aws/aws-sdk-go/aws/version.go | 2 +- .../aws/aws-sdk-go/service/ec2/api.go | 3427 +++++++++++++++-- .../aws/aws-sdk-go/service/kms/api.go | 397 +- vendor/modules.txt | 2 +- 7 files changed, 4999 insertions(+), 324 deletions(-) diff --git a/go.mod b/go.mod index c438b8886..67c909b7b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/IBM/keyprotect-go-client v0.8.0 - github.com/aws/aws-sdk-go v1.44.28 + github.com/aws/aws-sdk-go v1.44.62 github.com/aws/aws-sdk-go-v2/service/sts v1.16.9 github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000 // TODO: API for managing subvolume metadata and snapshot metadata requires `ceph_ci_untested` build-tag diff --git a/go.sum b/go.sum index 9878ef466..a292585bb 100644 --- a/go.sum +++ b/go.sum @@ -141,8 +141,9 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.28 h1:h/OAqEqY18wq//v6h4GNPMmCkxuzSDrWuGyrvSiRqf4= github.com/aws/aws-sdk-go v1.44.28/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.62 h1:N8qOPnBhl2ZCIFiqyB640Xt5CeX9D8CEVhG/Vj7jGJU= +github.com/aws/aws-sdk-go v1.44.62/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.16.7 h1:zfBwXus3u14OszRxGcqCDS4MfMCv10e8SMJ2r8Xm0Ns= github.com/aws/aws-sdk-go-v2 v1.16.7/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14 h1:2C0pYHcUBmdzPj+EKNC4qj97oK6yjrUhc1KoSodglvk= diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go index fa4f51124..2647b7cf3 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -800,18 +800,33 @@ var awsPartition = partition{ endpointKey{ Region: "eu-central-1", }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, endpointKey{ Region: "eu-west-1", }: endpoint{}, endpointKey{ Region: "eu-west-2", }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, endpointKey{ Region: "us-east-1", }: endpoint{}, endpointKey{ Region: "us-east-2", }: endpoint{}, + endpointKey{ + Region: "us-west-1", + }: endpoint{}, endpointKey{ Region: "us-west-2", }: endpoint{}, @@ -1506,6 +1521,42 @@ var awsPartition = partition{ }, }, }, + "api.iotdeviceadvisor": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{ + Hostname: "api.iotdeviceadvisor.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + endpointKey{ + Region: "eu-west-1", + }: endpoint{ + Hostname: "api.iotdeviceadvisor.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + endpointKey{ + Region: "us-east-1", + }: endpoint{ + Hostname: "api.iotdeviceadvisor.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + endpointKey{ + Region: "us-west-2", + }: endpoint{ + Hostname: "api.iotdeviceadvisor.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, "api.iotwireless": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -1969,6 +2020,76 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "appconfig": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-east-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-south-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-1", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "appconfigdata": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -2542,6 +2663,9 @@ var awsPartition = partition{ }, Deprecated: boxedTrue, }, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, endpointKey{ Region: "us-west-2", }: endpoint{}, @@ -3301,6 +3425,13 @@ var awsPartition = partition{ }, }, }, + "catalog.marketplace": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + }, + }, "ce": service{ PartitionEndpoint: "aws-global", IsRegionalized: boxedFalse, @@ -4037,6 +4168,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -5389,6 +5523,22 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "connect-campaigns": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "contact-lens": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -6041,6 +6191,87 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "devops-guru": service{ + Defaults: endpointDefaults{ + defaultKey{}: endpoint{ + Protocols: []string{"https"}, + }, + }, + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "fips-us-east-1", + }: endpoint{ + Hostname: "devops-guru-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-east-2", + }: endpoint{ + Hostname: "devops-guru-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-west-2", + }: endpoint{ + Hostname: "devops-guru-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "devops-guru-fips.us-east-1.amazonaws.com", + }, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "devops-guru-fips.us-east-2.amazonaws.com", + }, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "devops-guru-fips.us-west-2.amazonaws.com", + }, + }, + }, "directconnect": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -6196,6 +6427,76 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "dlm": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-east-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-south-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-1", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "dms": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -6471,30 +6772,66 @@ var awsPartition = partition{ }, "drs": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-east-1", + }: endpoint{}, endpointKey{ Region: "ap-northeast-1", }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, endpointKey{ Region: "ap-southeast-1", }: endpoint{}, endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, endpointKey{ Region: "eu-central-1", }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-south-1", + }: endpoint{}, endpointKey{ Region: "eu-west-1", }: endpoint{}, endpointKey{ Region: "eu-west-2", }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, endpointKey{ Region: "us-east-1", }: endpoint{}, endpointKey{ Region: "us-east-2", }: endpoint{}, + endpointKey{ + Region: "us-west-1", + }: endpoint{}, endpointKey{ Region: "us-west-2", }: endpoint{}, @@ -7262,6 +7599,28 @@ var awsPartition = partition{ }, }, }, + "edge.sagemaker": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "eks": service{ Defaults: endpointDefaults{ defaultKey{}: endpoint{ @@ -7568,6 +7927,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -10669,7 +11031,23 @@ var awsPartition = partition{ }, }, "health": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + Defaults: endpointDefaults{ + defaultKey{}: endpoint{ + SSLCommonName: "health.us-east-1.amazonaws.com", + Protocols: []string{"https"}, + }, + }, Endpoints: serviceEndpoints{ + endpointKey{ + Region: "aws-global", + }: endpoint{ + Hostname: "global.health.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, endpointKey{ Region: "fips-us-east-2", }: endpoint{ @@ -12095,6 +12473,9 @@ var awsPartition = partition{ }, "kinesisvideo": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{}, endpointKey{ Region: "ap-east-1", }: endpoint{}, @@ -13306,6 +13687,31 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "m2": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "machinelearning": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -15005,6 +15411,14 @@ var awsPartition = partition{ }, "oidc": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-east-1", + }: endpoint{ + Hostname: "oidc.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, endpointKey{ Region: "ap-northeast-1", }: endpoint{ @@ -15077,6 +15491,14 @@ var awsPartition = partition{ Region: "eu-north-1", }, }, + endpointKey{ + Region: "eu-south-1", + }: endpoint{ + Hostname: "oidc.eu-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-south-1", + }, + }, endpointKey{ Region: "eu-west-1", }: endpoint{ @@ -15101,6 +15523,14 @@ var awsPartition = partition{ Region: "eu-west-3", }, }, + endpointKey{ + Region: "me-south-1", + }: endpoint{ + Hostname: "oidc.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, endpointKey{ Region: "sa-east-1", }: endpoint{ @@ -15452,6 +15882,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -15706,6 +16139,14 @@ var awsPartition = partition{ }, "portal.sso": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-east-1", + }: endpoint{ + Hostname: "portal.sso.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, endpointKey{ Region: "ap-northeast-1", }: endpoint{ @@ -15778,6 +16219,14 @@ var awsPartition = partition{ Region: "eu-north-1", }, }, + endpointKey{ + Region: "eu-south-1", + }: endpoint{ + Hostname: "portal.sso.eu-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-south-1", + }, + }, endpointKey{ Region: "eu-west-1", }: endpoint{ @@ -15802,6 +16251,14 @@ var awsPartition = partition{ Region: "eu-west-3", }, }, + endpointKey{ + Region: "me-south-1", + }: endpoint{ + Hostname: "portal.sso.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, endpointKey{ Region: "sa-east-1", }: endpoint{ @@ -16697,6 +17154,43 @@ var awsPartition = partition{ }, }, }, + "redshift-serverless": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "rekognition": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -17169,6 +17663,67 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "rolesanywhere": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-east-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-1", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "route53": service{ PartitionEndpoint: "aws-global", IsRegionalized: boxedFalse, @@ -18853,6 +19408,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -19079,6 +19637,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -20619,6 +21180,67 @@ var awsPartition = partition{ }: endpoint{}, }, }, + "sso": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-east-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-central-1", + }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, + endpointKey{ + Region: "eu-south-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-1", + }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "me-south-1", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-east-2", + }: endpoint{}, + endpointKey{ + Region: "us-west-2", + }: endpoint{}, + }, + }, "states": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -22786,6 +23408,582 @@ var awsPartition = partition{ }, }, }, + "wafv2": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{ + Hostname: "wafv2.af-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "af-south-1", + }, + }, + endpointKey{ + Region: "af-south-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.af-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "af-south-1", + }, + }, + endpointKey{ + Region: "ap-east-1", + }: endpoint{ + Hostname: "wafv2.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, + endpointKey{ + Region: "ap-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{ + Hostname: "wafv2.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + endpointKey{ + Region: "ap-northeast-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{ + Hostname: "wafv2.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + endpointKey{ + Region: "ap-northeast-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{ + Hostname: "wafv2.ap-northeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-3", + }, + }, + endpointKey{ + Region: "ap-northeast-3", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-3", + }, + }, + endpointKey{ + Region: "ap-south-1", + }: endpoint{ + Hostname: "wafv2.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + endpointKey{ + Region: "ap-south-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{ + Hostname: "wafv2.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + endpointKey{ + Region: "ap-southeast-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{ + Hostname: "wafv2.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + endpointKey{ + Region: "ap-southeast-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{ + Hostname: "wafv2.ap-southeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-3", + }, + }, + endpointKey{ + Region: "ap-southeast-3", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-3", + }, + }, + endpointKey{ + Region: "ca-central-1", + }: endpoint{ + Hostname: "wafv2.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + endpointKey{ + Region: "ca-central-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + endpointKey{ + Region: "eu-central-1", + }: endpoint{ + Hostname: "wafv2.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + endpointKey{ + Region: "eu-central-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + endpointKey{ + Region: "eu-north-1", + }: endpoint{ + Hostname: "wafv2.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + endpointKey{ + Region: "eu-north-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + endpointKey{ + Region: "eu-south-1", + }: endpoint{ + Hostname: "wafv2.eu-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-south-1", + }, + }, + endpointKey{ + Region: "eu-south-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-south-1", + }, + }, + endpointKey{ + Region: "eu-west-1", + }: endpoint{ + Hostname: "wafv2.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + endpointKey{ + Region: "eu-west-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + endpointKey{ + Region: "eu-west-2", + }: endpoint{ + Hostname: "wafv2.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + endpointKey{ + Region: "eu-west-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + endpointKey{ + Region: "eu-west-3", + }: endpoint{ + Hostname: "wafv2.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + endpointKey{ + Region: "eu-west-3", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + endpointKey{ + Region: "fips-af-south-1", + }: endpoint{ + Hostname: "wafv2-fips.af-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "af-south-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-east-1", + }: endpoint{ + Hostname: "wafv2-fips.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-northeast-1", + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-northeast-2", + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-northeast-3", + }: endpoint{ + Hostname: "wafv2-fips.ap-northeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-3", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-south-1", + }: endpoint{ + Hostname: "wafv2-fips.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-southeast-1", + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-southeast-2", + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ap-southeast-3", + }: endpoint{ + Hostname: "wafv2-fips.ap-southeast-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-3", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-ca-central-1", + }: endpoint{ + Hostname: "wafv2-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-central-1", + }: endpoint{ + Hostname: "wafv2-fips.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-north-1", + }: endpoint{ + Hostname: "wafv2-fips.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-south-1", + }: endpoint{ + Hostname: "wafv2-fips.eu-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-south-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-west-1", + }: endpoint{ + Hostname: "wafv2-fips.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-west-2", + }: endpoint{ + Hostname: "wafv2-fips.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-eu-west-3", + }: endpoint{ + Hostname: "wafv2-fips.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-me-south-1", + }: endpoint{ + Hostname: "wafv2-fips.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-sa-east-1", + }: endpoint{ + Hostname: "wafv2-fips.sa-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-east-1", + }: endpoint{ + Hostname: "wafv2-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-east-2", + }: endpoint{ + Hostname: "wafv2-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-west-1", + }: endpoint{ + Hostname: "wafv2-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-west-2", + }: endpoint{ + Hostname: "wafv2-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "me-south-1", + }: endpoint{ + Hostname: "wafv2.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, + endpointKey{ + Region: "me-south-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.me-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "me-south-1", + }, + }, + endpointKey{ + Region: "sa-east-1", + }: endpoint{ + Hostname: "wafv2.sa-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + endpointKey{ + Region: "sa-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.sa-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + endpointKey{ + Region: "us-east-1", + }: endpoint{ + Hostname: "wafv2.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + endpointKey{ + Region: "us-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + endpointKey{ + Region: "us-east-2", + }: endpoint{ + Hostname: "wafv2.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + endpointKey{ + Region: "us-east-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + endpointKey{ + Region: "us-west-1", + }: endpoint{ + Hostname: "wafv2.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + endpointKey{ + Region: "us-west-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + endpointKey{ + Region: "us-west-2", + }: endpoint{ + Hostname: "wafv2.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + endpointKey{ + Region: "us-west-2", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, "wellarchitected": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -23008,6 +24206,18 @@ var awsPartition = partition{ }, "workspaces-web": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "ap-northeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-1", + }: endpoint{}, + endpointKey{ + Region: "ap-southeast-2", + }: endpoint{}, endpointKey{ Region: "eu-west-1", }: endpoint{}, @@ -23291,6 +24501,16 @@ var awscnPartition = partition{ }: endpoint{}, }, }, + "appconfig": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "cn-north-1", + }: endpoint{}, + endpointKey{ + Region: "cn-northwest-1", + }: endpoint{}, + }, + }, "appconfigdata": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -23633,6 +24853,16 @@ var awscnPartition = partition{ }: endpoint{}, }, }, + "dlm": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "cn-north-1", + }: endpoint{}, + endpointKey{ + Region: "cn-northwest-1", + }: endpoint{}, + }, + }, "dms": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -23950,13 +25180,23 @@ var awscnPartition = partition{ }, }, "health": service{ + PartitionEndpoint: "aws-cn-global", + IsRegionalized: boxedFalse, + Defaults: endpointDefaults{ + defaultKey{}: endpoint{ + SSLCommonName: "health.cn-northwest-1.amazonaws.com.cn", + Protocols: []string{"https"}, + }, + }, Endpoints: serviceEndpoints{ endpointKey{ - Region: "cn-north-1", - }: endpoint{}, - endpointKey{ - Region: "cn-northwest-1", - }: endpoint{}, + Region: "aws-cn-global", + }: endpoint{ + Hostname: "global.health.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, }, }, "iam": service{ @@ -24743,6 +25983,62 @@ var awscnPartition = partition{ }, }, }, + "wafv2": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "cn-north-1", + }: endpoint{ + Hostname: "wafv2.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + endpointKey{ + Region: "cn-north-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + endpointKey{ + Region: "cn-northwest-1", + }: endpoint{ + Hostname: "wafv2.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + endpointKey{ + Region: "cn-northwest-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + endpointKey{ + Region: "fips-cn-north-1", + }: endpoint{ + Hostname: "wafv2-fips.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-cn-northwest-1", + }: endpoint{ + Hostname: "wafv2-fips.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + Deprecated: boxedTrue, + }, + }, + }, "workspaces": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -25195,6 +26491,46 @@ var awsusgovPartition = partition{ }: endpoint{}, }, }, + "appconfig": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "fips-us-gov-east-1", + }: endpoint{ + Hostname: "appconfig.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-gov-west-1", + }: endpoint{ + Hostname: "appconfig.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-gov-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "appconfig.us-gov-east-1.amazonaws.com", + }, + endpointKey{ + Region: "us-gov-west-1", + }: endpoint{}, + endpointKey{ + Region: "us-gov-west-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "appconfig.us-gov-west-1.amazonaws.com", + }, + }, + }, "appconfigdata": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -26021,6 +27357,16 @@ var awsusgovPartition = partition{ }, }, }, + "dlm": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-gov-west-1", + }: endpoint{}, + }, + }, "dms": service{ Defaults: endpointDefaults{ defaultKey{}: endpoint{}, @@ -27419,6 +28765,15 @@ var awsusgovPartition = partition{ }, "lakeformation": service{ Endpoints: serviceEndpoints{ + endpointKey{ + Region: "fips-us-gov-east-1", + }: endpoint{ + Hostname: "lakeformation-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + Deprecated: boxedTrue, + }, endpointKey{ Region: "fips-us-gov-west-1", }: endpoint{ @@ -27428,6 +28783,15 @@ var awsusgovPartition = partition{ }, Deprecated: boxedTrue, }, + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-gov-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "lakeformation-fips.us-gov-east-1.amazonaws.com", + }, endpointKey{ Region: "us-gov-west-1", }: endpoint{}, @@ -29033,6 +30397,26 @@ var awsusgovPartition = partition{ }, }, }, + "sso": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{ + Hostname: "sso.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + endpointKey{ + Region: "us-gov-west-1", + }: endpoint{ + Hostname: "sso.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, "states": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -29426,6 +30810,16 @@ var awsusgovPartition = partition{ }, }, }, + "transcribestreaming": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-gov-west-1", + }: endpoint{}, + }, + }, "transfer": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -29549,6 +30943,62 @@ var awsusgovPartition = partition{ }, }, }, + "wafv2": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "fips-us-gov-east-1", + }: endpoint{ + Hostname: "wafv2-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "fips-us-gov-west-1", + }: endpoint{ + Hostname: "wafv2-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + Deprecated: boxedTrue, + }, + endpointKey{ + Region: "us-gov-east-1", + }: endpoint{ + Hostname: "wafv2.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + endpointKey{ + Region: "us-gov-east-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + endpointKey{ + Region: "us-gov-west-1", + }: endpoint{ + Hostname: "wafv2.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + endpointKey{ + Region: "us-gov-west-1", + Variant: fipsVariant, + }: endpoint{ + Hostname: "wafv2-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, "workspaces": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -29687,6 +31137,16 @@ var awsisoPartition = partition{ }: endpoint{}, }, }, + "appconfig": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-iso-east-1", + }: endpoint{}, + endpointKey{ + Region: "us-iso-west-1", + }: endpoint{}, + }, + }, "appconfigdata": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -29984,6 +31444,9 @@ var awsisoPartition = partition{ endpointKey{ Region: "us-iso-east-1", }: endpoint{}, + endpointKey{ + Region: "us-iso-west-1", + }: endpoint{}, }, }, "events": service{ @@ -30293,6 +31756,9 @@ var awsisoPartition = partition{ endpointKey{ Region: "us-iso-east-1", }: endpoint{}, + endpointKey{ + Region: "us-iso-west-1", + }: endpoint{}, }, }, "sts": service{ @@ -30431,6 +31897,13 @@ var awsisobPartition = partition{ }, }, }, + "appconfig": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-isob-east-1", + }: endpoint{}, + }, + }, "application-autoscaling": service{ Defaults: endpointDefaults{ defaultKey{}: endpoint{ @@ -30907,5 +32380,12 @@ var awsisobPartition = partition{ }: endpoint{}, }, }, + "workspaces": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-isob-east-1", + }: endpoint{}, + }, + }, }, } diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go index 2b7294f78..2422f101a 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -5,4 +5,4 @@ package aws const SDKName = "aws-sdk-go" // SDKVersion is the version of this SDK -const SDKVersion = "1.44.28" +const SDKVersion = "1.44.62" diff --git a/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go b/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go index 04170f403..d00d57980 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go @@ -784,8 +784,8 @@ func (c *EC2) AllocateIpamPoolCidrRequest(input *AllocateIpamPoolCidrInput) (req // // Allocate a CIDR from an IPAM pool. In IPAM, an allocation is a CIDR assignment // from an IPAM pool to another resource or IPAM pool. For more information, -// see Allocate CIDRs (/vpc/latest/ipam/allocate-cidrs-ipam.html) in the Amazon -// VPC IPAM User Guide. +// see Allocate CIDRs (https://docs.aws.amazon.com/vpc/latest/ipam/allocate-cidrs-ipam.html) +// in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -1838,6 +1838,81 @@ func (c *EC2) AssociateTransitGatewayMulticastDomainWithContext(ctx aws.Context, return out, req.Send() } +const opAssociateTransitGatewayPolicyTable = "AssociateTransitGatewayPolicyTable" + +// AssociateTransitGatewayPolicyTableRequest generates a "aws/request.Request" representing the +// client's request for the AssociateTransitGatewayPolicyTable operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See AssociateTransitGatewayPolicyTable for more information on using the AssociateTransitGatewayPolicyTable +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the AssociateTransitGatewayPolicyTableRequest method. +// req, resp := client.AssociateTransitGatewayPolicyTableRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateTransitGatewayPolicyTable +func (c *EC2) AssociateTransitGatewayPolicyTableRequest(input *AssociateTransitGatewayPolicyTableInput) (req *request.Request, output *AssociateTransitGatewayPolicyTableOutput) { + op := &request.Operation{ + Name: opAssociateTransitGatewayPolicyTable, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &AssociateTransitGatewayPolicyTableInput{} + } + + output = &AssociateTransitGatewayPolicyTableOutput{} + req = c.newRequest(op, input, output) + return +} + +// AssociateTransitGatewayPolicyTable API operation for Amazon Elastic Compute Cloud. +// +// Associates the specified transit gateway attachment with a transit gateway +// policy table. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation AssociateTransitGatewayPolicyTable for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateTransitGatewayPolicyTable +func (c *EC2) AssociateTransitGatewayPolicyTable(input *AssociateTransitGatewayPolicyTableInput) (*AssociateTransitGatewayPolicyTableOutput, error) { + req, out := c.AssociateTransitGatewayPolicyTableRequest(input) + return out, req.Send() +} + +// AssociateTransitGatewayPolicyTableWithContext is the same as AssociateTransitGatewayPolicyTable with the addition of +// the ability to pass a context and additional request options. +// +// See AssociateTransitGatewayPolicyTable for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) AssociateTransitGatewayPolicyTableWithContext(ctx aws.Context, input *AssociateTransitGatewayPolicyTableInput, opts ...request.Option) (*AssociateTransitGatewayPolicyTableOutput, error) { + req, out := c.AssociateTransitGatewayPolicyTableRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opAssociateTransitGatewayRouteTable = "AssociateTransitGatewayRouteTable" // AssociateTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the @@ -4329,12 +4404,11 @@ func (c *EC2) CreateCustomerGatewayRequest(input *CreateCustomerGatewayInput) (r // CreateCustomerGateway API operation for Amazon Elastic Compute Cloud. // -// Provides information to Amazon Web Services about your VPN customer gateway -// device. The customer gateway is the appliance at your end of the VPN connection. -// (The device on the Amazon Web Services side of the VPN connection is the -// virtual private gateway.) You must provide the internet-routable IP address -// of the customer gateway's external interface. The IP address must be static -// and can be behind a device performing network address translation (NAT). +// Provides information to Amazon Web Services about your customer gateway device. +// The customer gateway device is the appliance at your end of the VPN connection. +// You must provide the IP address of the customer gateway device’s external +// interface. The IP address must be static and can be behind a device performing +// network address translation (NAT). // // For devices that use Border Gateway Protocol (BGP), you can also provide // the device's BGP Autonomous System Number (ASN). You can use an existing @@ -5377,7 +5451,7 @@ func (c *EC2) CreateIpamRequest(input *CreateIpamInput) (req *request.Request, o // tracking, troubleshooting, and auditing IP addresses across Amazon Web Services // Regions and accounts throughout your Amazon Web Services Organization. // -// For more information, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) +// For more information, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -5458,7 +5532,7 @@ func (c *EC2) CreateIpamPoolRequest(input *CreateIpamPoolInput) (req *request.Re // For example, if you have separate routing and security needs for development // and production applications, you can create a pool for each. // -// For more information, see Create a top-level pool (/vpc/latest/ipam/create-top-ipam.html) +// For more information, see Create a top-level pool (https://docs.aws.amazon.com/vpc/latest/ipam/create-top-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -5540,7 +5614,7 @@ func (c *EC2) CreateIpamScopeRequest(input *CreateIpamScopeInput) (req *request. // enable you to reuse IP addresses across multiple unconnected networks without // causing IP address overlap or conflict. // -// For more information, see Add a scope (/vpc/latest/ipam/add-scope-ipam.html) +// For more information, see Add a scope (https://docs.aws.amazon.com/vpc/latest/ipam/add-scope-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -5789,8 +5863,8 @@ func (c *EC2) CreateLaunchTemplateVersionRequest(input *CreateLaunchTemplateVers // CreateLaunchTemplateVersion API operation for Amazon Elastic Compute Cloud. // -// Creates a new version for a launch template. You can specify an existing -// version of launch template from which to base the new version. +// Creates a new version of a launch template. You can specify an existing version +// of launch template from which to base the new version. // // Launch template versions are numbered in the order in which they are created. // You cannot specify, change, or replace the numbering of launch template versions. @@ -5800,8 +5874,8 @@ func (c *EC2) CreateLaunchTemplateVersionRequest(input *CreateLaunchTemplateVers // includes any changes you require. // // For more information, see Modify a launch template (manage launch template -// versions) (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#manage-launch-template-versions)in -// the Amazon Elastic Compute Cloud User Guide. +// versions) (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#manage-launch-template-versions) +// in the Amazon Elastic Compute Cloud User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -7092,9 +7166,8 @@ func (c *EC2) CreateRouteRequest(input *CreateRouteInput) (req *request.Request, // // Creates a route in a route table within a VPC. // -// You must specify one of the following targets: internet gateway or virtual -// private gateway, NAT instance, NAT gateway, VPC peering connection, network -// interface, egress-only internet gateway, or transit gateway. +// You must specify either a destination CIDR block or a prefix list ID. You +// must also specify exactly one of the resources from the parameter list. // // When determining how to route traffic, we use the route with the most specific // match. For example, traffic is destined for the IPv4 address 192.0.2.3, and @@ -7890,10 +7963,10 @@ func (c *EC2) CreateTagsRequest(input *CreateTagsInput) (req *request.Request, o // with the new value. Each resource can have a maximum of 50 tags. Each tag // consists of a key and optional value. Tag keys must be unique per resource. // -// For more information about tags, see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) +// For more information about tags, see Tag your Amazon EC2 resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) // in the Amazon Elastic Compute Cloud User Guide. For more information about // creating IAM policies that control users' access to resources based on tags, -// see Supported Resource-Level Permissions for Amazon EC2 API Actions (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html) +// see Supported resource-level permissions for Amazon EC2 API actions (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html) // in the Amazon Elastic Compute Cloud User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -8631,9 +8704,8 @@ func (c *EC2) CreateTransitGatewayPeeringAttachmentRequest(input *CreateTransitG // CreateTransitGatewayPeeringAttachment API operation for Amazon Elastic Compute Cloud. // // Requests a transit gateway peering attachment between the specified transit -// gateway (requester) and a peer transit gateway (accepter). The transit gateways -// must be in different Regions. The peer transit gateway can be in your account -// or a different Amazon Web Services account. +// gateway (requester) and a peer transit gateway (accepter). The peer transit +// gateway can be in your account or a different Amazon Web Services account. // // After you create the peering attachment, the owner of the accepter transit // gateway must accept the attachment request. @@ -8666,6 +8738,80 @@ func (c *EC2) CreateTransitGatewayPeeringAttachmentWithContext(ctx aws.Context, return out, req.Send() } +const opCreateTransitGatewayPolicyTable = "CreateTransitGatewayPolicyTable" + +// CreateTransitGatewayPolicyTableRequest generates a "aws/request.Request" representing the +// client's request for the CreateTransitGatewayPolicyTable operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See CreateTransitGatewayPolicyTable for more information on using the CreateTransitGatewayPolicyTable +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the CreateTransitGatewayPolicyTableRequest method. +// req, resp := client.CreateTransitGatewayPolicyTableRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayPolicyTable +func (c *EC2) CreateTransitGatewayPolicyTableRequest(input *CreateTransitGatewayPolicyTableInput) (req *request.Request, output *CreateTransitGatewayPolicyTableOutput) { + op := &request.Operation{ + Name: opCreateTransitGatewayPolicyTable, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &CreateTransitGatewayPolicyTableInput{} + } + + output = &CreateTransitGatewayPolicyTableOutput{} + req = c.newRequest(op, input, output) + return +} + +// CreateTransitGatewayPolicyTable API operation for Amazon Elastic Compute Cloud. +// +// Creates a transit gateway policy table. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation CreateTransitGatewayPolicyTable for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayPolicyTable +func (c *EC2) CreateTransitGatewayPolicyTable(input *CreateTransitGatewayPolicyTableInput) (*CreateTransitGatewayPolicyTableOutput, error) { + req, out := c.CreateTransitGatewayPolicyTableRequest(input) + return out, req.Send() +} + +// CreateTransitGatewayPolicyTableWithContext is the same as CreateTransitGatewayPolicyTable with the addition of +// the ability to pass a context and additional request options. +// +// See CreateTransitGatewayPolicyTable for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) CreateTransitGatewayPolicyTableWithContext(ctx aws.Context, input *CreateTransitGatewayPolicyTableInput, opts ...request.Option) (*CreateTransitGatewayPolicyTableOutput, error) { + req, out := c.CreateTransitGatewayPolicyTableRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opCreateTransitGatewayPrefixListReference = "CreateTransitGatewayPrefixListReference" // CreateTransitGatewayPrefixListReferenceRequest generates a "aws/request.Request" representing the @@ -8889,6 +9035,80 @@ func (c *EC2) CreateTransitGatewayRouteTableWithContext(ctx aws.Context, input * return out, req.Send() } +const opCreateTransitGatewayRouteTableAnnouncement = "CreateTransitGatewayRouteTableAnnouncement" + +// CreateTransitGatewayRouteTableAnnouncementRequest generates a "aws/request.Request" representing the +// client's request for the CreateTransitGatewayRouteTableAnnouncement operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See CreateTransitGatewayRouteTableAnnouncement for more information on using the CreateTransitGatewayRouteTableAnnouncement +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the CreateTransitGatewayRouteTableAnnouncementRequest method. +// req, resp := client.CreateTransitGatewayRouteTableAnnouncementRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRouteTableAnnouncement +func (c *EC2) CreateTransitGatewayRouteTableAnnouncementRequest(input *CreateTransitGatewayRouteTableAnnouncementInput) (req *request.Request, output *CreateTransitGatewayRouteTableAnnouncementOutput) { + op := &request.Operation{ + Name: opCreateTransitGatewayRouteTableAnnouncement, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &CreateTransitGatewayRouteTableAnnouncementInput{} + } + + output = &CreateTransitGatewayRouteTableAnnouncementOutput{} + req = c.newRequest(op, input, output) + return +} + +// CreateTransitGatewayRouteTableAnnouncement API operation for Amazon Elastic Compute Cloud. +// +// Advertises a new transit gateway route table. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation CreateTransitGatewayRouteTableAnnouncement for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRouteTableAnnouncement +func (c *EC2) CreateTransitGatewayRouteTableAnnouncement(input *CreateTransitGatewayRouteTableAnnouncementInput) (*CreateTransitGatewayRouteTableAnnouncementOutput, error) { + req, out := c.CreateTransitGatewayRouteTableAnnouncementRequest(input) + return out, req.Send() +} + +// CreateTransitGatewayRouteTableAnnouncementWithContext is the same as CreateTransitGatewayRouteTableAnnouncement with the addition of +// the ability to pass a context and additional request options. +// +// See CreateTransitGatewayRouteTableAnnouncement for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) CreateTransitGatewayRouteTableAnnouncementWithContext(ctx aws.Context, input *CreateTransitGatewayRouteTableAnnouncementInput, opts ...request.Option) (*CreateTransitGatewayRouteTableAnnouncementOutput, error) { + req, out := c.CreateTransitGatewayRouteTableAnnouncementRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opCreateTransitGatewayVpcAttachment = "CreateTransitGatewayVpcAttachment" // CreateTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the @@ -10649,7 +10869,7 @@ func (c *EC2) DeleteIpamRequest(input *DeleteIpamInput) (req *request.Request, o // Delete an IPAM. Deleting an IPAM removes all monitored data associated with // the IPAM including the historical data for CIDRs. // -// For more information, see Delete an IPAM (/vpc/latest/ipam/delete-ipam.html) +// For more information, see Delete an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/delete-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -10730,7 +10950,7 @@ func (c *EC2) DeleteIpamPoolRequest(input *DeleteIpamPoolInput) (req *request.Re // to it. To release allocations, see ReleaseIpamPoolAllocation (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseIpamPoolAllocation.html). // To deprovision pool CIDRs, see DeprovisionIpamPoolCidr (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html). // -// For more information, see Delete a pool (/vpc/latest/ipam/delete-pool-ipam.html) +// For more information, see Delete a pool (https://docs.aws.amazon.com/vpc/latest/ipam/delete-pool-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -10807,7 +11027,7 @@ func (c *EC2) DeleteIpamScopeRequest(input *DeleteIpamScopeInput) (req *request. // // Delete the scope for an IPAM. You cannot delete the default scopes. // -// For more information, see Delete a scope (/vpc/latest/ipam/delete-scope-ipam.html) +// For more information, see Delete a scope (https://docs.aws.amazon.com/vpc/latest/ipam/delete-scope-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -12788,7 +13008,7 @@ func (c *EC2) DeleteTagsRequest(input *DeleteTagsInput) (req *request.Request, o // Deletes the specified set of tags from the specified set of resources. // // To list the current tags, use DescribeTags. For more information about tags, -// see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) +// see Tag your Amazon EC2 resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) // in the Amazon Elastic Compute Cloud User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -13492,6 +13712,80 @@ func (c *EC2) DeleteTransitGatewayPeeringAttachmentWithContext(ctx aws.Context, return out, req.Send() } +const opDeleteTransitGatewayPolicyTable = "DeleteTransitGatewayPolicyTable" + +// DeleteTransitGatewayPolicyTableRequest generates a "aws/request.Request" representing the +// client's request for the DeleteTransitGatewayPolicyTable operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DeleteTransitGatewayPolicyTable for more information on using the DeleteTransitGatewayPolicyTable +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DeleteTransitGatewayPolicyTableRequest method. +// req, resp := client.DeleteTransitGatewayPolicyTableRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayPolicyTable +func (c *EC2) DeleteTransitGatewayPolicyTableRequest(input *DeleteTransitGatewayPolicyTableInput) (req *request.Request, output *DeleteTransitGatewayPolicyTableOutput) { + op := &request.Operation{ + Name: opDeleteTransitGatewayPolicyTable, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &DeleteTransitGatewayPolicyTableInput{} + } + + output = &DeleteTransitGatewayPolicyTableOutput{} + req = c.newRequest(op, input, output) + return +} + +// DeleteTransitGatewayPolicyTable API operation for Amazon Elastic Compute Cloud. +// +// Deletes the specified transit gateway policy table. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation DeleteTransitGatewayPolicyTable for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayPolicyTable +func (c *EC2) DeleteTransitGatewayPolicyTable(input *DeleteTransitGatewayPolicyTableInput) (*DeleteTransitGatewayPolicyTableOutput, error) { + req, out := c.DeleteTransitGatewayPolicyTableRequest(input) + return out, req.Send() +} + +// DeleteTransitGatewayPolicyTableWithContext is the same as DeleteTransitGatewayPolicyTable with the addition of +// the ability to pass a context and additional request options. +// +// See DeleteTransitGatewayPolicyTable for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DeleteTransitGatewayPolicyTableWithContext(ctx aws.Context, input *DeleteTransitGatewayPolicyTableInput, opts ...request.Option) (*DeleteTransitGatewayPolicyTableOutput, error) { + req, out := c.DeleteTransitGatewayPolicyTableRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opDeleteTransitGatewayPrefixListReference = "DeleteTransitGatewayPrefixListReference" // DeleteTransitGatewayPrefixListReferenceRequest generates a "aws/request.Request" representing the @@ -13717,6 +14011,80 @@ func (c *EC2) DeleteTransitGatewayRouteTableWithContext(ctx aws.Context, input * return out, req.Send() } +const opDeleteTransitGatewayRouteTableAnnouncement = "DeleteTransitGatewayRouteTableAnnouncement" + +// DeleteTransitGatewayRouteTableAnnouncementRequest generates a "aws/request.Request" representing the +// client's request for the DeleteTransitGatewayRouteTableAnnouncement operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DeleteTransitGatewayRouteTableAnnouncement for more information on using the DeleteTransitGatewayRouteTableAnnouncement +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DeleteTransitGatewayRouteTableAnnouncementRequest method. +// req, resp := client.DeleteTransitGatewayRouteTableAnnouncementRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRouteTableAnnouncement +func (c *EC2) DeleteTransitGatewayRouteTableAnnouncementRequest(input *DeleteTransitGatewayRouteTableAnnouncementInput) (req *request.Request, output *DeleteTransitGatewayRouteTableAnnouncementOutput) { + op := &request.Operation{ + Name: opDeleteTransitGatewayRouteTableAnnouncement, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &DeleteTransitGatewayRouteTableAnnouncementInput{} + } + + output = &DeleteTransitGatewayRouteTableAnnouncementOutput{} + req = c.newRequest(op, input, output) + return +} + +// DeleteTransitGatewayRouteTableAnnouncement API operation for Amazon Elastic Compute Cloud. +// +// Advertises to the transit gateway that a transit gateway route table is deleted. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation DeleteTransitGatewayRouteTableAnnouncement for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRouteTableAnnouncement +func (c *EC2) DeleteTransitGatewayRouteTableAnnouncement(input *DeleteTransitGatewayRouteTableAnnouncementInput) (*DeleteTransitGatewayRouteTableAnnouncementOutput, error) { + req, out := c.DeleteTransitGatewayRouteTableAnnouncementRequest(input) + return out, req.Send() +} + +// DeleteTransitGatewayRouteTableAnnouncementWithContext is the same as DeleteTransitGatewayRouteTableAnnouncement with the addition of +// the ability to pass a context and additional request options. +// +// See DeleteTransitGatewayRouteTableAnnouncement for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DeleteTransitGatewayRouteTableAnnouncementWithContext(ctx aws.Context, input *DeleteTransitGatewayRouteTableAnnouncementInput, opts ...request.Option) (*DeleteTransitGatewayRouteTableAnnouncementOutput, error) { + req, out := c.DeleteTransitGatewayRouteTableAnnouncementRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opDeleteTransitGatewayVpcAttachment = "DeleteTransitGatewayVpcAttachment" // DeleteTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the @@ -14643,7 +15011,7 @@ func (c *EC2) DeprovisionIpamPoolCidrRequest(input *DeprovisionIpamPoolCidrInput // // Deprovision a CIDR provisioned from an IPAM pool. If you deprovision a CIDR // from a pool that has a source pool, the CIDR is recycled back into the source -// pool. For more information, see Deprovision pool CIDRs (/vpc/latest/ipam/depro-pool-cidr-ipam.html) +// pool. For more information, see Deprovision pool CIDRs (https://docs.aws.amazon.com/vpc/latest/ipam/depro-pool-cidr-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -21297,7 +21665,7 @@ func (c *EC2) DescribeIpamsRequest(input *DescribeIpamsInput) (req *request.Requ // // Get information about your IPAM pools. // -// For more information, see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) +// For more information, see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -27487,7 +27855,7 @@ func (c *EC2) DescribeTagsRequest(input *DescribeTagsInput) (req *request.Reques // // Describes the specified tags for your EC2 resources. // -// For more information about tags, see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) +// For more information about tags, see Tag your Amazon EC2 resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) // in the Amazon Elastic Compute Cloud User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -28630,6 +28998,270 @@ func (c *EC2) DescribeTransitGatewayPeeringAttachmentsPagesWithContext(ctx aws.C return p.Err() } +const opDescribeTransitGatewayPolicyTables = "DescribeTransitGatewayPolicyTables" + +// DescribeTransitGatewayPolicyTablesRequest generates a "aws/request.Request" representing the +// client's request for the DescribeTransitGatewayPolicyTables operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DescribeTransitGatewayPolicyTables for more information on using the DescribeTransitGatewayPolicyTables +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DescribeTransitGatewayPolicyTablesRequest method. +// req, resp := client.DescribeTransitGatewayPolicyTablesRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayPolicyTables +func (c *EC2) DescribeTransitGatewayPolicyTablesRequest(input *DescribeTransitGatewayPolicyTablesInput) (req *request.Request, output *DescribeTransitGatewayPolicyTablesOutput) { + op := &request.Operation{ + Name: opDescribeTransitGatewayPolicyTables, + HTTPMethod: "POST", + HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"NextToken"}, + OutputTokens: []string{"NextToken"}, + LimitToken: "MaxResults", + TruncationToken: "", + }, + } + + if input == nil { + input = &DescribeTransitGatewayPolicyTablesInput{} + } + + output = &DescribeTransitGatewayPolicyTablesOutput{} + req = c.newRequest(op, input, output) + return +} + +// DescribeTransitGatewayPolicyTables API operation for Amazon Elastic Compute Cloud. +// +// Describes one or more transit gateway route policy tables. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation DescribeTransitGatewayPolicyTables for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayPolicyTables +func (c *EC2) DescribeTransitGatewayPolicyTables(input *DescribeTransitGatewayPolicyTablesInput) (*DescribeTransitGatewayPolicyTablesOutput, error) { + req, out := c.DescribeTransitGatewayPolicyTablesRequest(input) + return out, req.Send() +} + +// DescribeTransitGatewayPolicyTablesWithContext is the same as DescribeTransitGatewayPolicyTables with the addition of +// the ability to pass a context and additional request options. +// +// See DescribeTransitGatewayPolicyTables for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DescribeTransitGatewayPolicyTablesWithContext(ctx aws.Context, input *DescribeTransitGatewayPolicyTablesInput, opts ...request.Option) (*DescribeTransitGatewayPolicyTablesOutput, error) { + req, out := c.DescribeTransitGatewayPolicyTablesRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +// DescribeTransitGatewayPolicyTablesPages iterates over the pages of a DescribeTransitGatewayPolicyTables operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See DescribeTransitGatewayPolicyTables method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a DescribeTransitGatewayPolicyTables operation. +// pageNum := 0 +// err := client.DescribeTransitGatewayPolicyTablesPages(params, +// func(page *ec2.DescribeTransitGatewayPolicyTablesOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *EC2) DescribeTransitGatewayPolicyTablesPages(input *DescribeTransitGatewayPolicyTablesInput, fn func(*DescribeTransitGatewayPolicyTablesOutput, bool) bool) error { + return c.DescribeTransitGatewayPolicyTablesPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// DescribeTransitGatewayPolicyTablesPagesWithContext same as DescribeTransitGatewayPolicyTablesPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DescribeTransitGatewayPolicyTablesPagesWithContext(ctx aws.Context, input *DescribeTransitGatewayPolicyTablesInput, fn func(*DescribeTransitGatewayPolicyTablesOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *DescribeTransitGatewayPolicyTablesInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.DescribeTransitGatewayPolicyTablesRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*DescribeTransitGatewayPolicyTablesOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + +const opDescribeTransitGatewayRouteTableAnnouncements = "DescribeTransitGatewayRouteTableAnnouncements" + +// DescribeTransitGatewayRouteTableAnnouncementsRequest generates a "aws/request.Request" representing the +// client's request for the DescribeTransitGatewayRouteTableAnnouncements operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DescribeTransitGatewayRouteTableAnnouncements for more information on using the DescribeTransitGatewayRouteTableAnnouncements +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DescribeTransitGatewayRouteTableAnnouncementsRequest method. +// req, resp := client.DescribeTransitGatewayRouteTableAnnouncementsRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayRouteTableAnnouncements +func (c *EC2) DescribeTransitGatewayRouteTableAnnouncementsRequest(input *DescribeTransitGatewayRouteTableAnnouncementsInput) (req *request.Request, output *DescribeTransitGatewayRouteTableAnnouncementsOutput) { + op := &request.Operation{ + Name: opDescribeTransitGatewayRouteTableAnnouncements, + HTTPMethod: "POST", + HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"NextToken"}, + OutputTokens: []string{"NextToken"}, + LimitToken: "MaxResults", + TruncationToken: "", + }, + } + + if input == nil { + input = &DescribeTransitGatewayRouteTableAnnouncementsInput{} + } + + output = &DescribeTransitGatewayRouteTableAnnouncementsOutput{} + req = c.newRequest(op, input, output) + return +} + +// DescribeTransitGatewayRouteTableAnnouncements API operation for Amazon Elastic Compute Cloud. +// +// Describes one or more transit gateway route table advertisements. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation DescribeTransitGatewayRouteTableAnnouncements for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayRouteTableAnnouncements +func (c *EC2) DescribeTransitGatewayRouteTableAnnouncements(input *DescribeTransitGatewayRouteTableAnnouncementsInput) (*DescribeTransitGatewayRouteTableAnnouncementsOutput, error) { + req, out := c.DescribeTransitGatewayRouteTableAnnouncementsRequest(input) + return out, req.Send() +} + +// DescribeTransitGatewayRouteTableAnnouncementsWithContext is the same as DescribeTransitGatewayRouteTableAnnouncements with the addition of +// the ability to pass a context and additional request options. +// +// See DescribeTransitGatewayRouteTableAnnouncements for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DescribeTransitGatewayRouteTableAnnouncementsWithContext(ctx aws.Context, input *DescribeTransitGatewayRouteTableAnnouncementsInput, opts ...request.Option) (*DescribeTransitGatewayRouteTableAnnouncementsOutput, error) { + req, out := c.DescribeTransitGatewayRouteTableAnnouncementsRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +// DescribeTransitGatewayRouteTableAnnouncementsPages iterates over the pages of a DescribeTransitGatewayRouteTableAnnouncements operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See DescribeTransitGatewayRouteTableAnnouncements method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a DescribeTransitGatewayRouteTableAnnouncements operation. +// pageNum := 0 +// err := client.DescribeTransitGatewayRouteTableAnnouncementsPages(params, +// func(page *ec2.DescribeTransitGatewayRouteTableAnnouncementsOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *EC2) DescribeTransitGatewayRouteTableAnnouncementsPages(input *DescribeTransitGatewayRouteTableAnnouncementsInput, fn func(*DescribeTransitGatewayRouteTableAnnouncementsOutput, bool) bool) error { + return c.DescribeTransitGatewayRouteTableAnnouncementsPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// DescribeTransitGatewayRouteTableAnnouncementsPagesWithContext same as DescribeTransitGatewayRouteTableAnnouncementsPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DescribeTransitGatewayRouteTableAnnouncementsPagesWithContext(ctx aws.Context, input *DescribeTransitGatewayRouteTableAnnouncementsInput, fn func(*DescribeTransitGatewayRouteTableAnnouncementsOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *DescribeTransitGatewayRouteTableAnnouncementsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.DescribeTransitGatewayRouteTableAnnouncementsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*DescribeTransitGatewayRouteTableAnnouncementsOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opDescribeTransitGatewayRouteTables = "DescribeTransitGatewayRouteTables" // DescribeTransitGatewayRouteTablesRequest generates a "aws/request.Request" representing the @@ -31900,8 +32532,8 @@ func (c *EC2) DisableIpamOrganizationAdminAccountRequest(input *DisableIpamOrgan // DisableIpamOrganizationAdminAccount API operation for Amazon Elastic Compute Cloud. // // Disable the IPAM account. For more information, see Enable integration with -// Organizations (/vpc/latest/ipam/enable-integ-ipam.html) in the Amazon VPC -// IPAM User Guide. +// Organizations (https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam.html) +// in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -32944,6 +33576,80 @@ func (c *EC2) DisassociateTransitGatewayMulticastDomainWithContext(ctx aws.Conte return out, req.Send() } +const opDisassociateTransitGatewayPolicyTable = "DisassociateTransitGatewayPolicyTable" + +// DisassociateTransitGatewayPolicyTableRequest generates a "aws/request.Request" representing the +// client's request for the DisassociateTransitGatewayPolicyTable operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DisassociateTransitGatewayPolicyTable for more information on using the DisassociateTransitGatewayPolicyTable +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DisassociateTransitGatewayPolicyTableRequest method. +// req, resp := client.DisassociateTransitGatewayPolicyTableRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateTransitGatewayPolicyTable +func (c *EC2) DisassociateTransitGatewayPolicyTableRequest(input *DisassociateTransitGatewayPolicyTableInput) (req *request.Request, output *DisassociateTransitGatewayPolicyTableOutput) { + op := &request.Operation{ + Name: opDisassociateTransitGatewayPolicyTable, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &DisassociateTransitGatewayPolicyTableInput{} + } + + output = &DisassociateTransitGatewayPolicyTableOutput{} + req = c.newRequest(op, input, output) + return +} + +// DisassociateTransitGatewayPolicyTable API operation for Amazon Elastic Compute Cloud. +// +// Removes the association between an an attachment and a policy table. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation DisassociateTransitGatewayPolicyTable for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateTransitGatewayPolicyTable +func (c *EC2) DisassociateTransitGatewayPolicyTable(input *DisassociateTransitGatewayPolicyTableInput) (*DisassociateTransitGatewayPolicyTableOutput, error) { + req, out := c.DisassociateTransitGatewayPolicyTableRequest(input) + return out, req.Send() +} + +// DisassociateTransitGatewayPolicyTableWithContext is the same as DisassociateTransitGatewayPolicyTable with the addition of +// the ability to pass a context and additional request options. +// +// See DisassociateTransitGatewayPolicyTable for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) DisassociateTransitGatewayPolicyTableWithContext(ctx aws.Context, input *DisassociateTransitGatewayPolicyTableInput, opts ...request.Option) (*DisassociateTransitGatewayPolicyTableOutput, error) { + req, out := c.DisassociateTransitGatewayPolicyTableRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opDisassociateTransitGatewayRouteTable = "DisassociateTransitGatewayRouteTable" // DisassociateTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the @@ -33553,7 +34259,7 @@ func (c *EC2) EnableIpamOrganizationAdminAccountRequest(input *EnableIpamOrganiz // // Enable an Organizations member account as the IPAM admin account. You cannot // select the Organizations management account as the IPAM admin account. For -// more information, see Enable integration with Organizations (/vpc/latest/ipam/enable-integ-ipam.html) +// more information, see Enable integration with Organizations (https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -35706,7 +36412,7 @@ func (c *EC2) GetIpamAddressHistoryRequest(input *GetIpamAddressHistoryInput) (r // GetIpamAddressHistory API operation for Amazon Elastic Compute Cloud. // // Retrieve historical information about a CIDR within an IPAM scope. For more -// information, see View the history of IP addresses (/vpc/latest/ipam/view-history-cidr-ipam.html) +// information, see View the history of IP addresses (https://docs.aws.amazon.com/vpc/latest/ipam/view-history-cidr-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -37405,6 +38111,212 @@ func (c *EC2) GetTransitGatewayMulticastDomainAssociationsPagesWithContext(ctx a return p.Err() } +const opGetTransitGatewayPolicyTableAssociations = "GetTransitGatewayPolicyTableAssociations" + +// GetTransitGatewayPolicyTableAssociationsRequest generates a "aws/request.Request" representing the +// client's request for the GetTransitGatewayPolicyTableAssociations operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetTransitGatewayPolicyTableAssociations for more information on using the GetTransitGatewayPolicyTableAssociations +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetTransitGatewayPolicyTableAssociationsRequest method. +// req, resp := client.GetTransitGatewayPolicyTableAssociationsRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayPolicyTableAssociations +func (c *EC2) GetTransitGatewayPolicyTableAssociationsRequest(input *GetTransitGatewayPolicyTableAssociationsInput) (req *request.Request, output *GetTransitGatewayPolicyTableAssociationsOutput) { + op := &request.Operation{ + Name: opGetTransitGatewayPolicyTableAssociations, + HTTPMethod: "POST", + HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"NextToken"}, + OutputTokens: []string{"NextToken"}, + LimitToken: "MaxResults", + TruncationToken: "", + }, + } + + if input == nil { + input = &GetTransitGatewayPolicyTableAssociationsInput{} + } + + output = &GetTransitGatewayPolicyTableAssociationsOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetTransitGatewayPolicyTableAssociations API operation for Amazon Elastic Compute Cloud. +// +// Gets a list of the transit gateway policy table associations. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation GetTransitGatewayPolicyTableAssociations for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayPolicyTableAssociations +func (c *EC2) GetTransitGatewayPolicyTableAssociations(input *GetTransitGatewayPolicyTableAssociationsInput) (*GetTransitGatewayPolicyTableAssociationsOutput, error) { + req, out := c.GetTransitGatewayPolicyTableAssociationsRequest(input) + return out, req.Send() +} + +// GetTransitGatewayPolicyTableAssociationsWithContext is the same as GetTransitGatewayPolicyTableAssociations with the addition of +// the ability to pass a context and additional request options. +// +// See GetTransitGatewayPolicyTableAssociations for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) GetTransitGatewayPolicyTableAssociationsWithContext(ctx aws.Context, input *GetTransitGatewayPolicyTableAssociationsInput, opts ...request.Option) (*GetTransitGatewayPolicyTableAssociationsOutput, error) { + req, out := c.GetTransitGatewayPolicyTableAssociationsRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +// GetTransitGatewayPolicyTableAssociationsPages iterates over the pages of a GetTransitGatewayPolicyTableAssociations operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See GetTransitGatewayPolicyTableAssociations method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a GetTransitGatewayPolicyTableAssociations operation. +// pageNum := 0 +// err := client.GetTransitGatewayPolicyTableAssociationsPages(params, +// func(page *ec2.GetTransitGatewayPolicyTableAssociationsOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *EC2) GetTransitGatewayPolicyTableAssociationsPages(input *GetTransitGatewayPolicyTableAssociationsInput, fn func(*GetTransitGatewayPolicyTableAssociationsOutput, bool) bool) error { + return c.GetTransitGatewayPolicyTableAssociationsPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// GetTransitGatewayPolicyTableAssociationsPagesWithContext same as GetTransitGatewayPolicyTableAssociationsPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) GetTransitGatewayPolicyTableAssociationsPagesWithContext(ctx aws.Context, input *GetTransitGatewayPolicyTableAssociationsInput, fn func(*GetTransitGatewayPolicyTableAssociationsOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *GetTransitGatewayPolicyTableAssociationsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.GetTransitGatewayPolicyTableAssociationsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*GetTransitGatewayPolicyTableAssociationsOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + +const opGetTransitGatewayPolicyTableEntries = "GetTransitGatewayPolicyTableEntries" + +// GetTransitGatewayPolicyTableEntriesRequest generates a "aws/request.Request" representing the +// client's request for the GetTransitGatewayPolicyTableEntries operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetTransitGatewayPolicyTableEntries for more information on using the GetTransitGatewayPolicyTableEntries +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetTransitGatewayPolicyTableEntriesRequest method. +// req, resp := client.GetTransitGatewayPolicyTableEntriesRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayPolicyTableEntries +func (c *EC2) GetTransitGatewayPolicyTableEntriesRequest(input *GetTransitGatewayPolicyTableEntriesInput) (req *request.Request, output *GetTransitGatewayPolicyTableEntriesOutput) { + op := &request.Operation{ + Name: opGetTransitGatewayPolicyTableEntries, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &GetTransitGatewayPolicyTableEntriesInput{} + } + + output = &GetTransitGatewayPolicyTableEntriesOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetTransitGatewayPolicyTableEntries API operation for Amazon Elastic Compute Cloud. +// +// Returns a list of transit gateway policy table entries. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for Amazon Elastic Compute Cloud's +// API operation GetTransitGatewayPolicyTableEntries for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayPolicyTableEntries +func (c *EC2) GetTransitGatewayPolicyTableEntries(input *GetTransitGatewayPolicyTableEntriesInput) (*GetTransitGatewayPolicyTableEntriesOutput, error) { + req, out := c.GetTransitGatewayPolicyTableEntriesRequest(input) + return out, req.Send() +} + +// GetTransitGatewayPolicyTableEntriesWithContext is the same as GetTransitGatewayPolicyTableEntries with the addition of +// the ability to pass a context and additional request options. +// +// See GetTransitGatewayPolicyTableEntries for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *EC2) GetTransitGatewayPolicyTableEntriesWithContext(ctx aws.Context, input *GetTransitGatewayPolicyTableEntriesInput, opts ...request.Option) (*GetTransitGatewayPolicyTableEntriesOutput, error) { + req, out := c.GetTransitGatewayPolicyTableEntriesRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + const opGetTransitGatewayPrefixListReferences = "GetTransitGatewayPrefixListReferences" // GetTransitGatewayPrefixListReferencesRequest generates a "aws/request.Request" representing the @@ -40646,7 +41558,7 @@ func (c *EC2) ModifyIpamPoolRequest(input *ModifyIpamPoolInput) (req *request.Re // // Modify the configurations of an IPAM pool. // -// For more information, see Modify a pool (/vpc/latest/ipam/mod-pool-ipam.html) +// For more information, see Modify a pool (https://docs.aws.amazon.com/vpc/latest/ipam/mod-pool-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -40727,8 +41639,8 @@ func (c *EC2) ModifyIpamResourceCidrRequest(input *ModifyIpamResourceCidrInput) // be auto-imported into a pool, and it will be removed from any pool it has // an allocation in. // -// For more information, see Move resource CIDRs between scopes (/vpc/latest/ipam/move-resource-ipam.html) -// and Change the monitoring state of resource CIDRs (/vpc/latest/ipam/change-monitoring-state-ipam.html) +// For more information, see Move resource CIDRs between scopes (https://docs.aws.amazon.com/vpc/latest/ipam/move-resource-ipam.html) +// and Change the monitoring state of resource CIDRs (https://docs.aws.amazon.com/vpc/latest/ipam/change-monitoring-state-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -43492,7 +44404,7 @@ func (c *EC2) MoveByoipCidrToIpamRequest(input *MoveByoipCidrToIpamInput) (req * // move the CIDR to IPAM from a public IPv4 pool. You cannot move an IPv6 CIDR // to IPAM. If you are bringing a new IP address to Amazon Web Services for // the first time, complete the steps in Tutorial: BYOIP address CIDRs to IPAM -// (/vpc/latest/ipam/tutorials-byoip-ipam.html). +// (https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoip-ipam.html). // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about @@ -43661,7 +44573,7 @@ func (c *EC2) ProvisionIpamPoolCidrRequest(input *ProvisionIpamPoolCidrInput) (r // CIDRs to a top-level pool or to transfer a CIDR from a top-level pool to // a pool within it. // -// For more information, see Provision CIDRs to pools (/vpc/latest/ipam/prov-cidr-ipam.html) +// For more information, see Provision CIDRs to pools (https://docs.aws.amazon.com/vpc/latest/ipam/prov-cidr-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -43738,7 +44650,7 @@ func (c *EC2) ProvisionPublicIpv4PoolCidrRequest(input *ProvisionPublicIpv4PoolC // // Provision a CIDR to a public IPv4 pool. // -// For more information about IPAM, see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) +// For more information about IPAM, see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -44150,7 +45062,9 @@ func (c *EC2) RegisterImageRequest(input *RegisterImageInput) (req *request.Requ // in the Amazon Elastic Compute Cloud User Guide. // // For Amazon EBS-backed instances, CreateImage creates and registers the AMI -// in a single request, so you don't have to register the AMI yourself. +// in a single request, so you don't have to register the AMI yourself. We recommend +// that you always use CreateImage unless you have a specific reason to use +// RegisterImage. // // If needed, you can deregister an AMI at any time. Any modifications you make // to an AMI backed by an instance store volume invalidates its registration. @@ -44909,6 +45823,9 @@ func (c *EC2) ReleaseAddressRequest(input *ReleaseAddressInput) (req *request.Re // [EC2-VPC] After you release an Elastic IP address for use in a VPC, you might // be able to recover it. For more information, see AllocateAddress. // +// For more information, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) +// in the Amazon Elastic Compute Cloud User Guide. +// // Returns awserr.Error for service API and SDK errors. Use runtime type assertions // with awserr.Error's Code and Message methods to get detailed information about // the error. @@ -45069,7 +45986,7 @@ func (c *EC2) ReleaseIpamPoolAllocationRequest(input *ReleaseIpamPoolAllocationI // release manual allocations. To remove an allocation for a resource without // deleting the resource, set its monitored state to false using ModifyIpamResourceCidr // (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamResourceCidr.html). -// For more information, see Release an allocation (/vpc/latest/ipam/release-pool-alloc-ipam.html) +// For more information, see Release an allocation (https://docs.aws.amazon.com/vpc/latest/ipam/release-pool-alloc-ipam.html) // in the Amazon VPC IPAM User Guide. // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -45380,10 +46297,11 @@ func (c *EC2) ReplaceRouteRequest(input *ReplaceRouteInput) (req *request.Reques // ReplaceRoute API operation for Amazon Elastic Compute Cloud. // -// Replaces an existing route within a route table in a VPC. You must provide -// only one of the following: internet gateway, virtual private gateway, NAT -// instance, NAT gateway, VPC peering connection, network interface, egress-only -// internet gateway, or transit gateway. +// Replaces an existing route within a route table in a VPC. +// +// You must specify either a destination CIDR block or a prefix list ID. You +// must also specify exactly one of the resources from the parameter list, or +// reset the local route to its default target. // // For more information, see Route tables (https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) // in the Amazon Virtual Private Cloud User Guide. @@ -49810,7 +50728,7 @@ func (s *ActiveInstance) SetSpotInstanceRequestId(v string) *ActiveInstance { // and monitors resources in the Amazon Web Services Regions you select as operating // Regions. // -// For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) +// For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. type AddIpamOperatingRegion struct { _ struct{} `type:"structure"` @@ -52790,6 +53708,111 @@ func (s *AssociateTransitGatewayMulticastDomainOutput) SetAssociations(v *Transi return s } +type AssociateTransitGatewayPolicyTableInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The ID of the transit gateway attachment to associate with the policy table. + // + // TransitGatewayAttachmentId is a required field + TransitGatewayAttachmentId *string `type:"string" required:"true"` + + // The ID of the transit gateway policy table to associate with the transit + // gateway attachment. + // + // TransitGatewayPolicyTableId is a required field + TransitGatewayPolicyTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s AssociateTransitGatewayPolicyTableInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s AssociateTransitGatewayPolicyTableInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *AssociateTransitGatewayPolicyTableInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "AssociateTransitGatewayPolicyTableInput"} + if s.TransitGatewayAttachmentId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId")) + } + if s.TransitGatewayPolicyTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayPolicyTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *AssociateTransitGatewayPolicyTableInput) SetDryRun(v bool) *AssociateTransitGatewayPolicyTableInput { + s.DryRun = &v + return s +} + +// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value. +func (s *AssociateTransitGatewayPolicyTableInput) SetTransitGatewayAttachmentId(v string) *AssociateTransitGatewayPolicyTableInput { + s.TransitGatewayAttachmentId = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *AssociateTransitGatewayPolicyTableInput) SetTransitGatewayPolicyTableId(v string) *AssociateTransitGatewayPolicyTableInput { + s.TransitGatewayPolicyTableId = &v + return s +} + +type AssociateTransitGatewayPolicyTableOutput struct { + _ struct{} `type:"structure"` + + // Describes the association of a transit gateway and a transit gateway policy + // table. + Association *TransitGatewayPolicyTableAssociation `locationName:"association" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s AssociateTransitGatewayPolicyTableOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s AssociateTransitGatewayPolicyTableOutput) GoString() string { + return s.String() +} + +// SetAssociation sets the Association field's value. +func (s *AssociateTransitGatewayPolicyTableOutput) SetAssociation(v *TransitGatewayPolicyTableAssociation) *AssociateTransitGatewayPolicyTableOutput { + s.Association = v + return s +} + type AssociateTransitGatewayRouteTableInput struct { _ struct{} `type:"structure"` @@ -53047,14 +54070,14 @@ type AssociateVpcCidrBlockInput struct { CidrBlock *string `type:"string"` // Associate a CIDR allocated from an IPv4 IPAM pool to a VPC. For more information - // about Amazon VPC IP Address Manager (IPAM), see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) + // about Amazon VPC IP Address Manager (IPAM), see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) // in the Amazon VPC IPAM User Guide. Ipv4IpamPoolId *string `type:"string"` // The netmask length of the IPv4 CIDR you would like to associate from an Amazon // VPC IP Address Manager (IPAM) pool. For more information about IPAM, see - // What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon VPC IPAM - // User Guide. + // What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) + // in the Amazon VPC IPAM User Guide. Ipv4NetmaskLength *int64 `type:"integer"` // An IPv6 CIDR block from the IPv6 address pool. You must also specify Ipv6Pool @@ -53072,14 +54095,14 @@ type AssociateVpcCidrBlockInput struct { Ipv6CidrBlockNetworkBorderGroup *string `type:"string"` // Associates a CIDR allocated from an IPv6 IPAM pool to a VPC. For more information - // about Amazon VPC IP Address Manager (IPAM), see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) + // about Amazon VPC IP Address Manager (IPAM), see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) // in the Amazon VPC IPAM User Guide. Ipv6IpamPoolId *string `type:"string"` // The netmask length of the IPv6 CIDR you would like to associate from an Amazon // VPC IP Address Manager (IPAM) pool. For more information about IPAM, see - // What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon VPC IPAM - // User Guide. + // What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) + // in the Amazon VPC IPAM User Guide. Ipv6NetmaskLength *int64 `type:"integer"` // The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block. @@ -56466,8 +57489,7 @@ type CapacityReservation struct { // date and time. EndDateType *string `locationName:"endDateType" type:"string" enum:"EndDateType"` - // Indicates whether the Capacity Reservation supports instances with temporary, - // block-level storage. + // Deprecated. EphemeralStorage *bool `locationName:"ephemeralStorage" type:"boolean"` // Indicates the type of instance launches that the Capacity Reservation accepts. @@ -60303,8 +61325,7 @@ type CreateCapacityReservationInput struct { // is limited. EndDateType *string `type:"string" enum:"EndDateType"` - // Indicates whether the Capacity Reservation supports instances with temporary, - // block-level storage. + // Deprecated. EphemeralStorage *bool `type:"boolean"` // The number of instances for which to reserve capacity. @@ -61118,9 +62139,13 @@ type CreateCustomerGatewayInput struct { // it is UnauthorizedOperation. DryRun *bool `locationName:"dryRun" type:"boolean"` - // The Internet-routable IP address for the customer gateway's outside interface. - // The address must be static. - PublicIp *string `locationName:"IpAddress" type:"string"` + // IPv4 address for the customer gateway device's outside interface. The address + // must be static. + IpAddress *string `type:"string"` + + // This member has been deprecated. The Internet-routable IP address for the + // customer gateway's outside interface. The address must be static. + PublicIp *string `type:"string"` // The tags to apply to the customer gateway. TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"` @@ -61189,6 +62214,12 @@ func (s *CreateCustomerGatewayInput) SetDryRun(v bool) *CreateCustomerGatewayInp return s } +// SetIpAddress sets the IpAddress field's value. +func (s *CreateCustomerGatewayInput) SetIpAddress(v string) *CreateCustomerGatewayInput { + s.IpAddress = &v + return s +} + // SetPublicIp sets the PublicIp field's value. func (s *CreateCustomerGatewayInput) SetPublicIp(v string) *CreateCustomerGatewayInput { s.PublicIp = &v @@ -62124,9 +63155,7 @@ type CreateFlowLogsInput struct { // The type of traffic to log. You can log traffic that the resource accepts // or rejects, or all traffic. - // - // TrafficType is a required field - TrafficType *string `type:"string" required:"true" enum:"TrafficType"` + TrafficType *string `type:"string" enum:"TrafficType"` } // String returns the string representation. @@ -62156,9 +63185,6 @@ func (s *CreateFlowLogsInput) Validate() error { if s.ResourceType == nil { invalidParams.Add(request.NewErrParamRequired("ResourceType")) } - if s.TrafficType == nil { - invalidParams.Add(request.NewErrParamRequired("TrafficType")) - } if invalidParams.Len() > 0 { return invalidParams @@ -62948,7 +63974,7 @@ type CreateIpamInput struct { // and monitors resources in the Amazon Web Services Regions you select as operating // Regions. // - // For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) + // For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. OperatingRegions []*AddIpamOperatingRegion `locationName:"OperatingRegion" type:"list"` @@ -63602,7 +64628,13 @@ type CreateLaunchTemplateInput struct { // LaunchTemplateName is a required field LaunchTemplateName *string `min:"3" type:"string" required:"true"` - // The tags to apply to the launch template during creation. + // The tags to apply to the launch template on creation. To tag the launch template, + // the resource type must be launch-template. + // + // To specify the tags for the resources that are created when an instance is + // launched, you must use the TagSpecifications parameter in the launch template + // data (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestLaunchTemplateData.html) + // structure. TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"` // A description for the first version of the launch template. @@ -63749,12 +64781,16 @@ type CreateLaunchTemplateVersionInput struct { // LaunchTemplateData is a required field LaunchTemplateData *RequestLaunchTemplateData `type:"structure" required:"true"` - // The ID of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The ID of the launch template. + // + // You must specify either the LaunchTemplateId or the LaunchTemplateName, but + // not both. LaunchTemplateId *string `type:"string"` - // The name of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The name of the launch template. + // + // You must specify the LaunchTemplateName or the LaunchTemplateId, but not + // both. LaunchTemplateName *string `min:"3" type:"string"` // The version number of the launch template version on which to base the new @@ -65382,6 +66418,13 @@ type CreatePlacementGroupInput struct { // The number of partitions. Valid only when Strategy is set to partition. PartitionCount *int64 `type:"integer"` + // Determines how placement groups spread instances. + // + // * Host – You can use host only with Outpost placement groups. + // + // * Rack – No usage restrictions. + SpreadLevel *string `type:"string" enum:"SpreadLevel"` + // The placement strategy. Strategy *string `locationName:"strategy" type:"string" enum:"PlacementStrategy"` @@ -65425,6 +66468,12 @@ func (s *CreatePlacementGroupInput) SetPartitionCount(v int64) *CreatePlacementG return s } +// SetSpreadLevel sets the SpreadLevel field's value. +func (s *CreatePlacementGroupInput) SetSpreadLevel(v string) *CreatePlacementGroupInput { + s.SpreadLevel = &v + return s +} + // SetStrategy sets the Strategy field's value. func (s *CreatePlacementGroupInput) SetStrategy(v string) *CreatePlacementGroupInput { s.Strategy = &v @@ -68496,6 +69545,9 @@ type CreateTransitGatewayPeeringAttachmentInput struct { // it is UnauthorizedOperation. DryRun *bool `type:"boolean"` + // Requests a transit gateway peering attachment. + Options *CreateTransitGatewayPeeringAttachmentRequestOptions `type:"structure"` + // The ID of the Amazon Web Services account that owns the peer transit gateway. // // PeerAccountId is a required field @@ -68566,6 +69618,12 @@ func (s *CreateTransitGatewayPeeringAttachmentInput) SetDryRun(v bool) *CreateTr return s } +// SetOptions sets the Options field's value. +func (s *CreateTransitGatewayPeeringAttachmentInput) SetOptions(v *CreateTransitGatewayPeeringAttachmentRequestOptions) *CreateTransitGatewayPeeringAttachmentInput { + s.Options = v + return s +} + // SetPeerAccountId sets the PeerAccountId field's value. func (s *CreateTransitGatewayPeeringAttachmentInput) SetPeerAccountId(v string) *CreateTransitGatewayPeeringAttachmentInput { s.PeerAccountId = &v @@ -68627,6 +69685,138 @@ func (s *CreateTransitGatewayPeeringAttachmentOutput) SetTransitGatewayPeeringAt return s } +// Describes whether dynamic routing is enabled or disabled for the transit +// gateway peering request. +type CreateTransitGatewayPeeringAttachmentRequestOptions struct { + _ struct{} `type:"structure"` + + // Indicates whether dynamic routing is enabled or disabled. + DynamicRouting *string `type:"string" enum:"DynamicRoutingValue"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPeeringAttachmentRequestOptions) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPeeringAttachmentRequestOptions) GoString() string { + return s.String() +} + +// SetDynamicRouting sets the DynamicRouting field's value. +func (s *CreateTransitGatewayPeeringAttachmentRequestOptions) SetDynamicRouting(v string) *CreateTransitGatewayPeeringAttachmentRequestOptions { + s.DynamicRouting = &v + return s +} + +type CreateTransitGatewayPolicyTableInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The tags specification for the transit gateway policy table created during + // the request. + TagSpecifications []*TagSpecification `locationNameList:"item" type:"list"` + + // The ID of the transit gateway used for the policy table. + // + // TransitGatewayId is a required field + TransitGatewayId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPolicyTableInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPolicyTableInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *CreateTransitGatewayPolicyTableInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "CreateTransitGatewayPolicyTableInput"} + if s.TransitGatewayId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *CreateTransitGatewayPolicyTableInput) SetDryRun(v bool) *CreateTransitGatewayPolicyTableInput { + s.DryRun = &v + return s +} + +// SetTagSpecifications sets the TagSpecifications field's value. +func (s *CreateTransitGatewayPolicyTableInput) SetTagSpecifications(v []*TagSpecification) *CreateTransitGatewayPolicyTableInput { + s.TagSpecifications = v + return s +} + +// SetTransitGatewayId sets the TransitGatewayId field's value. +func (s *CreateTransitGatewayPolicyTableInput) SetTransitGatewayId(v string) *CreateTransitGatewayPolicyTableInput { + s.TransitGatewayId = &v + return s +} + +type CreateTransitGatewayPolicyTableOutput struct { + _ struct{} `type:"structure"` + + // Describes the created transit gateway policy table. + TransitGatewayPolicyTable *TransitGatewayPolicyTable `locationName:"transitGatewayPolicyTable" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPolicyTableOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayPolicyTableOutput) GoString() string { + return s.String() +} + +// SetTransitGatewayPolicyTable sets the TransitGatewayPolicyTable field's value. +func (s *CreateTransitGatewayPolicyTableOutput) SetTransitGatewayPolicyTable(v *TransitGatewayPolicyTable) *CreateTransitGatewayPolicyTableOutput { + s.TransitGatewayPolicyTable = v + return s +} + type CreateTransitGatewayPrefixListReferenceInput struct { _ struct{} `type:"structure"` @@ -68870,6 +70060,118 @@ func (s *CreateTransitGatewayRouteOutput) SetRoute(v *TransitGatewayRoute) *Crea return s } +type CreateTransitGatewayRouteTableAnnouncementInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The ID of the peering attachment. + // + // PeeringAttachmentId is a required field + PeeringAttachmentId *string `type:"string" required:"true"` + + // The tags specifications applied to the transit gateway route table announcement. + TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"` + + // The ID of the transit gateway route table. + // + // TransitGatewayRouteTableId is a required field + TransitGatewayRouteTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayRouteTableAnnouncementInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayRouteTableAnnouncementInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *CreateTransitGatewayRouteTableAnnouncementInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "CreateTransitGatewayRouteTableAnnouncementInput"} + if s.PeeringAttachmentId == nil { + invalidParams.Add(request.NewErrParamRequired("PeeringAttachmentId")) + } + if s.TransitGatewayRouteTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *CreateTransitGatewayRouteTableAnnouncementInput) SetDryRun(v bool) *CreateTransitGatewayRouteTableAnnouncementInput { + s.DryRun = &v + return s +} + +// SetPeeringAttachmentId sets the PeeringAttachmentId field's value. +func (s *CreateTransitGatewayRouteTableAnnouncementInput) SetPeeringAttachmentId(v string) *CreateTransitGatewayRouteTableAnnouncementInput { + s.PeeringAttachmentId = &v + return s +} + +// SetTagSpecifications sets the TagSpecifications field's value. +func (s *CreateTransitGatewayRouteTableAnnouncementInput) SetTagSpecifications(v []*TagSpecification) *CreateTransitGatewayRouteTableAnnouncementInput { + s.TagSpecifications = v + return s +} + +// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value. +func (s *CreateTransitGatewayRouteTableAnnouncementInput) SetTransitGatewayRouteTableId(v string) *CreateTransitGatewayRouteTableAnnouncementInput { + s.TransitGatewayRouteTableId = &v + return s +} + +type CreateTransitGatewayRouteTableAnnouncementOutput struct { + _ struct{} `type:"structure"` + + // Provides details about the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncement *TransitGatewayRouteTableAnnouncement `locationName:"transitGatewayRouteTableAnnouncement" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayRouteTableAnnouncementOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s CreateTransitGatewayRouteTableAnnouncementOutput) GoString() string { + return s.String() +} + +// SetTransitGatewayRouteTableAnnouncement sets the TransitGatewayRouteTableAnnouncement field's value. +func (s *CreateTransitGatewayRouteTableAnnouncementOutput) SetTransitGatewayRouteTableAnnouncement(v *TransitGatewayRouteTableAnnouncement) *CreateTransitGatewayRouteTableAnnouncementOutput { + s.TransitGatewayRouteTableAnnouncement = v + return s +} + type CreateTransitGatewayRouteTableInput struct { _ struct{} `type:"structure"` @@ -70022,14 +71324,14 @@ type CreateVpcInput struct { InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"` // The ID of an IPv4 IPAM pool you want to use for allocating this VPC's CIDR. - // For more information, see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) + // For more information, see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) // in the Amazon VPC IPAM User Guide. Ipv4IpamPoolId *string `type:"string"` // The netmask length of the IPv4 CIDR you want to allocate to this VPC from // an Amazon VPC IP Address Manager (IPAM) pool. For more information about - // IPAM, see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon - // VPC IPAM User Guide. + // IPAM, see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) + // in the Amazon VPC IPAM User Guide. Ipv4NetmaskLength *int64 `type:"integer"` // The IPv6 CIDR block from the IPv6 address pool. You must also specify Ipv6Pool @@ -70049,14 +71351,14 @@ type CreateVpcInput struct { // management workflows including assigning, tracking, troubleshooting, and // auditing IP addresses across Amazon Web Services Regions and accounts throughout // your Amazon Web Services Organization. For more information, see What is - // IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon VPC IPAM User - // Guide. + // IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) + // in the Amazon VPC IPAM User Guide. Ipv6IpamPoolId *string `type:"string"` // The netmask length of the IPv6 CIDR you want to allocate to this VPC from // an Amazon VPC IP Address Manager (IPAM) pool. For more information about - // IPAM, see What is IPAM? (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon - // VPC IPAM User Guide. + // IPAM, see What is IPAM? (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) + // in the Amazon VPC IPAM User Guide. Ipv6NetmaskLength *int64 `type:"integer"` // The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block. @@ -70651,12 +71953,13 @@ func (s *CreateVpnGatewayOutput) SetVpnGateway(v *VpnGateway) *CreateVpnGatewayO return s } -// Describes the credit option for CPU usage of a T2, T3, or T3a instance. +// Describes the credit option for CPU usage of a T instance. type CreditSpecification struct { _ struct{} `type:"structure"` - // The credit option for CPU usage of a T2, T3, or T3a instance. Valid values - // are standard and unlimited. + // The credit option for CPU usage of a T instance. + // + // Valid values: standard | unlimited CpuCredits *string `locationName:"cpuCredits" type:"string"` } @@ -70684,12 +71987,13 @@ func (s *CreditSpecification) SetCpuCredits(v string) *CreditSpecification { return s } -// The credit option for CPU usage of a T2, T3, or T3a instance. +// The credit option for CPU usage of a T instance. type CreditSpecificationRequest struct { _ struct{} `type:"structure"` - // The credit option for CPU usage of a T2, T3, or T3a instance. Valid values - // are standard and unlimited. + // The credit option for CPU usage of a T instance. + // + // Valid values: standard | unlimited // // CpuCredits is a required field CpuCredits *string `type:"string" required:"true"` @@ -70749,7 +72053,7 @@ type CustomerGateway struct { // The name of customer gateway device. DeviceName *string `locationName:"deviceName" type:"string"` - // The Internet-routable IP address of the customer gateway's outside interface. + // The IP address of the customer gateway device's outside interface. IpAddress *string `locationName:"ipAddress" type:"string"` // The current state of the customer gateway (pending | available | deleting @@ -72354,12 +73658,16 @@ type DeleteLaunchTemplateInput struct { // it is UnauthorizedOperation. DryRun *bool `type:"boolean"` - // The ID of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The ID of the launch template. + // + // You must specify either the LaunchTemplateId or the LaunchTemplateName, but + // not both. LaunchTemplateId *string `type:"string"` - // The name of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The name of the launch template. + // + // You must specify either the LaunchTemplateName or the LaunchTemplateId, but + // not both. LaunchTemplateName *string `min:"3" type:"string"` } @@ -72452,12 +73760,16 @@ type DeleteLaunchTemplateVersionsInput struct { // it is UnauthorizedOperation. DryRun *bool `type:"boolean"` - // The ID of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The ID of the launch template. + // + // You must specify either the LaunchTemplateId or the LaunchTemplateName, but + // not both. LaunchTemplateId *string `type:"string"` - // The name of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The name of the launch template. + // + // You must specify either the LaunchTemplateName or the LaunchTemplateId, but + // not both. LaunchTemplateName *string `min:"3" type:"string"` // The version numbers of one or more launch template versions to delete. @@ -75554,6 +76866,95 @@ func (s *DeleteTransitGatewayPeeringAttachmentOutput) SetTransitGatewayPeeringAt return s } +type DeleteTransitGatewayPolicyTableInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The transit gateway policy table to delete. + // + // TransitGatewayPolicyTableId is a required field + TransitGatewayPolicyTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayPolicyTableInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayPolicyTableInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DeleteTransitGatewayPolicyTableInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayPolicyTableInput"} + if s.TransitGatewayPolicyTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayPolicyTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *DeleteTransitGatewayPolicyTableInput) SetDryRun(v bool) *DeleteTransitGatewayPolicyTableInput { + s.DryRun = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *DeleteTransitGatewayPolicyTableInput) SetTransitGatewayPolicyTableId(v string) *DeleteTransitGatewayPolicyTableInput { + s.TransitGatewayPolicyTableId = &v + return s +} + +type DeleteTransitGatewayPolicyTableOutput struct { + _ struct{} `type:"structure"` + + // Provides details about the deleted transit gateway policy table. + TransitGatewayPolicyTable *TransitGatewayPolicyTable `locationName:"transitGatewayPolicyTable" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayPolicyTableOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayPolicyTableOutput) GoString() string { + return s.String() +} + +// SetTransitGatewayPolicyTable sets the TransitGatewayPolicyTable field's value. +func (s *DeleteTransitGatewayPolicyTableOutput) SetTransitGatewayPolicyTable(v *TransitGatewayPolicyTable) *DeleteTransitGatewayPolicyTableOutput { + s.TransitGatewayPolicyTable = v + return s +} + type DeleteTransitGatewayPrefixListReferenceInput struct { _ struct{} `type:"structure"` @@ -75760,6 +77161,95 @@ func (s *DeleteTransitGatewayRouteOutput) SetRoute(v *TransitGatewayRoute) *Dele return s } +type DeleteTransitGatewayRouteTableAnnouncementInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The transit gateway route table ID that's being deleted. + // + // TransitGatewayRouteTableAnnouncementId is a required field + TransitGatewayRouteTableAnnouncementId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayRouteTableAnnouncementInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayRouteTableAnnouncementInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DeleteTransitGatewayRouteTableAnnouncementInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayRouteTableAnnouncementInput"} + if s.TransitGatewayRouteTableAnnouncementId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableAnnouncementId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *DeleteTransitGatewayRouteTableAnnouncementInput) SetDryRun(v bool) *DeleteTransitGatewayRouteTableAnnouncementInput { + s.DryRun = &v + return s +} + +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *DeleteTransitGatewayRouteTableAnnouncementInput) SetTransitGatewayRouteTableAnnouncementId(v string) *DeleteTransitGatewayRouteTableAnnouncementInput { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + +type DeleteTransitGatewayRouteTableAnnouncementOutput struct { + _ struct{} `type:"structure"` + + // Provides details about a deleted transit gateway route table. + TransitGatewayRouteTableAnnouncement *TransitGatewayRouteTableAnnouncement `locationName:"transitGatewayRouteTableAnnouncement" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayRouteTableAnnouncementOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DeleteTransitGatewayRouteTableAnnouncementOutput) GoString() string { + return s.String() +} + +// SetTransitGatewayRouteTableAnnouncement sets the TransitGatewayRouteTableAnnouncement field's value. +func (s *DeleteTransitGatewayRouteTableAnnouncementOutput) SetTransitGatewayRouteTableAnnouncement(v *TransitGatewayRouteTableAnnouncement) *DeleteTransitGatewayRouteTableAnnouncementOutput { + s.TransitGatewayRouteTableAnnouncement = v + return s +} + type DeleteTransitGatewayRouteTableInput struct { _ struct{} `type:"structure"` @@ -79674,8 +81164,8 @@ type DescribeCustomerGatewaysInput struct { // // * customer-gateway-id - The ID of the customer gateway. // - // * ip-address - The IP address of the customer gateway's Internet-routable - // external interface. + // * ip-address - The IP address of the customer gateway device's external + // interface. // // * state - The state of the customer gateway (pending | available | deleting // | deleted). @@ -85554,16 +87044,22 @@ type DescribeLaunchTemplateVersionsInput struct { // * ram-disk-id - The RAM disk ID. Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"` - // The ID of the launch template. To describe one or more versions of a specified - // launch template, you must specify either the launch template ID or the launch - // template name in the request. To describe all the latest or default launch - // template versions in your account, you must omit this parameter. + // The ID of the launch template. + // + // To describe one or more versions of a specified launch template, you must + // specify either the LaunchTemplateId or the LaunchTemplateName, but not both. + // + // To describe all the latest or default launch template versions in your account, + // you must omit this parameter. LaunchTemplateId *string `type:"string"` - // The name of the launch template. To describe one or more versions of a specified - // launch template, you must specify either the launch template ID or the launch - // template name in the request. To describe all the latest or default launch - // template versions in your account, you must omit this parameter. + // The name of the launch template. + // + // To describe one or more versions of a specified launch template, you must + // specify either the LaunchTemplateName or the LaunchTemplateId, but not both. + // + // To describe all the latest or default launch template versions in your account, + // you must omit this parameter. LaunchTemplateName *string `min:"3" type:"string"` // The maximum number of results to return in a single call. To retrieve the @@ -85590,8 +87086,8 @@ type DescribeLaunchTemplateVersionsInput struct { // To describe all launch templates in your account that are defined as the // latest version, the valid value is $Latest. To describe all launch templates // in your account that are defined as the default version, the valid value - // is $Default. You can specify $Latest and $Default in the same call. You cannot - // specify numbers. + // is $Default. You can specify $Latest and $Default in the same request. You + // cannot specify numbers. Versions []*string `locationName:"LaunchTemplateVersion" locationNameList:"item" type:"list"` } @@ -87151,6 +88647,9 @@ type DescribeNetworkAclsInput struct { // // * entry.rule-action - Allows or denies the matching traffic (allow | deny). // + // * entry.egress - A Boolean that indicates the type of rule. Specify true + // for egress rules, or false for ingress rules. + // // * entry.rule-number - The number of an entry (in other words, rule) in // the set of ACL entries. // @@ -88378,6 +89877,8 @@ type DescribePlacementGroupsInput struct { // // * group-arn - The Amazon Resource Name (ARN) of the placement group. // + // * spread-level - The spread level for the placement group (host | rack). + // // * state - The state of the placement group (pending | available | deleting // | deleted). // @@ -93611,6 +95112,254 @@ func (s *DescribeTransitGatewayPeeringAttachmentsOutput) SetTransitGatewayPeerin return s } +type DescribeTransitGatewayPolicyTablesInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The filters associated with the transit gateway policy table. + Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"` + + // The maximum number of results to return with a single call. To retrieve the + // remaining results, make another call with the returned nextToken value. + MaxResults *int64 `min:"5" type:"integer"` + + // The token for the next page of results. + NextToken *string `type:"string"` + + // The IDs of the transit gateway policy tables. + TransitGatewayPolicyTableIds []*string `locationNameList:"item" type:"list"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayPolicyTablesInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayPolicyTablesInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DescribeTransitGatewayPolicyTablesInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewayPolicyTablesInput"} + if s.MaxResults != nil && *s.MaxResults < 5 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *DescribeTransitGatewayPolicyTablesInput) SetDryRun(v bool) *DescribeTransitGatewayPolicyTablesInput { + s.DryRun = &v + return s +} + +// SetFilters sets the Filters field's value. +func (s *DescribeTransitGatewayPolicyTablesInput) SetFilters(v []*Filter) *DescribeTransitGatewayPolicyTablesInput { + s.Filters = v + return s +} + +// SetMaxResults sets the MaxResults field's value. +func (s *DescribeTransitGatewayPolicyTablesInput) SetMaxResults(v int64) *DescribeTransitGatewayPolicyTablesInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeTransitGatewayPolicyTablesInput) SetNextToken(v string) *DescribeTransitGatewayPolicyTablesInput { + s.NextToken = &v + return s +} + +// SetTransitGatewayPolicyTableIds sets the TransitGatewayPolicyTableIds field's value. +func (s *DescribeTransitGatewayPolicyTablesInput) SetTransitGatewayPolicyTableIds(v []*string) *DescribeTransitGatewayPolicyTablesInput { + s.TransitGatewayPolicyTableIds = v + return s +} + +type DescribeTransitGatewayPolicyTablesOutput struct { + _ struct{} `type:"structure"` + + // The token for the next page of results. + NextToken *string `locationName:"nextToken" type:"string"` + + // Describes the transit gateway policy tables. + TransitGatewayPolicyTables []*TransitGatewayPolicyTable `locationName:"transitGatewayPolicyTables" locationNameList:"item" type:"list"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayPolicyTablesOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayPolicyTablesOutput) GoString() string { + return s.String() +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeTransitGatewayPolicyTablesOutput) SetNextToken(v string) *DescribeTransitGatewayPolicyTablesOutput { + s.NextToken = &v + return s +} + +// SetTransitGatewayPolicyTables sets the TransitGatewayPolicyTables field's value. +func (s *DescribeTransitGatewayPolicyTablesOutput) SetTransitGatewayPolicyTables(v []*TransitGatewayPolicyTable) *DescribeTransitGatewayPolicyTablesOutput { + s.TransitGatewayPolicyTables = v + return s +} + +type DescribeTransitGatewayRouteTableAnnouncementsInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The filters associated with the transit gateway policy table. + Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"` + + // The maximum number of results to return with a single call. To retrieve the + // remaining results, make another call with the returned nextToken value. + MaxResults *int64 `min:"5" type:"integer"` + + // The token for the next page of results. + NextToken *string `type:"string"` + + // The IDs of the transit gateway route tables that are being advertised. + TransitGatewayRouteTableAnnouncementIds []*string `locationNameList:"item" type:"list"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayRouteTableAnnouncementsInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayRouteTableAnnouncementsInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewayRouteTableAnnouncementsInput"} + if s.MaxResults != nil && *s.MaxResults < 5 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) SetDryRun(v bool) *DescribeTransitGatewayRouteTableAnnouncementsInput { + s.DryRun = &v + return s +} + +// SetFilters sets the Filters field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) SetFilters(v []*Filter) *DescribeTransitGatewayRouteTableAnnouncementsInput { + s.Filters = v + return s +} + +// SetMaxResults sets the MaxResults field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) SetMaxResults(v int64) *DescribeTransitGatewayRouteTableAnnouncementsInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) SetNextToken(v string) *DescribeTransitGatewayRouteTableAnnouncementsInput { + s.NextToken = &v + return s +} + +// SetTransitGatewayRouteTableAnnouncementIds sets the TransitGatewayRouteTableAnnouncementIds field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsInput) SetTransitGatewayRouteTableAnnouncementIds(v []*string) *DescribeTransitGatewayRouteTableAnnouncementsInput { + s.TransitGatewayRouteTableAnnouncementIds = v + return s +} + +type DescribeTransitGatewayRouteTableAnnouncementsOutput struct { + _ struct{} `type:"structure"` + + // The token for the next page of results. + NextToken *string `locationName:"nextToken" type:"string"` + + // Describes the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncements []*TransitGatewayRouteTableAnnouncement `locationName:"transitGatewayRouteTableAnnouncements" locationNameList:"item" type:"list"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayRouteTableAnnouncementsOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DescribeTransitGatewayRouteTableAnnouncementsOutput) GoString() string { + return s.String() +} + +// SetNextToken sets the NextToken field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsOutput) SetNextToken(v string) *DescribeTransitGatewayRouteTableAnnouncementsOutput { + s.NextToken = &v + return s +} + +// SetTransitGatewayRouteTableAnnouncements sets the TransitGatewayRouteTableAnnouncements field's value. +func (s *DescribeTransitGatewayRouteTableAnnouncementsOutput) SetTransitGatewayRouteTableAnnouncements(v []*TransitGatewayRouteTableAnnouncement) *DescribeTransitGatewayRouteTableAnnouncementsOutput { + s.TransitGatewayRouteTableAnnouncements = v + return s +} + type DescribeTransitGatewayRouteTablesInput struct { _ struct{} `type:"structure"` @@ -98079,9 +99828,10 @@ type DisableTransitGatewayRouteTablePropagationInput struct { DryRun *bool `type:"boolean"` // The ID of the attachment. - // - // TransitGatewayAttachmentId is a required field - TransitGatewayAttachmentId *string `type:"string" required:"true"` + TransitGatewayAttachmentId *string `type:"string"` + + // The ID of the route table announcement. + TransitGatewayRouteTableAnnouncementId *string `type:"string"` // The ID of the propagation route table. // @@ -98110,9 +99860,6 @@ func (s DisableTransitGatewayRouteTablePropagationInput) GoString() string { // Validate inspects the fields of the type to determine if they are valid. func (s *DisableTransitGatewayRouteTablePropagationInput) Validate() error { invalidParams := request.ErrInvalidParams{Context: "DisableTransitGatewayRouteTablePropagationInput"} - if s.TransitGatewayAttachmentId == nil { - invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId")) - } if s.TransitGatewayRouteTableId == nil { invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId")) } @@ -98135,6 +99882,12 @@ func (s *DisableTransitGatewayRouteTablePropagationInput) SetTransitGatewayAttac return s } +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *DisableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableAnnouncementId(v string) *DisableTransitGatewayRouteTablePropagationInput { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + // SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value. func (s *DisableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableId(v string) *DisableTransitGatewayRouteTablePropagationInput { s.TransitGatewayRouteTableId = &v @@ -99142,6 +100895,110 @@ func (s *DisassociateTransitGatewayMulticastDomainOutput) SetAssociations(v *Tra return s } +type DisassociateTransitGatewayPolicyTableInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The ID of the transit gateway attachment to disassociate from the policy + // table. + // + // TransitGatewayAttachmentId is a required field + TransitGatewayAttachmentId *string `type:"string" required:"true"` + + // The ID of the disassociated policy table. + // + // TransitGatewayPolicyTableId is a required field + TransitGatewayPolicyTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DisassociateTransitGatewayPolicyTableInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DisassociateTransitGatewayPolicyTableInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DisassociateTransitGatewayPolicyTableInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DisassociateTransitGatewayPolicyTableInput"} + if s.TransitGatewayAttachmentId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId")) + } + if s.TransitGatewayPolicyTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayPolicyTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *DisassociateTransitGatewayPolicyTableInput) SetDryRun(v bool) *DisassociateTransitGatewayPolicyTableInput { + s.DryRun = &v + return s +} + +// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value. +func (s *DisassociateTransitGatewayPolicyTableInput) SetTransitGatewayAttachmentId(v string) *DisassociateTransitGatewayPolicyTableInput { + s.TransitGatewayAttachmentId = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *DisassociateTransitGatewayPolicyTableInput) SetTransitGatewayPolicyTableId(v string) *DisassociateTransitGatewayPolicyTableInput { + s.TransitGatewayPolicyTableId = &v + return s +} + +type DisassociateTransitGatewayPolicyTableOutput struct { + _ struct{} `type:"structure"` + + // Returns details about the transit gateway policy table disassociation. + Association *TransitGatewayPolicyTableAssociation `locationName:"association" type:"structure"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DisassociateTransitGatewayPolicyTableOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s DisassociateTransitGatewayPolicyTableOutput) GoString() string { + return s.String() +} + +// SetAssociation sets the Association field's value. +func (s *DisassociateTransitGatewayPolicyTableOutput) SetAssociation(v *TransitGatewayPolicyTableAssociation) *DisassociateTransitGatewayPolicyTableOutput { + s.Association = v + return s +} + type DisassociateTransitGatewayRouteTableInput struct { _ struct{} `type:"structure"` @@ -101705,9 +103562,10 @@ type EnableTransitGatewayRouteTablePropagationInput struct { DryRun *bool `type:"boolean"` // The ID of the attachment. - // - // TransitGatewayAttachmentId is a required field - TransitGatewayAttachmentId *string `type:"string" required:"true"` + TransitGatewayAttachmentId *string `type:"string"` + + // The ID of the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncementId *string `type:"string"` // The ID of the propagation route table. // @@ -101736,9 +103594,6 @@ func (s EnableTransitGatewayRouteTablePropagationInput) GoString() string { // Validate inspects the fields of the type to determine if they are valid. func (s *EnableTransitGatewayRouteTablePropagationInput) Validate() error { invalidParams := request.ErrInvalidParams{Context: "EnableTransitGatewayRouteTablePropagationInput"} - if s.TransitGatewayAttachmentId == nil { - invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId")) - } if s.TransitGatewayRouteTableId == nil { invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId")) } @@ -101761,6 +103616,12 @@ func (s *EnableTransitGatewayRouteTablePropagationInput) SetTransitGatewayAttach return s } +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *EnableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableAnnouncementId(v string) *EnableTransitGatewayRouteTablePropagationInput { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + // SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value. func (s *EnableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableId(v string) *EnableTransitGatewayRouteTablePropagationInput { s.TransitGatewayRouteTableId = &v @@ -102225,18 +104086,21 @@ type EventInformation struct { // * active - The EC2 Fleet or Spot Fleet request has been validated and // Amazon EC2 is attempting to maintain the target number of running instances. // - // * cancelled - The EC2 Fleet or Spot Fleet request is canceled and has - // no running instances. The EC2 Fleet or Spot Fleet will be deleted two - // days after its instances are terminated. + // * deleted (EC2 Fleet) / cancelled (Spot Fleet) - The EC2 Fleet is deleted + // or the Spot Fleet request is canceled and has no running instances. The + // EC2 Fleet or Spot Fleet will be deleted two days after its instances are + // terminated. // - // * cancelled_running - The EC2 Fleet or Spot Fleet request is canceled - // and does not launch additional instances. Its existing instances continue - // to run until they are interrupted or terminated. The request remains in - // this state until all instances are interrupted or terminated. + // * deleted_running (EC2 Fleet) / cancelled_running (Spot Fleet) - The EC2 + // Fleet is deleted or the Spot Fleet request is canceled and does not launch + // additional instances. Its existing instances continue to run until they + // are interrupted or terminated. The request remains in this state until + // all instances are interrupted or terminated. // - // * cancelled_terminating - The EC2 Fleet or Spot Fleet request is canceled - // and its instances are terminating. The request remains in this state until - // all instances are terminated. + // * deleted_terminating (EC2 Fleet) / cancelled_terminating (Spot Fleet) + // - The EC2 Fleet is deleted or the Spot Fleet request is canceled and its + // instances are terminating. The request remains in this state until all + // instances are terminated. // // * expired - The EC2 Fleet or Spot Fleet request has expired. If the request // was created with TerminateInstancesWithExpiration set, a subsequent terminated @@ -104677,6 +106541,12 @@ type FleetLaunchTemplateOverrides struct { InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"` // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. MaxPrice *string `locationName:"maxPrice" type:"string"` // The location where the instance launched, if applicable. @@ -104791,6 +106661,12 @@ type FleetLaunchTemplateOverridesRequest struct { InstanceType *string `type:"string" enum:"InstanceType"` // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. MaxPrice *string `type:"string"` // The location where the instance launched, if applicable. @@ -104903,20 +106779,26 @@ func (s *FleetLaunchTemplateOverridesRequest) SetWeightedCapacity(v float64) *Fl return s } -// Describes the Amazon EC2 launch template and the launch template version -// that can be used by a Spot Fleet request to configure Amazon EC2 instances. -// For information about launch templates, see Launching an instance from a -// launch template (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) +// The Amazon EC2 launch template that can be used by a Spot Fleet to configure +// Amazon EC2 instances. You must specify either the ID or name of the launch +// template in the request, but not both. +// +// For information about launch templates, see Launch an instance from a launch +// template (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) // in the Amazon EC2 User Guide for Linux Instances. type FleetLaunchTemplateSpecification struct { _ struct{} `type:"structure"` - // The ID of the launch template. If you specify the template ID, you can't - // specify the template name. + // The ID of the launch template. + // + // You must specify the LaunchTemplateId or the LaunchTemplateName, but not + // both. LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"` - // The name of the launch template. If you specify the template name, you can't - // specify the template ID. + // The name of the launch template. + // + // You must specify the LaunchTemplateName or the LaunchTemplateId, but not + // both. LaunchTemplateName *string `locationName:"launchTemplateName" min:"3" type:"string"` // The launch template version number, $Latest, or $Default. You must specify @@ -104979,20 +106861,26 @@ func (s *FleetLaunchTemplateSpecification) SetVersion(v string) *FleetLaunchTemp return s } -// Describes the Amazon EC2 launch template and the launch template version -// that can be used by an EC2 Fleet to configure Amazon EC2 instances. For information -// about launch templates, see Launching an instance from a launch template -// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) +// The Amazon EC2 launch template that can be used by an EC2 Fleet to configure +// Amazon EC2 instances. You must specify either the ID or name of the launch +// template in the request, but not both. +// +// For information about launch templates, see Launch an instance from a launch +// template (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) // in the Amazon EC2 User Guide. type FleetLaunchTemplateSpecificationRequest struct { _ struct{} `type:"structure"` - // The ID of the launch template. If you specify the template ID, you can't - // specify the template name. + // The ID of the launch template. + // + // You must specify the LaunchTemplateId or the LaunchTemplateName, but not + // both. LaunchTemplateId *string `type:"string"` - // The name of the launch template. If you specify the template name, you can't - // specify the template ID. + // The name of the launch template. + // + // You must specify the LaunchTemplateName or the LaunchTemplateId, but not + // both. LaunchTemplateName *string `min:"3" type:"string"` // The launch template version number, $Latest, or $Default. You must specify @@ -109605,6 +111493,255 @@ func (s *GetTransitGatewayMulticastDomainAssociationsOutput) SetNextToken(v stri return s } +type GetTransitGatewayPolicyTableAssociationsInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The filters associated with the transit gateway policy table. + Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"` + + // The maximum number of results to return with a single call. To retrieve the + // remaining results, make another call with the returned nextToken value. + MaxResults *int64 `min:"5" type:"integer"` + + // The token for the next page of results. + NextToken *string `type:"string"` + + // The ID of the transit gateway policy table. + // + // TransitGatewayPolicyTableId is a required field + TransitGatewayPolicyTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableAssociationsInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableAssociationsInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *GetTransitGatewayPolicyTableAssociationsInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "GetTransitGatewayPolicyTableAssociationsInput"} + if s.MaxResults != nil && *s.MaxResults < 5 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5)) + } + if s.TransitGatewayPolicyTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayPolicyTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *GetTransitGatewayPolicyTableAssociationsInput) SetDryRun(v bool) *GetTransitGatewayPolicyTableAssociationsInput { + s.DryRun = &v + return s +} + +// SetFilters sets the Filters field's value. +func (s *GetTransitGatewayPolicyTableAssociationsInput) SetFilters(v []*Filter) *GetTransitGatewayPolicyTableAssociationsInput { + s.Filters = v + return s +} + +// SetMaxResults sets the MaxResults field's value. +func (s *GetTransitGatewayPolicyTableAssociationsInput) SetMaxResults(v int64) *GetTransitGatewayPolicyTableAssociationsInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *GetTransitGatewayPolicyTableAssociationsInput) SetNextToken(v string) *GetTransitGatewayPolicyTableAssociationsInput { + s.NextToken = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *GetTransitGatewayPolicyTableAssociationsInput) SetTransitGatewayPolicyTableId(v string) *GetTransitGatewayPolicyTableAssociationsInput { + s.TransitGatewayPolicyTableId = &v + return s +} + +type GetTransitGatewayPolicyTableAssociationsOutput struct { + _ struct{} `type:"structure"` + + // Returns details about the transit gateway policy table association. + Associations []*TransitGatewayPolicyTableAssociation `locationName:"associations" locationNameList:"item" type:"list"` + + // The token for the next page of results. + NextToken *string `locationName:"nextToken" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableAssociationsOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableAssociationsOutput) GoString() string { + return s.String() +} + +// SetAssociations sets the Associations field's value. +func (s *GetTransitGatewayPolicyTableAssociationsOutput) SetAssociations(v []*TransitGatewayPolicyTableAssociation) *GetTransitGatewayPolicyTableAssociationsOutput { + s.Associations = v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *GetTransitGatewayPolicyTableAssociationsOutput) SetNextToken(v string) *GetTransitGatewayPolicyTableAssociationsOutput { + s.NextToken = &v + return s +} + +type GetTransitGatewayPolicyTableEntriesInput struct { + _ struct{} `type:"structure"` + + // Checks whether you have the required permissions for the action, without + // actually making the request, and provides an error response. If you have + // the required permissions, the error response is DryRunOperation. Otherwise, + // it is UnauthorizedOperation. + DryRun *bool `type:"boolean"` + + // The filters associated with the transit gateway policy table. + Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"` + + // The maximum number of results to return with a single call. To retrieve the + // remaining results, make another call with the returned nextToken value. + MaxResults *int64 `min:"5" type:"integer"` + + // The token for the next page of results. + NextToken *string `type:"string"` + + // The ID of the transit gateway policy table. + // + // TransitGatewayPolicyTableId is a required field + TransitGatewayPolicyTableId *string `type:"string" required:"true"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableEntriesInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableEntriesInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *GetTransitGatewayPolicyTableEntriesInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "GetTransitGatewayPolicyTableEntriesInput"} + if s.MaxResults != nil && *s.MaxResults < 5 { + invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5)) + } + if s.TransitGatewayPolicyTableId == nil { + invalidParams.Add(request.NewErrParamRequired("TransitGatewayPolicyTableId")) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDryRun sets the DryRun field's value. +func (s *GetTransitGatewayPolicyTableEntriesInput) SetDryRun(v bool) *GetTransitGatewayPolicyTableEntriesInput { + s.DryRun = &v + return s +} + +// SetFilters sets the Filters field's value. +func (s *GetTransitGatewayPolicyTableEntriesInput) SetFilters(v []*Filter) *GetTransitGatewayPolicyTableEntriesInput { + s.Filters = v + return s +} + +// SetMaxResults sets the MaxResults field's value. +func (s *GetTransitGatewayPolicyTableEntriesInput) SetMaxResults(v int64) *GetTransitGatewayPolicyTableEntriesInput { + s.MaxResults = &v + return s +} + +// SetNextToken sets the NextToken field's value. +func (s *GetTransitGatewayPolicyTableEntriesInput) SetNextToken(v string) *GetTransitGatewayPolicyTableEntriesInput { + s.NextToken = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *GetTransitGatewayPolicyTableEntriesInput) SetTransitGatewayPolicyTableId(v string) *GetTransitGatewayPolicyTableEntriesInput { + s.TransitGatewayPolicyTableId = &v + return s +} + +type GetTransitGatewayPolicyTableEntriesOutput struct { + _ struct{} `type:"structure"` + + // The entries for the transit gateway policy table. + TransitGatewayPolicyTableEntries []*TransitGatewayPolicyTableEntry `locationName:"transitGatewayPolicyTableEntries" locationNameList:"item" type:"list"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableEntriesOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s GetTransitGatewayPolicyTableEntriesOutput) GoString() string { + return s.String() +} + +// SetTransitGatewayPolicyTableEntries sets the TransitGatewayPolicyTableEntries field's value. +func (s *GetTransitGatewayPolicyTableEntriesOutput) SetTransitGatewayPolicyTableEntries(v []*TransitGatewayPolicyTableEntry) *GetTransitGatewayPolicyTableEntriesOutput { + s.TransitGatewayPolicyTableEntries = v + return s +} + type GetTransitGatewayPrefixListReferencesInput struct { _ struct{} `type:"structure"` @@ -116358,9 +118495,9 @@ type InstanceRequirements struct { // // * For instance types with hard disk drive (HDD) storage, specify hdd. // - // * For instance types with solid state drive (SDD) storage, specify sdd. + // * For instance types with solid state drive (SSD) storage, specify ssd. // - // Default: hdd and sdd + // Default: hdd and ssd LocalStorageTypes []*string `locationName:"localStorageTypeSet" locationNameList:"item" type:"list" enum:"LocalStorageType"` // The minimum and maximum amount of memory per vCPU, in GiB. @@ -116378,9 +118515,9 @@ type InstanceRequirements struct { // The price protection threshold for On-Demand Instances. This is the maximum // you’ll pay for an On-Demand Instance, expressed as a percentage above the - // cheapest M, C, or R instance type with your specified attributes. When Amazon - // EC2 selects instance types with your attributes, it excludes instance types - // priced above your threshold. + // least expensive current generation M, C, or R instance type with your specified + // attributes. When Amazon EC2 selects instance types with your attributes, + // it excludes instance types priced above your threshold. // // The parameter accepts an integer, which Amazon EC2 interprets as a percentage. // @@ -116404,10 +118541,10 @@ type InstanceRequirements struct { RequireHibernateSupport *bool `locationName:"requireHibernateSupport" type:"boolean"` // The price protection threshold for Spot Instances. This is the maximum you’ll - // pay for a Spot Instance, expressed as a percentage above the cheapest M, - // C, or R instance type with your specified attributes. When Amazon EC2 selects - // instance types with your attributes, it excludes instance types priced above - // your threshold. + // pay for a Spot Instance, expressed as a percentage above the least expensive + // current generation M, C, or R instance type with your specified attributes. + // When Amazon EC2 selects instance types with your attributes, it excludes + // instance types priced above your threshold. // // The parameter accepts an integer, which Amazon EC2 interprets as a percentage. // @@ -116740,9 +118877,9 @@ type InstanceRequirementsRequest struct { // // * For instance types with hard disk drive (HDD) storage, specify hdd. // - // * For instance types with solid state drive (SDD) storage, specify sdd. + // * For instance types with solid state drive (SSD) storage, specify ssd. // - // Default: hdd and sdd + // Default: hdd and ssd LocalStorageTypes []*string `locationName:"LocalStorageType" locationNameList:"item" type:"list" enum:"LocalStorageType"` // The minimum and maximum amount of memory per vCPU, in GiB. @@ -116762,9 +118899,9 @@ type InstanceRequirementsRequest struct { // The price protection threshold for On-Demand Instances. This is the maximum // you’ll pay for an On-Demand Instance, expressed as a percentage above the - // cheapest M, C, or R instance type with your specified attributes. When Amazon - // EC2 selects instance types with your attributes, it excludes instance types - // priced above your threshold. + // least expensive current generation M, C, or R instance type with your specified + // attributes. When Amazon EC2 selects instance types with your attributes, + // it excludes instance types priced above your threshold. // // The parameter accepts an integer, which Amazon EC2 interprets as a percentage. // @@ -116788,10 +118925,10 @@ type InstanceRequirementsRequest struct { RequireHibernateSupport *bool `type:"boolean"` // The price protection threshold for Spot Instance. This is the maximum you’ll - // pay for an Spot Instance, expressed as a percentage above the cheapest M, - // C, or R instance type with your specified attributes. When Amazon EC2 selects - // instance types with your attributes, it excludes instance types priced above - // your threshold. + // pay for an Spot Instance, expressed as a percentage above the least expensive + // current generation M, C, or R instance type with your specified attributes. + // When Amazon EC2 selects instance types with your attributes, it excludes + // instance types priced above your threshold. // // The parameter accepts an integer, which Amazon EC2 interprets as a percentage. // @@ -118256,7 +120393,8 @@ func (s *IpRange) SetDescription(v string) *IpRange { // workflows including assigning, tracking, troubleshooting, and auditing IP // addresses across Amazon Web Services Regions and accounts throughout your // Amazon Web Services Organization. For more information, see What is IPAM? -// (/vpc/latest/ipam/what-is-it-ipam.html) in the Amazon VPC IPAM User Guide. +// (https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html) in the +// Amazon VPC IPAM User Guide. type Ipam struct { _ struct{} `type:"structure"` @@ -118277,7 +120415,7 @@ type Ipam struct { // and monitors resources in the Amazon Web Services Regions you select as operating // Regions. // - // For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) + // For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. OperatingRegions []*IpamOperatingRegion `locationName:"operatingRegionSet" locationNameList:"item" type:"list"` @@ -118291,8 +120429,8 @@ type Ipam struct { PublicDefaultScopeId *string `locationName:"publicDefaultScopeId" type:"string"` // The number of scopes in the IPAM. The scope quota is 5. For more information - // on quotas, see Quotas in IPAM (/vpc/latest/ipam/quotas-ipam.html) in the - // Amazon VPC IPAM User Guide. + // on quotas, see Quotas in IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html) + // in the Amazon VPC IPAM User Guide. ScopeCount *int64 `locationName:"scopeCount" type:"integer"` // The state of the IPAM. @@ -118390,7 +120528,7 @@ func (s *Ipam) SetTags(v []*Tag) *Ipam { } // The historical record of a CIDR within an IPAM scope. For more information, -// see View the history of IP addresses (/vpc/latest/ipam/view-history-cidr-ipam.html) +// see View the history of IP addresses (https://docs.aws.amazon.com/vpc/latest/ipam/view-history-cidr-ipam.html) // in the Amazon VPC IPAM User Guide. type IpamAddressHistoryRecord struct { _ struct{} `type:"structure"` @@ -118399,7 +120537,7 @@ type IpamAddressHistoryRecord struct { ResourceCidr *string `locationName:"resourceCidr" type:"string"` // The compliance status of a resource. For more information on compliance statuses, - // see Monitor CIDR usage by resource (/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) + // see Monitor CIDR usage by resource (https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) // in the Amazon VPC IPAM User Guide. ResourceComplianceStatus *string `locationName:"resourceComplianceStatus" type:"string" enum:"IpamComplianceStatus"` @@ -118411,7 +120549,7 @@ type IpamAddressHistoryRecord struct { // The overlap status of an IPAM resource. The overlap status tells you if the // CIDR for a resource overlaps with another CIDR in the scope. For more information - // on overlap statuses, see Monitor CIDR usage by resource (/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) + // on overlap statuses, see Monitor CIDR usage by resource (https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) // in the Amazon VPC IPAM User Guide. ResourceOverlapStatus *string `locationName:"resourceOverlapStatus" type:"string" enum:"IpamOverlapStatus"` @@ -118569,7 +120707,7 @@ func (s *IpamCidrAuthorizationContext) SetSignature(v string) *IpamCidrAuthoriza // and monitors resources in the Amazon Web Services Regions you select as operating // Regions. // -// For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) +// For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. type IpamOperatingRegion struct { _ struct{} `type:"structure"` @@ -118694,8 +120832,8 @@ type IpamPool struct { OwnerId *string `locationName:"ownerId" type:"string"` // The depth of pools in your IPAM pool. The pool depth quota is 10. For more - // information, see Quotas in IPAM (/vpc/latest/ipam/quotas-ipam.html) in the - // Amazon VPC IPAM User Guide. + // information, see Quotas in IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html) + // in the Amazon VPC IPAM User Guide. PoolDepth *int64 `locationName:"poolDepth" type:"integer"` // Determines if a pool is publicly advertisable. This option is not available @@ -119058,12 +121196,25 @@ type IpamResourceCidr struct { _ struct{} `type:"structure"` // The compliance status of the IPAM resource. For more information on compliance - // statuses, see Monitor CIDR usage by resource (/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) + // statuses, see Monitor CIDR usage by resource (https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) // in the Amazon VPC IPAM User Guide. ComplianceStatus *string `locationName:"complianceStatus" type:"string" enum:"IpamComplianceStatus"` - // The IP address space in the IPAM pool that is allocated to this resource. - // To convert the decimal to a percentage, multiply the decimal by 100. + // The percentage of IP address space in use. To convert the decimal to a percentage, + // multiply the decimal by 100. Note the following: + // + // * For a resources that are VPCs, this is the percentage of IP address + // space in the VPC that's taken up by subnet CIDRs. + // + // * For resources that are subnets, if the subnet has an IPv4 CIDR provisioned + // to it, this is the percentage of IPv4 address space in the subnet that's + // in use. If the subnet has an IPv6 CIDR provisioned to it, the percentage + // of IPv6 address space in use is not represented. The percentage of IPv6 + // address space in use cannot currently be calculated. + // + // * For resources that are public IPv4 pools, this is the percentage of + // IP address space in the pool that's been allocated to Elastic IP addresses + // (EIPs). IpUsage *float64 `locationName:"ipUsage" type:"double"` // The IPAM ID for an IPAM resource. @@ -119076,13 +121227,13 @@ type IpamResourceCidr struct { IpamScopeId *string `locationName:"ipamScopeId" type:"string"` // The management state of the resource. For more information about management - // states, see Monitor CIDR usage by resource (/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) + // states, see Monitor CIDR usage by resource (https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) // in the Amazon VPC IPAM User Guide. ManagementState *string `locationName:"managementState" type:"string" enum:"IpamManagementState"` // The overlap status of an IPAM resource. The overlap status tells you if the // CIDR for a resource overlaps with another CIDR in the scope. For more information - // on overlap statuses, see Monitor CIDR usage by resource (/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) + // on overlap statuses, see Monitor CIDR usage by resource (https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html) // in the Amazon VPC IPAM User Guide. OverlapStatus *string `locationName:"overlapStatus" type:"string" enum:"IpamOverlapStatus"` @@ -119271,7 +121422,7 @@ func (s *IpamResourceTag) SetValue(v string) *IpamResourceTag { // IP addresses across multiple unconnected networks without causing IP address // overlap or conflict. // -// For more information, see How IPAM works (/vpc/latest/ipam/how-it-works-ipam.html) +// For more information, see How IPAM works (https://docs.aws.amazon.com/vpc/latest/ipam/how-it-works-ipam.html) // in the Amazon VPC IPAM User Guide. type IpamScope struct { _ struct{} `type:"structure"` @@ -121380,7 +123531,7 @@ func (s *LaunchTemplateInstanceMarketOptionsRequest) SetSpotOptions(v *LaunchTem } // The metadata options for the instance. For more information, see Instance -// Metadata and User Data (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) +// metadata and user data (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) // in the Amazon Elastic Compute Cloud User Guide. type LaunchTemplateInstanceMetadataOptions struct { _ struct{} `type:"structure"` @@ -121492,7 +123643,7 @@ func (s *LaunchTemplateInstanceMetadataOptions) SetState(v string) *LaunchTempla } // The metadata options for the instance. For more information, see Instance -// Metadata and User Data (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) +// metadata and user data (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) // in the Amazon Elastic Compute Cloud User Guide. type LaunchTemplateInstanceMetadataOptionsRequest struct { _ struct{} `type:"structure"` @@ -122106,6 +124257,12 @@ type LaunchTemplateOverrides struct { Priority *float64 `locationName:"priority" type:"double"` // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The ID of the subnet in which to launch the instances. @@ -122485,9 +124642,15 @@ type LaunchTemplateSpecification struct { _ struct{} `type:"structure"` // The ID of the launch template. + // + // You must specify the LaunchTemplateId or the LaunchTemplateName, but not + // both. LaunchTemplateId *string `type:"string"` // The name of the launch template. + // + // You must specify the LaunchTemplateName or the LaunchTemplateId, but not + // both. LaunchTemplateName *string `type:"string"` // The version number of the launch template. @@ -122544,7 +124707,12 @@ type LaunchTemplateSpotMarketOptions struct { // The behavior when a Spot Instance is interrupted. InstanceInterruptionBehavior *string `locationName:"instanceInterruptionBehavior" type:"string" enum:"InstanceInterruptionBehavior"` - // The maximum hourly price you're willing to pay for the Spot Instances. + // The maximum hourly price you're willing to pay for the Spot Instances. We + // do not recommend using this parameter because it can lead to increased interruptions. + // If you do not specify this parameter, you will pay the current Spot price. + // + // If you specify a maximum price, your Spot Instances will be interrupted more + // frequently than if you do not specify this parameter. MaxPrice *string `locationName:"maxPrice" type:"string"` // The Spot Instance request type. @@ -122609,25 +124777,34 @@ func (s *LaunchTemplateSpotMarketOptions) SetValidUntil(v time.Time) *LaunchTemp type LaunchTemplateSpotMarketOptionsRequest struct { _ struct{} `type:"structure"` - // The required duration for the Spot Instances (also known as Spot blocks), - // in minutes. This value must be a multiple of 60 (60, 120, 180, 240, 300, - // or 360). + // Deprecated. BlockDurationMinutes *int64 `type:"integer"` // The behavior when a Spot Instance is interrupted. The default is terminate. InstanceInterruptionBehavior *string `type:"string" enum:"InstanceInterruptionBehavior"` - // The maximum hourly price you're willing to pay for the Spot Instances. + // The maximum hourly price you're willing to pay for the Spot Instances. We + // do not recommend using this parameter because it can lead to increased interruptions. + // If you do not specify this parameter, you will pay the current Spot price. + // + // If you specify a maximum price, your Spot Instances will be interrupted more + // frequently than if you do not specify this parameter. MaxPrice *string `type:"string"` // The Spot Instance request type. SpotInstanceType *string `type:"string" enum:"SpotInstanceType"` - // The end date of the request. For a one-time request, the request remains - // active until all instances launch, the request is canceled, or this date - // is reached. If the request is persistent, it remains active until it is canceled - // or this date and time is reached. The default end date is 7 days from the - // current date. + // The end date of the request, in UTC format (YYYY-MM-DDTHH:MM:SSZ). Supported + // only for persistent requests. + // + // * For a persistent request, the request remains active until the ValidUntil + // date and time is reached. Otherwise, the request remains active until + // you cancel it. + // + // * For a one-time request, ValidUntil is not supported. The request remains + // active until all instances launch or you cancel the request. + // + // Default: 7 days from the current date ValidUntil *time.Time `type:"timestamp"` } @@ -122679,11 +124856,11 @@ func (s *LaunchTemplateSpotMarketOptionsRequest) SetValidUntil(v time.Time) *Lau return s } -// The tag specification for the launch template. +// The tags specification for the launch template. type LaunchTemplateTagSpecification struct { _ struct{} `type:"structure"` - // The type of resource. + // The type of resource to tag. ResourceType *string `locationName:"resourceType" type:"string" enum:"ResourceType"` // The tags for the resource. @@ -122720,12 +124897,17 @@ func (s *LaunchTemplateTagSpecification) SetTags(v []*Tag) *LaunchTemplateTagSpe return s } -// The tags specification for the launch template. +// The tags specification for the resources that are created during instance +// launch. type LaunchTemplateTagSpecificationRequest struct { _ struct{} `type:"structure"` - // The type of resource to tag. Currently, the resource types that support tagging - // on creation are instance, volume, elastic-gpu, network-interface, and spot-instances-request. + // The type of resource to tag. + // + // The Valid Values are all the resource types that can be tagged. However, + // when creating a launch template, you can specify tags for the following resource + // types only: instance | volume | elastic-gpu | network-interface | spot-instances-request + // // To tag a resource after it has been created, see CreateTags (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html). ResourceType *string `type:"string" enum:"ResourceType"` @@ -127251,7 +129433,7 @@ type ModifyIpamInput struct { // only discovers and monitors resources in the Amazon Web Services Regions // you select as operating Regions. // - // For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) + // For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide. AddOperatingRegions []*AddIpamOperatingRegion `locationName:"AddOperatingRegion" type:"list"` @@ -127369,7 +129551,7 @@ type ModifyIpamPoolInput struct { _ struct{} `type:"structure"` // Add tag allocation rules to a pool. For more information about allocation - // rules, see Create a top-level pool (/vpc/latest/ipam/create-top-ipam.html) + // rules, see Create a top-level pool (https://docs.aws.amazon.com/vpc/latest/ipam/create-top-ipam.html) // in the Amazon VPC IPAM User Guide. AddAllocationResourceTags []*RequestIpamResourceTag `locationName:"AddAllocationResourceTag" locationNameList:"item" type:"list"` @@ -127818,12 +130000,16 @@ type ModifyLaunchTemplateInput struct { // it is UnauthorizedOperation. DryRun *bool `type:"boolean"` - // The ID of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The ID of the launch template. + // + // You must specify either the LaunchTemplateId or the LaunchTemplateName, but + // not both. LaunchTemplateId *string `type:"string"` - // The name of the launch template. You must specify either the launch template - // ID or launch template name in the request. + // The name of the launch template. + // + // You must specify either the LaunchTemplateName or the LaunchTemplateId, but + // not both. LaunchTemplateName *string `min:"3" type:"string"` } @@ -129613,6 +131799,11 @@ type ModifyTransitGatewayOptions struct { // CIDR block or larger for IPv4, or a size /64 CIDR block or larger for IPv6. AddTransitGatewayCidrBlocks []*string `locationNameList:"item" type:"list"` + // A private Autonomous System Number (ASN) for the Amazon side of a BGP session. + // The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 + // for 32-bit ASNs. + AmazonSideAsn *int64 `type:"long"` + // The ID of the default association route table. AssociationDefaultRouteTableId *string `type:"string"` @@ -129664,6 +131855,12 @@ func (s *ModifyTransitGatewayOptions) SetAddTransitGatewayCidrBlocks(v []*string return s } +// SetAmazonSideAsn sets the AmazonSideAsn field's value. +func (s *ModifyTransitGatewayOptions) SetAmazonSideAsn(v int64) *ModifyTransitGatewayOptions { + s.AmazonSideAsn = &v + return s +} + // SetAssociationDefaultRouteTableId sets the AssociationDefaultRouteTableId field's value. func (s *ModifyTransitGatewayOptions) SetAssociationDefaultRouteTableId(v string) *ModifyTransitGatewayOptions { s.AssociationDefaultRouteTableId = &v @@ -134826,7 +137023,7 @@ type PathComponent struct { // The subnet. Subnet *AnalysisComponent `locationName:"subnet" type:"structure"` - // Describes a path component. + // The transit gateway. TransitGateway *AnalysisComponent `locationName:"transitGateway" type:"structure"` // The route in a transit gateway route table. @@ -135237,6 +137434,9 @@ func (s *PeeringConnectionOptionsRequest) SetAllowEgressFromLocalVpcToRemoteClas type PeeringTgwInfo struct { _ struct{} `type:"structure"` + // The ID of the core network where the transit gateway peer is located. + CoreNetworkId *string `locationName:"coreNetworkId" type:"string"` + // The ID of the Amazon Web Services account that owns the transit gateway. OwnerId *string `locationName:"ownerId" type:"string"` @@ -135265,6 +137465,12 @@ func (s PeeringTgwInfo) GoString() string { return s.String() } +// SetCoreNetworkId sets the CoreNetworkId field's value. +func (s *PeeringTgwInfo) SetCoreNetworkId(v string) *PeeringTgwInfo { + s.CoreNetworkId = &v + return s +} + // SetOwnerId sets the OwnerId field's value. func (s *PeeringTgwInfo) SetOwnerId(v string) *PeeringTgwInfo { s.OwnerId = &v @@ -135810,6 +138016,10 @@ type PlacementGroup struct { // The number of partitions. Valid only if strategy is set to partition. PartitionCount *int64 `locationName:"partitionCount" type:"integer"` + // The spread level for the placement group. Only Outpost placement groups can + // be spread across hosts. + SpreadLevel *string `locationName:"spreadLevel" type:"string" enum:"SpreadLevel"` + // The state of the placement group. State *string `locationName:"state" type:"string" enum:"PlacementGroupState"` @@ -135862,6 +138072,12 @@ func (s *PlacementGroup) SetPartitionCount(v int64) *PlacementGroup { return s } +// SetSpreadLevel sets the SpreadLevel field's value. +func (s *PlacementGroup) SetSpreadLevel(v string) *PlacementGroup { + s.SpreadLevel = &v + return s +} + // SetState sets the State field's value. func (s *PlacementGroup) SetState(v string) *PlacementGroup { s.State = &v @@ -139611,7 +141827,7 @@ func (s *ReleaseIpamPoolAllocationOutput) SetSuccess(v bool) *ReleaseIpamPoolAll // only discovers and monitors resources in the Amazon Web Services Regions // you select as operating Regions. // -// For more information about operating Regions, see Create an IPAM (/vpc/latest/ipam/create-ipam.html) +// For more information about operating Regions, see Create an IPAM (https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html) // in the Amazon VPC IPAM User Guide type RemoveIpamOperatingRegion struct { _ struct{} `type:"structure"` @@ -140833,8 +143049,7 @@ type RequestLaunchTemplateData struct { // in the Amazon Elastic Compute Cloud User Guide. CpuOptions *LaunchTemplateCpuOptionsRequest `type:"structure"` - // The credit option for CPU usage of the instance. Valid for T2, T3, or T3a - // instances only. + // The credit option for CPU usage of the instance. Valid only for T instances. CreditSpecification *CreditSpecificationRequest `type:"structure"` // Indicates whether to enable the instance for stop protection. For more information, @@ -140959,10 +143174,24 @@ type RequestLaunchTemplateData struct { // group ID and security name in the same request. SecurityGroups []*string `locationName:"SecurityGroup" locationNameList:"SecurityGroup" type:"list"` - // The tags to apply to the resources during launch. You can only tag instances - // and volumes on launch. The specified tags are applied to all instances or - // volumes that are created during launch. To tag a resource after it has been - // created, see CreateTags (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html). + // The tags to apply to the resources that are created during instance launch. + // + // You can specify tags for the following resources only: + // + // * Instances + // + // * Volumes + // + // * Elastic graphics + // + // * Spot Instance requests + // + // * Network interfaces + // + // To tag a resource after it has been created, see CreateTags (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html). + // + // To tag the launch template itself, you must use the TagSpecification (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLaunchTemplate.html) + // parameter. TagSpecifications []*LaunchTemplateTagSpecificationRequest `locationName:"TagSpecification" locationNameList:"LaunchTemplateTagSpecificationRequest" type:"list"` // The user data to make available to the instance. You must provide base64-encoded @@ -141374,8 +143603,13 @@ type RequestSpotInstancesInput struct { // The launch specification. LaunchSpecification *RequestSpotLaunchSpecification `type:"structure"` - // The maximum price per hour that you are willing to pay for a Spot Instance. - // The default is the On-Demand price. + // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The key-value pair for tagging the Spot Instance request on creation. The @@ -143669,7 +145903,8 @@ type ResponseLaunchTemplateData struct { // The security group names. SecurityGroups []*string `locationName:"securityGroupSet" locationNameList:"item" type:"list"` - // The tags. + // The tags that are applied to the resources that are created during instance + // launch. TagSpecifications []*LaunchTemplateTagSpecification `locationName:"tagSpecificationSet" locationNameList:"item" type:"list"` // The user data for the instance. @@ -145404,7 +147639,7 @@ type RunInstancesInput struct { CreditSpecification *CreditSpecificationRequest `type:"structure"` // Indicates whether an instance is enabled for stop protection. For more information, - // see Stop Protection (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html#Using_StopProtection). + // see Stop protection (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html#Using_StopProtection). DisableApiStop *bool `type:"boolean"` // If you set this parameter to true, you can't terminate the instance using @@ -145616,10 +147851,21 @@ type RunInstancesInput struct { // of the network interface. SubnetId *string `type:"string"` - // The tags to apply to the resources during launch. You can only tag instances - // and volumes on launch. The specified tags are applied to all instances or - // volumes that are created during launch. To tag a resource after it has been - // created, see CreateTags (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html). + // The tags to apply to the resources that are created during instance launch. + // + // You can specify tags for the following resources only: + // + // * Instances + // + // * Volumes + // + // * Elastic graphics + // + // * Spot Instance requests + // + // * Network interfaces + // + // To tag a resource after it has been created, see CreateTags (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html). TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"` // The user data script to make available to the instance. For more information, @@ -148607,7 +150853,7 @@ type ServiceDetail struct { // The ID of the endpoint service. ServiceId *string `locationName:"serviceId" type:"string"` - // The Amazon Resource Name (ARN) of the service. + // The name of the service. ServiceName *string `locationName:"serviceName" type:"string"` // The type of service. @@ -149896,9 +152142,12 @@ type SpotFleetLaunchSpecification struct { SecurityGroups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"` // The maximum price per unit hour that you are willing to pay for a Spot Instance. - // If this value is not specified, the default is the Spot price specified for - // the fleet. To determine the Spot price per unit hour, divide the Spot price - // by the value of WeightedCapacity. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The IDs of the subnets in which to launch the instances. To specify multiple @@ -150308,7 +152557,12 @@ type SpotFleetRequestConfigData struct { SpotMaxTotalPrice *string `locationName:"spotMaxTotalPrice" type:"string"` // The maximum price per unit hour that you are willing to pay for a Spot Instance. - // The default is the On-Demand price. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The key-value pair for tagging the Spot Fleet request on creation. The value @@ -150653,7 +152907,13 @@ type SpotInstanceRequest struct { // The ID of the Spot Instance request. SpotInstanceRequestId *string `locationName:"spotInstanceRequestId" type:"string"` - // The maximum price per hour that you are willing to pay for a Spot Instance. + // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The state of the Spot Instance request. Spot request status information helps @@ -150960,8 +153220,13 @@ type SpotMarketOptions struct { // The behavior when a Spot Instance is interrupted. The default is terminate. InstanceInterruptionBehavior *string `type:"string" enum:"InstanceInterruptionBehavior"` - // The maximum hourly price you're willing to pay for the Spot Instances. The - // default is the On-Demand price. + // The maximum hourly price that you're willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your Spot Instances will be interrupted more + // frequently than if you do not specify this parameter. MaxPrice *string `type:"string"` // The Spot Instance request type. For RunInstances (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances), @@ -151081,6 +153346,12 @@ type SpotOptions struct { MaintenanceStrategies *FleetSpotMaintenanceStrategies `locationName:"maintenanceStrategies" type:"structure"` // The maximum amount per hour for Spot Instances that you're willing to pay. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your Spot Instances will be interrupted more + // frequently than if you do not specify this parameter. MaxTotalPrice *string `locationName:"maxTotalPrice" type:"string"` // The minimum target capacity for Spot Instances in the fleet. If the minimum @@ -151223,6 +153494,12 @@ type SpotOptionsRequest struct { MaintenanceStrategies *FleetSpotMaintenanceStrategiesRequest `type:"structure"` // The maximum amount per hour for Spot Instances that you're willing to pay. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your Spot Instances will be interrupted more + // frequently than if you do not specify this parameter. MaxTotalPrice *string `type:"string"` // The minimum target capacity for Spot Instances in the fleet. If the minimum @@ -151423,8 +153700,13 @@ func (s *SpotPlacementScore) SetScore(v int64) *SpotPlacementScore { return s } -// Describes the maximum price per hour that you are willing to pay for a Spot -// Instance. +// The maximum price per unit hour that you are willing to pay for a Spot Instance. +// We do not recommend using this parameter because it can lead to increased +// interruptions. If you do not specify this parameter, you will pay the current +// Spot price. +// +// If you specify a maximum price, your instances will be interrupted more frequently +// than if you do not specify this parameter. type SpotPrice struct { _ struct{} `type:"structure"` @@ -151437,7 +153719,13 @@ type SpotPrice struct { // A general description of the AMI. ProductDescription *string `locationName:"productDescription" type:"string" enum:"RIProductDescription"` - // The maximum price per hour that you are willing to pay for a Spot Instance. + // The maximum price per unit hour that you are willing to pay for a Spot Instance. + // We do not recommend using this parameter because it can lead to increased + // interruptions. If you do not specify this parameter, you will pay the current + // Spot price. + // + // If you specify a maximum price, your instances will be interrupted more frequently + // than if you do not specify this parameter. SpotPrice *string `locationName:"spotPrice" type:"string"` // The date and time the request was created, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ). @@ -153029,6 +155317,11 @@ func (s *TagDescription) SetValue(v string) *TagDescription { } // The tags to apply to a resource when the resource is being created. +// +// The Valid Values lists all the resource types that can be tagged. However, +// the action you're using might not support tagging all of these resource types. +// If you try to tag a resource type that is unsupported for the action you're +// using, you'll get an error. type TagSpecification struct { _ struct{} `type:"structure"` @@ -155939,9 +158232,15 @@ type TransitGatewayPeeringAttachment struct { // Information about the accepter transit gateway. AccepterTgwInfo *PeeringTgwInfo `locationName:"accepterTgwInfo" type:"structure"` + // The ID of the accepter transit gateway attachment. + AccepterTransitGatewayAttachmentId *string `locationName:"accepterTransitGatewayAttachmentId" type:"string"` + // The time the transit gateway peering attachment was created. CreationTime *time.Time `locationName:"creationTime" type:"timestamp"` + // Details about the transit gateway peering attachment. + Options *TransitGatewayPeeringAttachmentOptions `locationName:"options" type:"structure"` + // Information about the requester transit gateway. RequesterTgwInfo *PeeringTgwInfo `locationName:"requesterTgwInfo" type:"structure"` @@ -155983,12 +158282,24 @@ func (s *TransitGatewayPeeringAttachment) SetAccepterTgwInfo(v *PeeringTgwInfo) return s } +// SetAccepterTransitGatewayAttachmentId sets the AccepterTransitGatewayAttachmentId field's value. +func (s *TransitGatewayPeeringAttachment) SetAccepterTransitGatewayAttachmentId(v string) *TransitGatewayPeeringAttachment { + s.AccepterTransitGatewayAttachmentId = &v + return s +} + // SetCreationTime sets the CreationTime field's value. func (s *TransitGatewayPeeringAttachment) SetCreationTime(v time.Time) *TransitGatewayPeeringAttachment { s.CreationTime = &v return s } +// SetOptions sets the Options field's value. +func (s *TransitGatewayPeeringAttachment) SetOptions(v *TransitGatewayPeeringAttachmentOptions) *TransitGatewayPeeringAttachment { + s.Options = v + return s +} + // SetRequesterTgwInfo sets the RequesterTgwInfo field's value. func (s *TransitGatewayPeeringAttachment) SetRequesterTgwInfo(v *PeeringTgwInfo) *TransitGatewayPeeringAttachment { s.RequesterTgwInfo = v @@ -156019,6 +158330,345 @@ func (s *TransitGatewayPeeringAttachment) SetTransitGatewayAttachmentId(v string return s } +// Describes dynamic routing for the transit gateway peering attachment. +type TransitGatewayPeeringAttachmentOptions struct { + _ struct{} `type:"structure"` + + // Describes whether dynamic routing is enabled or disabled for the transit + // gateway peering attachment. + DynamicRouting *string `locationName:"dynamicRouting" type:"string" enum:"DynamicRoutingValue"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPeeringAttachmentOptions) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPeeringAttachmentOptions) GoString() string { + return s.String() +} + +// SetDynamicRouting sets the DynamicRouting field's value. +func (s *TransitGatewayPeeringAttachmentOptions) SetDynamicRouting(v string) *TransitGatewayPeeringAttachmentOptions { + s.DynamicRouting = &v + return s +} + +// Describes a rule associated with a transit gateway policy. +type TransitGatewayPolicyRule struct { + _ struct{} `type:"structure"` + + // The destination CIDR block for the transit gateway policy rule. + DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"` + + // The port range for the transit gateway policy rule. Currently this is set + // to * (all). + DestinationPortRange *string `locationName:"destinationPortRange" type:"string"` + + // The meta data tags used for the transit gateway policy rule. + MetaData *TransitGatewayPolicyRuleMetaData `locationName:"metaData" type:"structure"` + + // The protocol used by the transit gateway policy rule. + Protocol *string `locationName:"protocol" type:"string"` + + // The source CIDR block for the transit gateway policy rule. + SourceCidrBlock *string `locationName:"sourceCidrBlock" type:"string"` + + // The port range for the transit gateway policy rule. Currently this is set + // to * (all). + SourcePortRange *string `locationName:"sourcePortRange" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyRule) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyRule) GoString() string { + return s.String() +} + +// SetDestinationCidrBlock sets the DestinationCidrBlock field's value. +func (s *TransitGatewayPolicyRule) SetDestinationCidrBlock(v string) *TransitGatewayPolicyRule { + s.DestinationCidrBlock = &v + return s +} + +// SetDestinationPortRange sets the DestinationPortRange field's value. +func (s *TransitGatewayPolicyRule) SetDestinationPortRange(v string) *TransitGatewayPolicyRule { + s.DestinationPortRange = &v + return s +} + +// SetMetaData sets the MetaData field's value. +func (s *TransitGatewayPolicyRule) SetMetaData(v *TransitGatewayPolicyRuleMetaData) *TransitGatewayPolicyRule { + s.MetaData = v + return s +} + +// SetProtocol sets the Protocol field's value. +func (s *TransitGatewayPolicyRule) SetProtocol(v string) *TransitGatewayPolicyRule { + s.Protocol = &v + return s +} + +// SetSourceCidrBlock sets the SourceCidrBlock field's value. +func (s *TransitGatewayPolicyRule) SetSourceCidrBlock(v string) *TransitGatewayPolicyRule { + s.SourceCidrBlock = &v + return s +} + +// SetSourcePortRange sets the SourcePortRange field's value. +func (s *TransitGatewayPolicyRule) SetSourcePortRange(v string) *TransitGatewayPolicyRule { + s.SourcePortRange = &v + return s +} + +// Describes the meta data tags associated with a transit gateway policy rule. +type TransitGatewayPolicyRuleMetaData struct { + _ struct{} `type:"structure"` + + // The key name for the transit gateway policy rule meta data tag. + MetaDataKey *string `locationName:"metaDataKey" type:"string"` + + // The value of the key for the transit gateway policy rule meta data tag. + MetaDataValue *string `locationName:"metaDataValue" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyRuleMetaData) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyRuleMetaData) GoString() string { + return s.String() +} + +// SetMetaDataKey sets the MetaDataKey field's value. +func (s *TransitGatewayPolicyRuleMetaData) SetMetaDataKey(v string) *TransitGatewayPolicyRuleMetaData { + s.MetaDataKey = &v + return s +} + +// SetMetaDataValue sets the MetaDataValue field's value. +func (s *TransitGatewayPolicyRuleMetaData) SetMetaDataValue(v string) *TransitGatewayPolicyRuleMetaData { + s.MetaDataValue = &v + return s +} + +// Describes a transit gateway policy table. +type TransitGatewayPolicyTable struct { + _ struct{} `type:"structure"` + + // The timestamp when the transit gateway policy table was created. + CreationTime *time.Time `locationName:"creationTime" type:"timestamp"` + + // The state of the transit gateway policy table + State *string `locationName:"state" type:"string" enum:"TransitGatewayPolicyTableState"` + + // he key-value pairs associated with the transit gateway policy table. + Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"` + + // The ID of the transit gateway. + TransitGatewayId *string `locationName:"transitGatewayId" type:"string"` + + // The ID of the transit gateway policy table. + TransitGatewayPolicyTableId *string `locationName:"transitGatewayPolicyTableId" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTable) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTable) GoString() string { + return s.String() +} + +// SetCreationTime sets the CreationTime field's value. +func (s *TransitGatewayPolicyTable) SetCreationTime(v time.Time) *TransitGatewayPolicyTable { + s.CreationTime = &v + return s +} + +// SetState sets the State field's value. +func (s *TransitGatewayPolicyTable) SetState(v string) *TransitGatewayPolicyTable { + s.State = &v + return s +} + +// SetTags sets the Tags field's value. +func (s *TransitGatewayPolicyTable) SetTags(v []*Tag) *TransitGatewayPolicyTable { + s.Tags = v + return s +} + +// SetTransitGatewayId sets the TransitGatewayId field's value. +func (s *TransitGatewayPolicyTable) SetTransitGatewayId(v string) *TransitGatewayPolicyTable { + s.TransitGatewayId = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *TransitGatewayPolicyTable) SetTransitGatewayPolicyTableId(v string) *TransitGatewayPolicyTable { + s.TransitGatewayPolicyTableId = &v + return s +} + +// Describes a transit gateway policy table association. +type TransitGatewayPolicyTableAssociation struct { + _ struct{} `type:"structure"` + + // The resource ID of the transit gateway attachment. + ResourceId *string `locationName:"resourceId" type:"string"` + + // The resource type for the transit gateway policy table association. + ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"` + + // The state of the transit gateway policy table association. + State *string `locationName:"state" type:"string" enum:"TransitGatewayAssociationState"` + + // The ID of the transit gateway attachment. + TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"` + + // The ID of the transit gateway policy table. + TransitGatewayPolicyTableId *string `locationName:"transitGatewayPolicyTableId" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTableAssociation) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTableAssociation) GoString() string { + return s.String() +} + +// SetResourceId sets the ResourceId field's value. +func (s *TransitGatewayPolicyTableAssociation) SetResourceId(v string) *TransitGatewayPolicyTableAssociation { + s.ResourceId = &v + return s +} + +// SetResourceType sets the ResourceType field's value. +func (s *TransitGatewayPolicyTableAssociation) SetResourceType(v string) *TransitGatewayPolicyTableAssociation { + s.ResourceType = &v + return s +} + +// SetState sets the State field's value. +func (s *TransitGatewayPolicyTableAssociation) SetState(v string) *TransitGatewayPolicyTableAssociation { + s.State = &v + return s +} + +// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value. +func (s *TransitGatewayPolicyTableAssociation) SetTransitGatewayAttachmentId(v string) *TransitGatewayPolicyTableAssociation { + s.TransitGatewayAttachmentId = &v + return s +} + +// SetTransitGatewayPolicyTableId sets the TransitGatewayPolicyTableId field's value. +func (s *TransitGatewayPolicyTableAssociation) SetTransitGatewayPolicyTableId(v string) *TransitGatewayPolicyTableAssociation { + s.TransitGatewayPolicyTableId = &v + return s +} + +// Describes a transit gateway policy table entry +type TransitGatewayPolicyTableEntry struct { + _ struct{} `type:"structure"` + + // The policy rule associated with the transit gateway policy table. + PolicyRule *TransitGatewayPolicyRule `locationName:"policyRule" type:"structure"` + + // The rule number for the transit gateway policy table entry. + PolicyRuleNumber *string `locationName:"policyRuleNumber" type:"string"` + + // The ID of the target route table. + TargetRouteTableId *string `locationName:"targetRouteTableId" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTableEntry) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayPolicyTableEntry) GoString() string { + return s.String() +} + +// SetPolicyRule sets the PolicyRule field's value. +func (s *TransitGatewayPolicyTableEntry) SetPolicyRule(v *TransitGatewayPolicyRule) *TransitGatewayPolicyTableEntry { + s.PolicyRule = v + return s +} + +// SetPolicyRuleNumber sets the PolicyRuleNumber field's value. +func (s *TransitGatewayPolicyTableEntry) SetPolicyRuleNumber(v string) *TransitGatewayPolicyTableEntry { + s.PolicyRuleNumber = &v + return s +} + +// SetTargetRouteTableId sets the TargetRouteTableId field's value. +func (s *TransitGatewayPolicyTableEntry) SetTargetRouteTableId(v string) *TransitGatewayPolicyTableEntry { + s.TargetRouteTableId = &v + return s +} + // Describes a transit gateway prefix list attachment. type TransitGatewayPrefixListAttachment struct { _ struct{} `type:"structure"` @@ -156162,6 +158812,9 @@ type TransitGatewayPropagation struct { // The ID of the attachment. TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"` + // The ID of the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncementId *string `locationName:"transitGatewayRouteTableAnnouncementId" type:"string"` + // The ID of the transit gateway route table. TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"` } @@ -156208,6 +158861,12 @@ func (s *TransitGatewayPropagation) SetTransitGatewayAttachmentId(v string) *Tra return s } +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *TransitGatewayPropagation) SetTransitGatewayRouteTableAnnouncementId(v string) *TransitGatewayPropagation { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + // SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value. func (s *TransitGatewayPropagation) SetTransitGatewayRouteTableId(v string) *TransitGatewayPropagation { s.TransitGatewayRouteTableId = &v @@ -156332,6 +158991,9 @@ type TransitGatewayRoute struct { // The attachments. TransitGatewayAttachments []*TransitGatewayRouteAttachment `locationName:"transitGatewayAttachments" locationNameList:"item" type:"list"` + // The ID of the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncementId *string `locationName:"transitGatewayRouteTableAnnouncementId" type:"string"` + // The route type. Type *string `locationName:"type" type:"string" enum:"TransitGatewayRouteType"` } @@ -156378,6 +159040,12 @@ func (s *TransitGatewayRoute) SetTransitGatewayAttachments(v []*TransitGatewayRo return s } +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *TransitGatewayRoute) SetTransitGatewayRouteTableAnnouncementId(v string) *TransitGatewayRoute { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + // SetType sets the Type field's value. func (s *TransitGatewayRoute) SetType(v string) *TransitGatewayRoute { s.Type = &v @@ -156522,6 +159190,128 @@ func (s *TransitGatewayRouteTable) SetTransitGatewayRouteTableId(v string) *Tran return s } +// Describes a transit gateway route table announcement. +type TransitGatewayRouteTableAnnouncement struct { + _ struct{} `type:"structure"` + + // The direction for the route table announcement. + AnnouncementDirection *string `locationName:"announcementDirection" type:"string" enum:"TransitGatewayRouteTableAnnouncementDirection"` + + // The ID of the core network for the transit gateway route table announcement. + CoreNetworkId *string `locationName:"coreNetworkId" type:"string"` + + // The timestamp when the transit gateway route table announcement was created. + CreationTime *time.Time `locationName:"creationTime" type:"timestamp"` + + // The ID of the core network ID for the peer. + PeerCoreNetworkId *string `locationName:"peerCoreNetworkId" type:"string"` + + // The ID of the peer transit gateway. + PeerTransitGatewayId *string `locationName:"peerTransitGatewayId" type:"string"` + + // The ID of the peering attachment. + PeeringAttachmentId *string `locationName:"peeringAttachmentId" type:"string"` + + // The state of the transit gateway announcement. + State *string `locationName:"state" type:"string" enum:"TransitGatewayRouteTableAnnouncementState"` + + // The key-value pairs associated with the route table announcement. + Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"` + + // The ID of the transit gateway. + TransitGatewayId *string `locationName:"transitGatewayId" type:"string"` + + // The ID of the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncementId *string `locationName:"transitGatewayRouteTableAnnouncementId" type:"string"` + + // The ID of the transit gateway route table. + TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"` +} + +// String returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayRouteTableAnnouncement) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation. +// +// API parameter values that are decorated as "sensitive" in the API will not +// be included in the string output. The member name will be present, but the +// value will be replaced with "sensitive". +func (s TransitGatewayRouteTableAnnouncement) GoString() string { + return s.String() +} + +// SetAnnouncementDirection sets the AnnouncementDirection field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetAnnouncementDirection(v string) *TransitGatewayRouteTableAnnouncement { + s.AnnouncementDirection = &v + return s +} + +// SetCoreNetworkId sets the CoreNetworkId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetCoreNetworkId(v string) *TransitGatewayRouteTableAnnouncement { + s.CoreNetworkId = &v + return s +} + +// SetCreationTime sets the CreationTime field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetCreationTime(v time.Time) *TransitGatewayRouteTableAnnouncement { + s.CreationTime = &v + return s +} + +// SetPeerCoreNetworkId sets the PeerCoreNetworkId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetPeerCoreNetworkId(v string) *TransitGatewayRouteTableAnnouncement { + s.PeerCoreNetworkId = &v + return s +} + +// SetPeerTransitGatewayId sets the PeerTransitGatewayId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetPeerTransitGatewayId(v string) *TransitGatewayRouteTableAnnouncement { + s.PeerTransitGatewayId = &v + return s +} + +// SetPeeringAttachmentId sets the PeeringAttachmentId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetPeeringAttachmentId(v string) *TransitGatewayRouteTableAnnouncement { + s.PeeringAttachmentId = &v + return s +} + +// SetState sets the State field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetState(v string) *TransitGatewayRouteTableAnnouncement { + s.State = &v + return s +} + +// SetTags sets the Tags field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetTags(v []*Tag) *TransitGatewayRouteTableAnnouncement { + s.Tags = v + return s +} + +// SetTransitGatewayId sets the TransitGatewayId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetTransitGatewayId(v string) *TransitGatewayRouteTableAnnouncement { + s.TransitGatewayId = &v + return s +} + +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetTransitGatewayRouteTableAnnouncementId(v string) *TransitGatewayRouteTableAnnouncement { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + +// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value. +func (s *TransitGatewayRouteTableAnnouncement) SetTransitGatewayRouteTableId(v string) *TransitGatewayRouteTableAnnouncement { + s.TransitGatewayRouteTableId = &v + return s +} + // Describes an association between a route table and a resource attachment. type TransitGatewayRouteTableAssociation struct { _ struct{} `type:"structure"` @@ -156596,6 +159386,9 @@ type TransitGatewayRouteTablePropagation struct { // The ID of the attachment. TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"` + + // The ID of the transit gateway route table announcement. + TransitGatewayRouteTableAnnouncementId *string `locationName:"transitGatewayRouteTableAnnouncementId" type:"string"` } // String returns the string representation. @@ -156640,6 +159433,12 @@ func (s *TransitGatewayRouteTablePropagation) SetTransitGatewayAttachmentId(v st return s } +// SetTransitGatewayRouteTableAnnouncementId sets the TransitGatewayRouteTableAnnouncementId field's value. +func (s *TransitGatewayRouteTablePropagation) SetTransitGatewayRouteTableAnnouncementId(v string) *TransitGatewayRouteTablePropagation { + s.TransitGatewayRouteTableAnnouncementId = &v + return s +} + // Describes a route in a transit gateway route table. type TransitGatewayRouteTableRoute struct { _ struct{} `type:"structure"` @@ -160363,6 +163162,14 @@ type VpnConnectionOptions struct { // The IPv6 CIDR on the customer gateway (on-premises) side of the VPN connection. LocalIpv6NetworkCidr *string `locationName:"localIpv6NetworkCidr" type:"string"` + // The type of IPv4 address assigned to the outside interface of the customer + // gateway. + // + // Valid values: PrivateIpv4 | PublicIpv4 + // + // Default: PublicIpv4 + OutsideIpAddressType *string `locationName:"outsideIpAddressType" type:"string"` + // The IPv4 CIDR on the Amazon Web Services side of the VPN connection. RemoteIpv4NetworkCidr *string `locationName:"remoteIpv4NetworkCidr" type:"string"` @@ -160373,6 +163180,9 @@ type VpnConnectionOptions struct { // must be used for devices that don't support BGP. StaticRoutesOnly *bool `locationName:"staticRoutesOnly" type:"boolean"` + // The transit gateway attachment ID in use for the VPN tunnel. + TransportTransitGatewayAttachmentId *string `locationName:"transportTransitGatewayAttachmentId" type:"string"` + // Indicates whether the VPN tunnels process IPv4 or IPv6 traffic. TunnelInsideIpVersion *string `locationName:"tunnelInsideIpVersion" type:"string" enum:"TunnelInsideIpVersion"` @@ -160416,6 +163226,12 @@ func (s *VpnConnectionOptions) SetLocalIpv6NetworkCidr(v string) *VpnConnectionO return s } +// SetOutsideIpAddressType sets the OutsideIpAddressType field's value. +func (s *VpnConnectionOptions) SetOutsideIpAddressType(v string) *VpnConnectionOptions { + s.OutsideIpAddressType = &v + return s +} + // SetRemoteIpv4NetworkCidr sets the RemoteIpv4NetworkCidr field's value. func (s *VpnConnectionOptions) SetRemoteIpv4NetworkCidr(v string) *VpnConnectionOptions { s.RemoteIpv4NetworkCidr = &v @@ -160434,6 +163250,12 @@ func (s *VpnConnectionOptions) SetStaticRoutesOnly(v bool) *VpnConnectionOptions return s } +// SetTransportTransitGatewayAttachmentId sets the TransportTransitGatewayAttachmentId field's value. +func (s *VpnConnectionOptions) SetTransportTransitGatewayAttachmentId(v string) *VpnConnectionOptions { + s.TransportTransitGatewayAttachmentId = &v + return s +} + // SetTunnelInsideIpVersion sets the TunnelInsideIpVersion field's value. func (s *VpnConnectionOptions) SetTunnelInsideIpVersion(v string) *VpnConnectionOptions { s.TunnelInsideIpVersion = &v @@ -160465,6 +163287,14 @@ type VpnConnectionOptionsSpecification struct { // Default: ::/0 LocalIpv6NetworkCidr *string `type:"string"` + // The type of IPv4 address assigned to the outside interface of the customer + // gateway device. + // + // Valid values: PrivateIpv4 | PublicIpv4 + // + // Default: PublicIpv4 + OutsideIpAddressType *string `type:"string"` + // The IPv4 CIDR on the Amazon Web Services side of the VPN connection. // // Default: 0.0.0.0/0 @@ -160482,6 +163312,11 @@ type VpnConnectionOptionsSpecification struct { // Default: false StaticRoutesOnly *bool `locationName:"staticRoutesOnly" type:"boolean"` + // The transit gateway attachment ID to use for the VPN tunnel. + // + // Required if OutsideIpAddressType is set to PrivateIpv4. + TransportTransitGatewayAttachmentId *string `type:"string"` + // Indicate whether the VPN tunnels process IPv4 or IPv6 traffic. // // Default: ipv4 @@ -160527,6 +163362,12 @@ func (s *VpnConnectionOptionsSpecification) SetLocalIpv6NetworkCidr(v string) *V return s } +// SetOutsideIpAddressType sets the OutsideIpAddressType field's value. +func (s *VpnConnectionOptionsSpecification) SetOutsideIpAddressType(v string) *VpnConnectionOptionsSpecification { + s.OutsideIpAddressType = &v + return s +} + // SetRemoteIpv4NetworkCidr sets the RemoteIpv4NetworkCidr field's value. func (s *VpnConnectionOptionsSpecification) SetRemoteIpv4NetworkCidr(v string) *VpnConnectionOptionsSpecification { s.RemoteIpv4NetworkCidr = &v @@ -160545,6 +163386,12 @@ func (s *VpnConnectionOptionsSpecification) SetStaticRoutesOnly(v bool) *VpnConn return s } +// SetTransportTransitGatewayAttachmentId sets the TransportTransitGatewayAttachmentId field's value. +func (s *VpnConnectionOptionsSpecification) SetTransportTransitGatewayAttachmentId(v string) *VpnConnectionOptionsSpecification { + s.TransportTransitGatewayAttachmentId = &v + return s +} + // SetTunnelInsideIpVersion sets the TunnelInsideIpVersion field's value. func (s *VpnConnectionOptionsSpecification) SetTunnelInsideIpVersion(v string) *VpnConnectionOptionsSpecification { s.TunnelInsideIpVersion = &v @@ -162512,6 +165359,22 @@ func DomainType_Values() []string { } } +const ( + // DynamicRoutingValueEnable is a DynamicRoutingValue enum value + DynamicRoutingValueEnable = "enable" + + // DynamicRoutingValueDisable is a DynamicRoutingValue enum value + DynamicRoutingValueDisable = "disable" +) + +// DynamicRoutingValue_Values returns all elements of the DynamicRoutingValue enum +func DynamicRoutingValue_Values() []string { + return []string{ + DynamicRoutingValueEnable, + DynamicRoutingValueDisable, + } +} + const ( // EbsEncryptionSupportUnsupported is a EbsEncryptionSupport enum value EbsEncryptionSupportUnsupported = "unsupported" @@ -163049,6 +165912,12 @@ const ( // FlowLogsResourceTypeNetworkInterface is a FlowLogsResourceType enum value FlowLogsResourceTypeNetworkInterface = "NetworkInterface" + + // FlowLogsResourceTypeTransitGateway is a FlowLogsResourceType enum value + FlowLogsResourceTypeTransitGateway = "TransitGateway" + + // FlowLogsResourceTypeTransitGatewayAttachment is a FlowLogsResourceType enum value + FlowLogsResourceTypeTransitGatewayAttachment = "TransitGatewayAttachment" ) // FlowLogsResourceType_Values returns all elements of the FlowLogsResourceType enum @@ -163057,6 +165926,8 @@ func FlowLogsResourceType_Values() []string { FlowLogsResourceTypeVpc, FlowLogsResourceTypeSubnet, FlowLogsResourceTypeNetworkInterface, + FlowLogsResourceTypeTransitGateway, + FlowLogsResourceTypeTransitGatewayAttachment, } } @@ -165271,6 +168142,9 @@ const ( // InstanceTypeC7g16xlarge is a InstanceType enum value InstanceTypeC7g16xlarge = "c7g.16xlarge" + + // InstanceTypeMac2Metal is a InstanceType enum value + InstanceTypeMac2Metal = "mac2.metal" ) // InstanceType_Values returns all elements of the InstanceType enum @@ -165801,6 +168675,7 @@ func InstanceType_Values() []string { InstanceTypeC7g8xlarge, InstanceTypeC7g12xlarge, InstanceTypeC7g16xlarge, + InstanceTypeMac2Metal, } } @@ -167662,9 +170537,15 @@ const ( // ResourceTypeTransitGatewayMulticastDomain is a ResourceType enum value ResourceTypeTransitGatewayMulticastDomain = "transit-gateway-multicast-domain" + // ResourceTypeTransitGatewayPolicyTable is a ResourceType enum value + ResourceTypeTransitGatewayPolicyTable = "transit-gateway-policy-table" + // ResourceTypeTransitGatewayRouteTable is a ResourceType enum value ResourceTypeTransitGatewayRouteTable = "transit-gateway-route-table" + // ResourceTypeTransitGatewayRouteTableAnnouncement is a ResourceType enum value + ResourceTypeTransitGatewayRouteTableAnnouncement = "transit-gateway-route-table-announcement" + // ResourceTypeVolume is a ResourceType enum value ResourceTypeVolume = "volume" @@ -167752,7 +170633,9 @@ func ResourceType_Values() []string { ResourceTypeTransitGatewayAttachment, ResourceTypeTransitGatewayConnectPeer, ResourceTypeTransitGatewayMulticastDomain, + ResourceTypeTransitGatewayPolicyTable, ResourceTypeTransitGatewayRouteTable, + ResourceTypeTransitGatewayRouteTableAnnouncement, ResourceTypeVolume, ResourceTypeVpc, ResourceTypeVpcEndpoint, @@ -168104,6 +170987,22 @@ func SpotInstanceType_Values() []string { } } +const ( + // SpreadLevelHost is a SpreadLevel enum value + SpreadLevelHost = "host" + + // SpreadLevelRack is a SpreadLevel enum value + SpreadLevelRack = "rack" +) + +// SpreadLevel_Values returns all elements of the SpreadLevel enum +func SpreadLevel_Values() []string { + return []string{ + SpreadLevelHost, + SpreadLevelRack, + } +} + const ( // StatePendingAcceptance is a State enum value StatePendingAcceptance = "PendingAcceptance" @@ -168776,6 +171675,30 @@ func TransitGatewayMulticastDomainState_Values() []string { } } +const ( + // TransitGatewayPolicyTableStatePending is a TransitGatewayPolicyTableState enum value + TransitGatewayPolicyTableStatePending = "pending" + + // TransitGatewayPolicyTableStateAvailable is a TransitGatewayPolicyTableState enum value + TransitGatewayPolicyTableStateAvailable = "available" + + // TransitGatewayPolicyTableStateDeleting is a TransitGatewayPolicyTableState enum value + TransitGatewayPolicyTableStateDeleting = "deleting" + + // TransitGatewayPolicyTableStateDeleted is a TransitGatewayPolicyTableState enum value + TransitGatewayPolicyTableStateDeleted = "deleted" +) + +// TransitGatewayPolicyTableState_Values returns all elements of the TransitGatewayPolicyTableState enum +func TransitGatewayPolicyTableState_Values() []string { + return []string{ + TransitGatewayPolicyTableStatePending, + TransitGatewayPolicyTableStateAvailable, + TransitGatewayPolicyTableStateDeleting, + TransitGatewayPolicyTableStateDeleted, + } +} + const ( // TransitGatewayPrefixListReferenceStatePending is a TransitGatewayPrefixListReferenceState enum value TransitGatewayPrefixListReferenceStatePending = "pending" @@ -168852,6 +171775,54 @@ func TransitGatewayRouteState_Values() []string { } } +const ( + // TransitGatewayRouteTableAnnouncementDirectionOutgoing is a TransitGatewayRouteTableAnnouncementDirection enum value + TransitGatewayRouteTableAnnouncementDirectionOutgoing = "outgoing" + + // TransitGatewayRouteTableAnnouncementDirectionIncoming is a TransitGatewayRouteTableAnnouncementDirection enum value + TransitGatewayRouteTableAnnouncementDirectionIncoming = "incoming" +) + +// TransitGatewayRouteTableAnnouncementDirection_Values returns all elements of the TransitGatewayRouteTableAnnouncementDirection enum +func TransitGatewayRouteTableAnnouncementDirection_Values() []string { + return []string{ + TransitGatewayRouteTableAnnouncementDirectionOutgoing, + TransitGatewayRouteTableAnnouncementDirectionIncoming, + } +} + +const ( + // TransitGatewayRouteTableAnnouncementStateAvailable is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStateAvailable = "available" + + // TransitGatewayRouteTableAnnouncementStatePending is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStatePending = "pending" + + // TransitGatewayRouteTableAnnouncementStateFailing is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStateFailing = "failing" + + // TransitGatewayRouteTableAnnouncementStateFailed is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStateFailed = "failed" + + // TransitGatewayRouteTableAnnouncementStateDeleting is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStateDeleting = "deleting" + + // TransitGatewayRouteTableAnnouncementStateDeleted is a TransitGatewayRouteTableAnnouncementState enum value + TransitGatewayRouteTableAnnouncementStateDeleted = "deleted" +) + +// TransitGatewayRouteTableAnnouncementState_Values returns all elements of the TransitGatewayRouteTableAnnouncementState enum +func TransitGatewayRouteTableAnnouncementState_Values() []string { + return []string{ + TransitGatewayRouteTableAnnouncementStateAvailable, + TransitGatewayRouteTableAnnouncementStatePending, + TransitGatewayRouteTableAnnouncementStateFailing, + TransitGatewayRouteTableAnnouncementStateFailed, + TransitGatewayRouteTableAnnouncementStateDeleting, + TransitGatewayRouteTableAnnouncementStateDeleted, + } +} + const ( // TransitGatewayRouteTableStatePending is a TransitGatewayRouteTableState enum value TransitGatewayRouteTableStatePending = "pending" diff --git a/vendor/github.com/aws/aws-sdk-go/service/kms/api.go b/vendor/github.com/aws/aws-sdk-go/service/kms/api.go index 079f14714..9a5776c09 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/kms/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/kms/api.go @@ -534,7 +534,7 @@ func (c *KMS) CreateCustomKeyStoreRequest(input *CreateCustomKeyStoreInput) (req // that is associated with an CloudHSM cluster (https://docs.aws.amazon.com/cloudhsm/latest/userguide/clusters.html) // that you own and manage. // -// This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) +// This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. // @@ -894,7 +894,8 @@ func (c *KMS) CreateKeyRequest(input *CreateKeyInput) (req *request.Request, out // To create a symmetric encryption KMS key, you aren't required to specify // any parameters. The default value for KeySpec, SYMMETRIC_DEFAULT, and the // default value for KeyUsage, ENCRYPT_DECRYPT, create a symmetric encryption -// KMS key. +// KMS key. For technical details, see SYMMETRIC_DEFAULT key spec (https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-symmetric-default) +// in the Key Management Service Developer Guide. // // If you need a key for basic encryption and decryption or you are creating // a KMS key to protect your resources in an Amazon Web Services service, create @@ -911,13 +912,14 @@ func (c *KMS) CreateKeyRequest(input *CreateKeyInput) (req *request.Request, out // determine whether the KMS key will be used to encrypt and decrypt or sign // and verify. You can't change these properties after the KMS key is created. // -// Asymmetric KMS keys contain an RSA key pair or an Elliptic Curve (ECC) key -// pair. The private key in an asymmetric KMS key never leaves KMS unencrypted. -// However, you can use the GetPublicKey operation to download the public key -// so it can be used outside of KMS. KMS keys with RSA key pairs can be used -// to encrypt or decrypt data or sign and verify messages (but not both). KMS -// keys with ECC key pairs can be used only to sign and verify messages. For -// information about asymmetric KMS keys, see Asymmetric KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html) +// Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, +// or an SM2 key pair (China Regions only). The private key in an asymmetric +// KMS key never leaves KMS unencrypted. However, you can use the GetPublicKey +// operation to download the public key so it can be used outside of KMS. KMS +// keys with RSA or SM2 key pairs can be used to encrypt or decrypt data or +// sign and verify messages (but not both). KMS keys with ECC key pairs can +// be used only to sign and verify messages. For information about asymmetric +// KMS keys, see Asymmetric KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html) // in the Key Management Service Developer Guide. // // HMAC KMS key @@ -1516,7 +1518,7 @@ func (c *KMS) DeleteCustomKeyStoreRequest(input *DeleteCustomKeyStoreInput) (req // This operation does not delete the CloudHSM cluster that is associated with // the custom key store, or affect any users or keys in the cluster. // -// The custom key store that you delete cannot contain any KMS KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys). +// The custom key store that you delete cannot contain any KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys). // Before deleting the key store, verify that you will never need to use any // of the KMS keys in the key store for any cryptographic operations (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations). // Then, use ScheduleKeyDeletion to delete the KMS keys from the key store. @@ -1536,7 +1538,7 @@ func (c *KMS) DeleteCustomKeyStoreRequest(input *DeleteCustomKeyStoreInput) (req // // If the operation succeeds, it returns a JSON object with no properties. // -// This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) +// This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. // @@ -1783,6 +1785,12 @@ func (c *KMS) DescribeCustomKeyStoresRequest(input *DescribeCustomKeyStoresInput Name: opDescribeCustomKeyStores, HTTPMethod: "POST", HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"Marker"}, + OutputTokens: []string{"NextMarker"}, + LimitToken: "Limit", + TruncationToken: "Truncated", + }, } if input == nil { @@ -1799,7 +1807,7 @@ func (c *KMS) DescribeCustomKeyStoresRequest(input *DescribeCustomKeyStoresInput // Gets information about custom key stores (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // in the account and Region. // -// This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) +// This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. // @@ -1884,6 +1892,58 @@ func (c *KMS) DescribeCustomKeyStoresWithContext(ctx aws.Context, input *Describ return out, req.Send() } +// DescribeCustomKeyStoresPages iterates over the pages of a DescribeCustomKeyStores operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See DescribeCustomKeyStores method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a DescribeCustomKeyStores operation. +// pageNum := 0 +// err := client.DescribeCustomKeyStoresPages(params, +// func(page *kms.DescribeCustomKeyStoresOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *KMS) DescribeCustomKeyStoresPages(input *DescribeCustomKeyStoresInput, fn func(*DescribeCustomKeyStoresOutput, bool) bool) error { + return c.DescribeCustomKeyStoresPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// DescribeCustomKeyStoresPagesWithContext same as DescribeCustomKeyStoresPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *KMS) DescribeCustomKeyStoresPagesWithContext(ctx aws.Context, input *DescribeCustomKeyStoresInput, fn func(*DescribeCustomKeyStoresOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *DescribeCustomKeyStoresInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.DescribeCustomKeyStoresRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*DescribeCustomKeyStoresOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opDescribeKey = "DescribeKey" // DescribeKeyRequest generates a "aws/request.Request" representing the @@ -1950,7 +2010,7 @@ func (c *KMS) DescribeKeyRequest(input *DescribeKeyInput) (req *request.Request, // information, use GetKeyRotationStatus. Also, some key states prevent a // KMS key from being automatically rotated. For details, see How Automatic // Key Rotation Works (https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#rotate-keys-how-it-works) -// in Key Management Service Developer Guide. +// in the Key Management Service Developer Guide. // // * Tags on the KMS key. To get this information, use ListResourceTags. // @@ -2356,7 +2416,7 @@ func (c *KMS) DisconnectCustomKeyStoreRequest(input *DisconnectCustomKeyStoreInp // // If the operation succeeds, it returns a JSON object with no properties. // -// This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) +// This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. // @@ -2774,7 +2834,7 @@ func (c *KMS) EncryptRequest(input *EncryptInput) (req *request.Request, output // in the Key Management Service Developer Guide. // // If you specify an asymmetric KMS key, you must also specify the encryption -// algorithm. The algorithm must be compatible with the KMS key type. +// algorithm. The algorithm must be compatible with the KMS key spec. // // When you use an asymmetric KMS key to encrypt or reencrypt data, be sure // to record the KMS key and encryption algorithm that you choose. You will @@ -2799,6 +2859,8 @@ func (c *KMS) EncryptRequest(input *EncryptInput) (req *request.Request, output // // * RSA_4096 RSAES_OAEP_SHA_1: 470 bytes RSAES_OAEP_SHA_256: 446 bytes // +// * SM2PKE: 1024 bytes (China Regions only) +// // The KMS key that you use for this operation must be in a compatible key state. // For details, see Key states of KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) // in the Key Management Service Developer Guide. @@ -2949,10 +3011,15 @@ func (c *KMS) GenerateDataKeyRequest(input *GenerateDataKeyInput) (req *request. // To generate a data key, specify the symmetric encryption KMS key that will // be used to encrypt the data key. You cannot use an asymmetric KMS key to // encrypt data keys. To get the type of your KMS key, use the DescribeKey operation. +// // You must also specify the length of the data key. Use either the KeySpec // or NumberOfBytes parameters (but not both). For 128-bit and 256-bit data // keys, use the KeySpec parameter. // +// To generate an SM4 data key (China Regions only), specify a KeySpec value +// of AES_128 or NumberOfBytes value of 128. The symmetric encryption key used +// in China Regions to encrypt your data key is an SM4 encryption key. +// // To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. // To generate an asymmetric data key pair, use the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext // operation. To get a cryptographically secure random byte string, use GenerateRandom. @@ -3160,9 +3227,10 @@ func (c *KMS) GenerateDataKeyPairRequest(input *GenerateDataKeyPairInput) (req * // your KMS key, use the DescribeKey operation. // // Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data -// key pair. KMS recommends that your use ECC key pairs for signing, and use -// RSA key pairs for either encryption or signing, but not both. However, KMS -// cannot enforce any restrictions on the use of data key pairs outside of KMS. +// key pair. In China Regions, you can also choose an SM2 data key pair. KMS +// recommends that you use ECC key pairs for signing, and use RSA and SM2 key +// pairs for either encryption or signing, but not both. However, KMS cannot +// enforce any restrictions on the use of data key pairs outside of KMS. // // If you are using the data key pair to encrypt data, or for any operation // where you don't immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext @@ -3352,9 +3420,10 @@ func (c *KMS) GenerateDataKeyPairWithoutPlaintextRequest(input *GenerateDataKeyP // your KMS key, use the DescribeKey operation. // // Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data -// key pair. KMS recommends that your use ECC key pairs for signing, and use -// RSA key pairs for either encryption or signing, but not both. However, KMS -// cannot enforce any restrictions on the use of data key pairs outside of KMS. +// key pair. In China Regions, you can also choose an SM2 data key pair. KMS +// recommends that you use ECC key pairs for signing, and use RSA and SM2 key +// pairs for either encryption or signing, but not both. However, KMS cannot +// enforce any restrictions on the use of data key pairs outside of KMS. // // GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each // request. The bytes in the key are not related to the caller or KMS key that @@ -3849,6 +3918,9 @@ func (c *KMS) GenerateRandomRequest(input *GenerateRandomInput) (req *request.Re // // Returns a random byte string that is cryptographically secure. // +// You must use the NumberOfBytes parameter to specify the length of the random +// byte string. There is no default value for string length. +// // By default, the random byte string is generated in KMS. To generate the byte // string in the CloudHSM cluster that is associated with a custom key store // (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html), @@ -3863,6 +3935,9 @@ func (c *KMS) GenerateRandomRequest(input *GenerateRandomInput) (req *request.Re // For more information about entropy and random number generation, see Key // Management Service Cryptographic Details (https://docs.aws.amazon.com/kms/latest/cryptographic-details/). // +// Cross-account use: Not applicable. GenerateRandom does not use any account-specific +// resources, such as KMS keys. +// // Required permissions: kms:GenerateRandom (https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html) // (IAM policy) // @@ -4393,7 +4468,11 @@ func (c *KMS) GetPublicKeyRequest(input *GetPublicKeyInput) (req *request.Reques // KMS, you benefit from the authentication, authorization, and logging that // are part of every KMS operation. You also reduce of risk of encrypting data // that cannot be decrypted. These features are not effective outside of KMS. -// For details, see Special Considerations for Downloading Public Keys (https://docs.aws.amazon.com/kms/latest/developerguide/download-public-key.html#download-public-key-considerations). +// +// To verify a signature outside of KMS with an SM2 public key (China Regions +// only), you must specify the distinguishing ID. By default, KMS uses 1234567812345678 +// as the distinguishing ID. For more information, see Offline verification +// with SM2 key pairs (https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-sm-offline-verification). // // To help you use the public key safely outside of KMS, GetPublicKey returns // important information about the public key in the response, including: @@ -5450,6 +5529,12 @@ func (c *KMS) ListResourceTagsRequest(input *ListResourceTagsInput) (req *reques Name: opListResourceTags, HTTPMethod: "POST", HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"Marker"}, + OutputTokens: []string{"NextMarker"}, + LimitToken: "Limit", + TruncationToken: "Truncated", + }, } if input == nil { @@ -5532,6 +5617,58 @@ func (c *KMS) ListResourceTagsWithContext(ctx aws.Context, input *ListResourceTa return out, req.Send() } +// ListResourceTagsPages iterates over the pages of a ListResourceTags operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See ListResourceTags method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a ListResourceTags operation. +// pageNum := 0 +// err := client.ListResourceTagsPages(params, +// func(page *kms.ListResourceTagsOutput, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *KMS) ListResourceTagsPages(input *ListResourceTagsInput, fn func(*ListResourceTagsOutput, bool) bool) error { + return c.ListResourceTagsPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// ListResourceTagsPagesWithContext same as ListResourceTagsPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *KMS) ListResourceTagsPagesWithContext(ctx aws.Context, input *ListResourceTagsInput, fn func(*ListResourceTagsOutput, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *ListResourceTagsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.ListResourceTagsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*ListResourceTagsOutput), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opListRetirableGrants = "ListRetirableGrants" // ListRetirableGrantsRequest generates a "aws/request.Request" representing the @@ -5563,6 +5700,12 @@ func (c *KMS) ListRetirableGrantsRequest(input *ListRetirableGrantsInput) (req * Name: opListRetirableGrants, HTTPMethod: "POST", HTTPPath: "/", + Paginator: &request.Paginator{ + InputTokens: []string{"Marker"}, + OutputTokens: []string{"NextMarker"}, + LimitToken: "Limit", + TruncationToken: "Truncated", + }, } if input == nil { @@ -5659,6 +5802,58 @@ func (c *KMS) ListRetirableGrantsWithContext(ctx aws.Context, input *ListRetirab return out, req.Send() } +// ListRetirableGrantsPages iterates over the pages of a ListRetirableGrants operation, +// calling the "fn" function with the response data for each page. To stop +// iterating, return false from the fn function. +// +// See ListRetirableGrants method for more information on how to use this operation. +// +// Note: This operation can generate multiple requests to a service. +// +// // Example iterating over at most 3 pages of a ListRetirableGrants operation. +// pageNum := 0 +// err := client.ListRetirableGrantsPages(params, +// func(page *kms.ListGrantsResponse, lastPage bool) bool { +// pageNum++ +// fmt.Println(page) +// return pageNum <= 3 +// }) +// +func (c *KMS) ListRetirableGrantsPages(input *ListRetirableGrantsInput, fn func(*ListGrantsResponse, bool) bool) error { + return c.ListRetirableGrantsPagesWithContext(aws.BackgroundContext(), input, fn) +} + +// ListRetirableGrantsPagesWithContext same as ListRetirableGrantsPages except +// it takes a Context and allows setting request options on the pages. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *KMS) ListRetirableGrantsPagesWithContext(ctx aws.Context, input *ListRetirableGrantsInput, fn func(*ListGrantsResponse, bool) bool, opts ...request.Option) error { + p := request.Pagination{ + NewRequest: func() (*request.Request, error) { + var inCpy *ListRetirableGrantsInput + if input != nil { + tmp := *input + inCpy = &tmp + } + req, _ := c.ListRetirableGrantsRequest(inCpy) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return req, nil + }, + } + + for p.Next() { + if !fn(p.Page().(*ListGrantsResponse), !p.HasNextPage()) { + break + } + } + + return p.Err() +} + const opPutKeyPolicy = "PutKeyPolicy" // PutKeyPolicyRequest generates a "aws/request.Request" representing the @@ -7321,7 +7516,7 @@ func (c *KMS) UpdateCustomKeyStoreRequest(input *UpdateCustomKeyStoreInput) (req // // If the operation succeeds, it returns a JSON object with no properties. // -// This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) +// This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. // @@ -7817,11 +8012,15 @@ func (c *KMS) VerifyRequest(input *VerifyInput) (req *request.Request, output *V // You can also verify the digital signature by using the public key of the // KMS key outside of KMS. Use the GetPublicKey operation to download the public // key in the asymmetric KMS key and then use the public key to verify the signature -// outside of KMS. The advantage of using the Verify operation is that it is -// performed within KMS. As a result, it's easy to call, the operation is performed -// within the FIPS boundary, it is logged in CloudTrail, and you can use key -// policy and IAM policy to determine who is authorized to use the KMS key to -// verify signatures. +// outside of KMS. To verify a signature outside of KMS with an SM2 public key, +// you must specify the distinguishing ID. By default, KMS uses 1234567812345678 +// as the distinguishing ID. For more information, see Offline verification +// with SM2 key pairs (https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-sm-offline-verification) +// in Key Management Service Developer Guide. The advantage of using the Verify +// operation is that it is performed within KMS. As a result, it's easy to call, +// the operation is performed within the FIPS boundary, it is logged in CloudTrail, +// and you can use key policy and IAM policy to determine who is authorized +// to use the KMS key to verify signatures. // // The KMS key that you use for this operation must be in a compatible key state. // For details, see Key states of KMS keys (https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) @@ -8854,9 +9053,7 @@ type CreateCustomKeyStoreInput struct { // ID of any active CloudHSM cluster that is not already associated with a custom // key store. To find the cluster ID, use the DescribeClusters (https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html) // operation. - // - // CloudHsmClusterId is a required field - CloudHsmClusterId *string `min:"19" type:"string" required:"true"` + CloudHsmClusterId *string `min:"19" type:"string"` // Specifies a friendly name for the custom key store. The name must be unique // in your Amazon Web Services account. @@ -8876,16 +9073,12 @@ type CreateCustomKeyStoreInput struct { // KeyStorePassword is a sensitive parameter and its value will be // replaced with "sensitive" in string returned by CreateCustomKeyStoreInput's // String and GoString methods. - // - // KeyStorePassword is a required field - KeyStorePassword *string `min:"7" type:"string" required:"true" sensitive:"true"` + KeyStorePassword *string `min:"7" type:"string" sensitive:"true"` // Enter the content of the trust anchor certificate for the cluster. This is // the content of the customerCA.crt file that you created when you initialized // the cluster (https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html). - // - // TrustAnchorCertificate is a required field - TrustAnchorCertificate *string `min:"1" type:"string" required:"true"` + TrustAnchorCertificate *string `min:"1" type:"string"` } // String returns the string representation. @@ -8909,9 +9102,6 @@ func (s CreateCustomKeyStoreInput) GoString() string { // Validate inspects the fields of the type to determine if they are valid. func (s *CreateCustomKeyStoreInput) Validate() error { invalidParams := request.ErrInvalidParams{Context: "CreateCustomKeyStoreInput"} - if s.CloudHsmClusterId == nil { - invalidParams.Add(request.NewErrParamRequired("CloudHsmClusterId")) - } if s.CloudHsmClusterId != nil && len(*s.CloudHsmClusterId) < 19 { invalidParams.Add(request.NewErrParamMinLen("CloudHsmClusterId", 19)) } @@ -8921,15 +9111,9 @@ func (s *CreateCustomKeyStoreInput) Validate() error { if s.CustomKeyStoreName != nil && len(*s.CustomKeyStoreName) < 1 { invalidParams.Add(request.NewErrParamMinLen("CustomKeyStoreName", 1)) } - if s.KeyStorePassword == nil { - invalidParams.Add(request.NewErrParamRequired("KeyStorePassword")) - } if s.KeyStorePassword != nil && len(*s.KeyStorePassword) < 7 { invalidParams.Add(request.NewErrParamMinLen("KeyStorePassword", 7)) } - if s.TrustAnchorCertificate == nil { - invalidParams.Add(request.NewErrParamRequired("TrustAnchorCertificate")) - } if s.TrustAnchorCertificate != nil && len(*s.TrustAnchorCertificate) < 1 { invalidParams.Add(request.NewErrParamMinLen("TrustAnchorCertificate", 1)) } @@ -9284,7 +9468,7 @@ type CreateKeyInput struct { // The response includes the custom key store ID and the ID of the CloudHSM // cluster. // - // This operation is part of the Custom Key Store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) + // This operation is part of the custom key store feature (https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) // feature in KMS, which combines the convenience and extensive integration // of KMS with the isolation and control of a single-tenant key store. CustomKeyStoreId *string `min:"1" type:"string"` @@ -9307,9 +9491,10 @@ type CreateKeyInput struct { Description *string `type:"string"` // Specifies the type of KMS key to create. The default value, SYMMETRIC_DEFAULT, - // creates a KMS key with a 256-bit symmetric key for encryption and decryption. - // For help choosing a key spec for your KMS key, see Choosing a KMS key type - // (https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html#symm-asymm-choose) + // creates a KMS key with a 256-bit AES-GCM key that is used for encryption + // and decryption, except in China Regions, where it creates a 128-bit symmetric + // key that uses SM4 encryption. For help choosing a key spec for your KMS key, + // see Choosing a KMS key type (https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html#symm-asymm-choose) // in the Key Management Service Developer Guide . // // The KeySpec determines whether the KMS key contains a symmetric key or an @@ -9328,7 +9513,7 @@ type CreateKeyInput struct { // // KMS supports the following key specs for KMS keys: // - // * Symmetric encryption key (default) SYMMETRIC_DEFAULT (AES-256-GCM) + // * Symmetric encryption key (default) SYMMETRIC_DEFAULT // // * HMAC keys (symmetric) HMAC_224 HMAC_256 HMAC_384 HMAC_512 // @@ -9339,6 +9524,8 @@ type CreateKeyInput struct { // // * Other asymmetric elliptic curve key pairs ECC_SECG_P256K1 (secp256k1), // commonly used for cryptocurrencies. + // + // * SM2 key pairs (China Regions only) SM2 KeySpec *string `type:"string" enum:"KeySpec"` // Determines the cryptographic operations (https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations) @@ -9357,6 +9544,9 @@ type CreateKeyInput struct { // or SIGN_VERIFY. // // * For asymmetric KMS keys with ECC key material, specify SIGN_VERIFY. + // + // * For asymmetric KMS keys with SM2 key material (China Regions only), + // specify ENCRYPT_DECRYPT or SIGN_VERIFY. KeyUsage *string `type:"string" enum:"KeyUsageType"` // Creates a multi-Region primary key that you can replicate into other Amazon @@ -9423,21 +9613,20 @@ type CreateKeyInput struct { // visible (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency) // in the Amazon Web Services Identity and Access Management User Guide. // - // A key policy document must conform to the following rules. + // A key policy document can include only the following characters: // - // * Up to 32 kilobytes (32768 bytes) + // * Printable ASCII characters from the space character (\u0020) through + // the end of the ASCII character range. // - // * Must be UTF-8 encoded + // * Printable characters in the Basic Latin and Latin-1 Supplement character + // set (through \u00FF). // - // * The only Unicode characters that are permitted in a key policy document - // are the horizontal tab (U+0009), linefeed (U+000A), carriage return (U+000D), - // and characters in the range U+0020 to U+00FF. + // * The tab (\u0009), line feed (\u000A), and carriage return (\u000D) special + // characters // - // * The Sid element in a key policy statement can include spaces. (Spaces - // are prohibited in the Sid element of an IAM policy document.) - // - // For help writing and formatting a JSON policy document, see the IAM JSON - // Policy Reference (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html) + // For information about key policies, see Key policies in KMS (https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) + // in the Key Management Service Developer Guide. For help writing and formatting + // a JSON policy document, see the IAM JSON Policy Reference (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html) // in the Identity and Access Management User Guide . Policy *string `min:"1" type:"string"` @@ -11777,10 +11966,12 @@ type GenerateDataKeyPairInput struct { // Determines the type of data key pair that is generated. // - // The KMS rule that restricts the use of asymmetric RSA KMS keys to encrypt - // and decrypt or to sign and verify (but not both), and the rule that permits - // you to use ECC KMS keys only to sign and verify, are not effective on data - // key pairs, which are used outside of KMS. + // The KMS rule that restricts the use of asymmetric RSA and SM2 KMS keys to + // encrypt and decrypt or to sign and verify (but not both), and the rule that + // permits you to use ECC KMS keys only to sign and verify, are not effective + // on data key pairs, which are used outside of KMS. The SM2 key spec is only + // available in China Regions. RSA and ECC asymmetric key pairs are also available + // in China Regions. // // KeyPairSpec is a required field KeyPairSpec *string `type:"string" required:"true" enum:"DataKeyPairSpec"` @@ -11981,10 +12172,12 @@ type GenerateDataKeyPairWithoutPlaintextInput struct { // Determines the type of data key pair that is generated. // - // The KMS rule that restricts the use of asymmetric RSA KMS keys to encrypt - // and decrypt or to sign and verify (but not both), and the rule that permits - // you to use ECC KMS keys only to sign and verify, are not effective on data - // key pairs, which are used outside of KMS. + // The KMS rule that restricts the use of asymmetric RSA and SM2 KMS keys to + // encrypt and decrypt or to sign and verify (but not both), and the rule that + // permits you to use ECC KMS keys only to sign and verify, are not effective + // on data key pairs, which are used outside of KMS. The SM2 key spec is only + // available in China Regions. RSA and ECC asymmetric key pairs are also available + // in China Regions. // // KeyPairSpec is a required field KeyPairSpec *string `type:"string" required:"true" enum:"DataKeyPairSpec"` @@ -12459,7 +12652,7 @@ type GenerateRandomInput struct { // To find the ID of a custom key store, use the DescribeCustomKeyStores operation. CustomKeyStoreId *string `min:"1" type:"string"` - // The length of the byte string. + // The length of the random byte string. This parameter is required. NumberOfBytes *int64 `min:"1" type:"integer"` } @@ -16010,18 +16203,21 @@ type PutKeyPolicyInput struct { // visible (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency) // in the Amazon Web Services Identity and Access Management User Guide. // - // A key policy document must conform to the following rules. + // A key policy document can include only the following characters: // - // * Up to 32 kilobytes (32768 bytes) + // * Printable ASCII characters from the space character (\u0020) through + // the end of the ASCII character range. // - // * Must be UTF-8 encoded + // * Printable characters in the Basic Latin and Latin-1 Supplement character + // set (through \u00FF). // - // * The only Unicode characters that are permitted in a key policy document - // are the horizontal tab (U+0009), linefeed (U+000A), carriage return (U+000D), - // and characters in the range U+0020 to U+00FF. + // * The tab (\u0009), line feed (\u000A), and carriage return (\u000D) special + // characters // - // * The Sid element in a key policy statement can include spaces. (Spaces - // are prohibited in the Sid element of an IAM policy document.) + // For information about key policies, see Key policies in KMS (https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) + // in the Key Management Service Developer Guide. For help writing and formatting + // a JSON policy document, see the IAM JSON Policy Reference (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html) + // in the Identity and Access Management User Guide . // // Policy is a required field Policy *string `min:"1" type:"string" required:"true"` @@ -16481,18 +16677,21 @@ type ReplicateKeyInput struct { // visible (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency) // in the Identity and Access Management User Guide . // - // A key policy document must conform to the following rules. + // A key policy document can include only the following characters: // - // * Up to 32 kilobytes (32768 bytes) + // * Printable ASCII characters from the space character (\u0020) through + // the end of the ASCII character range. // - // * Must be UTF-8 encoded + // * Printable characters in the Basic Latin and Latin-1 Supplement character + // set (through \u00FF). // - // * The only Unicode characters that are permitted in a key policy document - // are the horizontal tab (U+0009), linefeed (U+000A), carriage return (U+000D), - // and characters in the range U+0020 to U+00FF. + // * The tab (\u0009), line feed (\u000A), and carriage return (\u000D) special + // characters // - // * The Sid element in a key policy statement can include spaces. (Spaces - // are prohibited in the Sid element of an IAM policy document.) + // For information about key policies, see Key policies in KMS (https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) + // in the Key Management Service Developer Guide. For help writing and formatting + // a JSON policy document, see the IAM JSON Policy Reference (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html) + // in the Identity and Access Management User Guide . Policy *string `min:"1" type:"string"` // The Region ID of the Amazon Web Services Region for this replica key. @@ -18538,6 +18737,9 @@ const ( // ConnectionErrorCodeTypeSubnetNotFound is a ConnectionErrorCodeType enum value ConnectionErrorCodeTypeSubnetNotFound = "SUBNET_NOT_FOUND" + + // ConnectionErrorCodeTypeInsufficientFreeAddressesInSubnet is a ConnectionErrorCodeType enum value + ConnectionErrorCodeTypeInsufficientFreeAddressesInSubnet = "INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET" ) // ConnectionErrorCodeType_Values returns all elements of the ConnectionErrorCodeType enum @@ -18552,6 +18754,7 @@ func ConnectionErrorCodeType_Values() []string { ConnectionErrorCodeTypeUserNotFound, ConnectionErrorCodeTypeUserLoggedIn, ConnectionErrorCodeTypeSubnetNotFound, + ConnectionErrorCodeTypeInsufficientFreeAddressesInSubnet, } } @@ -18619,6 +18822,9 @@ const ( // CustomerMasterKeySpecHmac512 is a CustomerMasterKeySpec enum value CustomerMasterKeySpecHmac512 = "HMAC_512" + + // CustomerMasterKeySpecSm2 is a CustomerMasterKeySpec enum value + CustomerMasterKeySpecSm2 = "SM2" ) // CustomerMasterKeySpec_Values returns all elements of the CustomerMasterKeySpec enum @@ -18636,6 +18842,7 @@ func CustomerMasterKeySpec_Values() []string { CustomerMasterKeySpecHmac256, CustomerMasterKeySpecHmac384, CustomerMasterKeySpecHmac512, + CustomerMasterKeySpecSm2, } } @@ -18660,6 +18867,9 @@ const ( // DataKeyPairSpecEccSecgP256k1 is a DataKeyPairSpec enum value DataKeyPairSpecEccSecgP256k1 = "ECC_SECG_P256K1" + + // DataKeyPairSpecSm2 is a DataKeyPairSpec enum value + DataKeyPairSpecSm2 = "SM2" ) // DataKeyPairSpec_Values returns all elements of the DataKeyPairSpec enum @@ -18672,6 +18882,7 @@ func DataKeyPairSpec_Values() []string { DataKeyPairSpecEccNistP384, DataKeyPairSpecEccNistP521, DataKeyPairSpecEccSecgP256k1, + DataKeyPairSpecSm2, } } @@ -18700,6 +18911,9 @@ const ( // EncryptionAlgorithmSpecRsaesOaepSha256 is a EncryptionAlgorithmSpec enum value EncryptionAlgorithmSpecRsaesOaepSha256 = "RSAES_OAEP_SHA_256" + + // EncryptionAlgorithmSpecSm2pke is a EncryptionAlgorithmSpec enum value + EncryptionAlgorithmSpecSm2pke = "SM2PKE" ) // EncryptionAlgorithmSpec_Values returns all elements of the EncryptionAlgorithmSpec enum @@ -18708,6 +18922,7 @@ func EncryptionAlgorithmSpec_Values() []string { EncryptionAlgorithmSpecSymmetricDefault, EncryptionAlgorithmSpecRsaesOaepSha1, EncryptionAlgorithmSpecRsaesOaepSha256, + EncryptionAlgorithmSpecSm2pke, } } @@ -18851,6 +19066,9 @@ const ( // KeySpecHmac512 is a KeySpec enum value KeySpecHmac512 = "HMAC_512" + + // KeySpecSm2 is a KeySpec enum value + KeySpecSm2 = "SM2" ) // KeySpec_Values returns all elements of the KeySpec enum @@ -18868,6 +19086,7 @@ func KeySpec_Values() []string { KeySpecHmac256, KeySpecHmac384, KeySpecHmac512, + KeySpecSm2, } } @@ -19034,6 +19253,9 @@ const ( // SigningAlgorithmSpecEcdsaSha512 is a SigningAlgorithmSpec enum value SigningAlgorithmSpecEcdsaSha512 = "ECDSA_SHA_512" + + // SigningAlgorithmSpecSm2dsa is a SigningAlgorithmSpec enum value + SigningAlgorithmSpecSm2dsa = "SM2DSA" ) // SigningAlgorithmSpec_Values returns all elements of the SigningAlgorithmSpec enum @@ -19048,6 +19270,7 @@ func SigningAlgorithmSpec_Values() []string { SigningAlgorithmSpecEcdsaSha256, SigningAlgorithmSpecEcdsaSha384, SigningAlgorithmSpecEcdsaSha512, + SigningAlgorithmSpecSm2dsa, } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 79f671b00..be7ca4dd0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -14,7 +14,7 @@ github.com/armon/go-metrics # github.com/armon/go-radix v1.0.0 ## explicit github.com/armon/go-radix -# github.com/aws/aws-sdk-go v1.44.28 +# github.com/aws/aws-sdk-go v1.44.62 ## explicit; go 1.11 github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/awserr From f4d6e51c4bac478e5967c0430e01dfcc07523a86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:03:43 +0000 Subject: [PATCH 21/37] rebase: bump k8s.io/kubernetes from 1.24.2 to 1.24.3 Bumps [k8s.io/kubernetes](https://github.com/kubernetes/kubernetes) from 1.24.2 to 1.24.3. - [Release notes](https://github.com/kubernetes/kubernetes/releases) - [Commits](https://github.com/kubernetes/kubernetes/compare/v1.24.2...v1.24.3) --- updated-dependencies: - dependency-name: k8s.io/kubernetes dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: Madhu Rajanna --- go.mod | 68 ++++++++++++++++++++--------------------- go.sum | 41 +++++++++++++++++++++++-- vendor/modules.txt | 76 +++++++++++++++++++++++----------------------- 3 files changed, 111 insertions(+), 74 deletions(-) diff --git a/go.mod b/go.mod index 67c909b7b..bdc95631e 100644 --- a/go.mod +++ b/go.mod @@ -28,16 +28,16 @@ require ( golang.org/x/sys v0.0.0-20220209214540-3681064d5158 google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.28.0 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 + k8s.io/api v0.24.3 + k8s.io/apimachinery v0.24.3 k8s.io/client-go v12.0.0+incompatible - k8s.io/cloud-provider v0.24.2 + k8s.io/cloud-provider v0.24.3 k8s.io/klog/v2 v2.70.1 // // when updating k8s.io/kubernetes, make sure to update the replace section too // - k8s.io/kubernetes v1.24.2 - k8s.io/mount-utils v0.24.2 + k8s.io/kubernetes v1.24.3 + k8s.io/mount-utils v0.24.3 k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2 ) @@ -152,10 +152,10 @@ require ( gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.23.0 // indirect - k8s.io/apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/component-helpers v0.24.2 // indirect + k8s.io/apiextensions-apiserver v0.24.3 // indirect + k8s.io/apiserver v0.24.3 // indirect + k8s.io/component-base v0.24.3 // indirect + k8s.io/component-helpers v0.24.3 // indirect k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect k8s.io/kubectl v0.0.0 // indirect k8s.io/kubelet v0.0.0 // indirect @@ -175,31 +175,31 @@ replace ( // // k8s.io/kubernetes depends on these k8s.io packages, but unversioned // - k8s.io/api => k8s.io/api v0.24.2 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.2 - k8s.io/apimachinery => k8s.io/apimachinery v0.24.2 - k8s.io/apiserver => k8s.io/apiserver v0.24.2 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.2 - k8s.io/client-go => k8s.io/client-go v0.24.2 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.2 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.2 - k8s.io/code-generator => k8s.io/code-generator v0.24.2 - k8s.io/component-base => k8s.io/component-base v0.24.2 - k8s.io/component-helpers => k8s.io/component-helpers v0.24.2 - k8s.io/controller-manager => k8s.io/controller-manager v0.24.2 - k8s.io/cri-api => k8s.io/cri-api v0.24.2 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.2 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.2 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.2 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.2 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.2 - k8s.io/kubectl => k8s.io/kubectl v0.24.2 - k8s.io/kubelet => k8s.io/kubelet v0.24.2 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.2 - k8s.io/metrics => k8s.io/metrics v0.24.2 - k8s.io/mount-utils => k8s.io/mount-utils v0.24.2 - k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.2 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.2 + k8s.io/api => k8s.io/api v0.24.3 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.24.3 + k8s.io/apiserver => k8s.io/apiserver v0.24.3 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.3 + k8s.io/client-go => k8s.io/client-go v0.24.3 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.3 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.3 + k8s.io/code-generator => k8s.io/code-generator v0.24.3 + k8s.io/component-base => k8s.io/component-base v0.24.3 + k8s.io/component-helpers => k8s.io/component-helpers v0.24.3 + k8s.io/controller-manager => k8s.io/controller-manager v0.24.3 + k8s.io/cri-api => k8s.io/cri-api v0.24.3 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.3 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.3 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.3 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.3 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.3 + k8s.io/kubectl => k8s.io/kubectl v0.24.3 + k8s.io/kubelet => k8s.io/kubelet v0.24.3 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.3 + k8s.io/metrics => k8s.io/metrics v0.24.3 + k8s.io/mount-utils => k8s.io/mount-utils v0.24.3 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.3 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.3 // layeh.com seems to be misbehaving layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917 ) diff --git a/go.sum b/go.sum index a292585bb..be3537427 100644 --- a/go.sum +++ b/go.sum @@ -1751,26 +1751,48 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY= +k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI= k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/apiextensions-apiserver v0.24.3 h1:kyx+Tmro1qEsTUr07ZGQOfvTsF61yn+AxnxytBWq8As= +k8s.io/apiextensions-apiserver v0.24.3/go.mod h1:cL0xkmUefpYM4f6IuOau+6NMFEIh6/7wXe/O4vPVJ8A= k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg= +k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apiserver v0.24.2 h1:orxipm5elPJSkkFNlwH9ClqaKEDJJA3yR2cAAlCnyj4= k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= +k8s.io/apiserver v0.24.3 h1:J8CKjUaZopT0hSgxjzUyp3T1GK78iixxOuFpEC0MI3k= +k8s.io/apiserver v0.24.3/go.mod h1:aXfwtIn4U27B7lYs5f2BKgz6DRbgWy+HJeYReN1jLJ8= k8s.io/cli-runtime v0.24.2/go.mod h1:1LIhKL2RblkhfG4v5lZEt7FtgFG5mVb8wqv5lE9m5qY= +k8s.io/cli-runtime v0.24.3/go.mod h1:In84wauoMOqa7JDvDSXGbf8lTNlr70fOGpYlYfJtSqA= k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY= +k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw= k8s.io/cloud-provider v0.24.2 h1:DYNf90zS/GAQbEHsTfJsH4Oas7vim4U+WU9GftMQlfs= k8s.io/cloud-provider v0.24.2/go.mod h1:a7jyWjizk+IKbcIf8+mX2cj3NvpRv9ZyGdXDyb8UEkI= +k8s.io/cloud-provider v0.24.3 h1:Z4O3AiuFxGRPn1ilzaeWS2uBnW8LsH5MbniCTf1xAgs= +k8s.io/cloud-provider v0.24.3/go.mod h1:CRIMwnR4e6FpGO5g81nofNuKGQcpJx8El2JEU+BsH9M= k8s.io/cluster-bootstrap v0.24.2/go.mod h1:eIHV338K03vBm3u/ROZiNXxWJ4AJRoTR9PEUhcTvYkg= +k8s.io/cluster-bootstrap v0.24.3/go.mod h1:plud10KCFfNjsf2FNalENFGvJWVtcKa0KbKie5wQAvA= k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/code-generator v0.24.3/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= +k8s.io/component-base v0.24.3 h1:u99WjuHYCRJjS1xeLOx72DdRaghuDnuMgueiGMFy1ec= +k8s.io/component-base v0.24.3/go.mod h1:bqom2IWN9Lj+vwAkPNOv2TflsP1PeVDIwIN0lRthxYY= k8s.io/component-helpers v0.24.2 h1:gtXmI/TjVINtkAdZn7m5p8+Vd0Mk4d1q8kwJMMLBdwY= k8s.io/component-helpers v0.24.2/go.mod h1:TRQPBQKfmqkmV6c0HAmUs8cXVNYYYLsXy4zu8eODi9g= +k8s.io/component-helpers v0.24.3 h1:HKZTNf77K96StY2+FAgKvsXvHwoLvexeGDJatyuWlyI= +k8s.io/component-helpers v0.24.3/go.mod h1:/1WNW8TfBOijQ1ED2uCHb4wtXYWDVNMqUll8h36iNVo= k8s.io/controller-manager v0.24.2/go.mod h1:hpwCof4KxP4vrw/M5QiVxU6Zmmggmr1keGXtjGHF+vc= +k8s.io/controller-manager v0.24.3/go.mod h1:qU/ZC8qmKxiVlRwLUfqXAzgsBi3q44E8Xn8qHs/MiVY= k8s.io/cri-api v0.24.2/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= +k8s.io/cri-api v0.24.3/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= k8s.io/csi-translation-lib v0.24.2/go.mod h1:pdHc2CYLViQYYsOqOp79hjKYi8J4NZ7vpiVzn1SqBrg= +k8s.io/csi-translation-lib v0.24.3/go.mod h1:PfajTaauPYSL4hWKDRBVbUfO611Uv+h3w1YA9Twmzjk= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -1786,27 +1808,42 @@ k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-aggregator v0.24.2/go.mod h1:Ju2jNDixn+vqeeKEBfjfpc204bO1pbdXX0N9knCxeMQ= +k8s.io/kube-aggregator v0.24.3/go.mod h1:oMjdwraZtb0CtIxrzrAt/4GJxbivAM8AesZhYVmXZ54= k8s.io/kube-controller-manager v0.24.2/go.mod h1:KDE0yqiEvxYiO0WRpPA4rVx8AcK1vsWydUF37AJ9lTI= +k8s.io/kube-controller-manager v0.24.3/go.mod h1:c7YN1XesvesxKM5uO5JqmcecnUsitFos1sIyt0eOprE= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-proxy v0.24.2/go.mod h1:bozS2ufl/Ns6s40Ue34eV7rqyLVygi5usSmCgW7rFU8= +k8s.io/kube-proxy v0.24.3/go.mod h1:zJ+koqfBkRUAzUfXlBtFfyfH3InqM38t5ELGlTlPwO0= k8s.io/kube-scheduler v0.24.2/go.mod h1:DRa+aeXKSYUUOHHIc/9EcaO9+FW5FydaOfPSvaSW5Ko= +k8s.io/kube-scheduler v0.24.3/go.mod h1:myFLGrPy8rcwPz6qg9L3rMRDT2eNIpizq+MXOzMjX/8= k8s.io/kubectl v0.24.2 h1:+RfQVhth8akUmIc2Ge8krMl/pt66V7210ka3RE/p0J4= k8s.io/kubectl v0.24.2/go.mod h1:+HIFJc0bA6Tzu5O/YcuUt45APAxnNL8LeMuXwoiGsPg= +k8s.io/kubectl v0.24.3 h1:PqY8ho/S/KuE2/hCC3Iee7X+lOtARYo0LQsNzvV/edE= +k8s.io/kubectl v0.24.3/go.mod h1:PYLcvw96sC1NLbxZEDbdlOEd6/C76VIWjGmWV5QjSk0= k8s.io/kubelet v0.24.2 h1:VAvULig8RiylCtyxudgHV7nhKsLnNIrdVBCRD4bXQ3Y= k8s.io/kubelet v0.24.2/go.mod h1:Xm9DkWQjwOs+uGOUIIGIPMvvmenvj0lDVOErvIKOOt0= -k8s.io/kubernetes v1.24.2 h1:AyjtHzSysliKR04Km91njmk2yaKmOa3ZISQZCIGUnVI= -k8s.io/kubernetes v1.24.2/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0= +k8s.io/kubelet v0.24.3 h1:6fqhHuUWkMpsGulIticCLUlDIhc30sypVVJjGVVKYzw= +k8s.io/kubelet v0.24.3/go.mod h1:vIdQ8bybBvLeMysTyj37QZNKNnCGVfWqpbsLaMT7wTE= +k8s.io/kubernetes v1.24.3 h1:RVuivOFTujzUDYZV8UFXCeD05US8DowBbxV+97JWEFg= +k8s.io/kubernetes v1.24.3/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0= k8s.io/legacy-cloud-providers v0.24.2/go.mod h1:sgkasgIP2ZOew8fzoOq0mQLVXJ4AmB57IUbFUjzPWEo= +k8s.io/legacy-cloud-providers v0.24.3/go.mod h1:G548jzl58czqsrebwY1XXFKEkCEcJhX8tnPUCFv/uMo= k8s.io/metrics v0.24.2/go.mod h1:5NWURxZ6Lz5gj8TFU83+vdWIVASx7W8lwPpHYCqopMo= +k8s.io/metrics v0.24.3/go.mod h1:p1M0lhMySWfhISkSd3HEj8xIgrVnJTK3PPhFq2rA3To= k8s.io/mount-utils v0.24.2 h1:UTHxyMz2LGBgapLcyl2y2hxWwJHotdmKLqV7CEf0fys= k8s.io/mount-utils v0.24.2/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= +k8s.io/mount-utils v0.24.3 h1:o16GMv2uk3MzGgbgSYT49lNPHMgpmVbwJu9VPO47KgI= +k8s.io/mount-utils v0.24.3/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= k8s.io/pod-security-admission v0.24.2 h1:Wl92TCvxsqba+kDK59Dnf/qIsSoP1ekRlj5qT1XEmNk= k8s.io/pod-security-admission v0.24.2/go.mod h1:znnuDHWWWvh/tpbYYPwTsd4y//qHi3cOX+wGxET/mMI= +k8s.io/pod-security-admission v0.24.3 h1:Uy9jh3rp0T6WK68WSgnGhBoSLQUOB//G09TYTeJtAfo= +k8s.io/pod-security-admission v0.24.3/go.mod h1:l862a6t98GO7IIIGIe/lh01TTq9fWu6ylTb7CLDrXkY= k8s.io/sample-apiserver v0.24.2/go.mod h1:mf8qgDdu450wqpCJOkSAmoTgU4PIMAcfa5uTBwmJekE= +k8s.io/sample-apiserver v0.24.3/go.mod h1:ZDr71tBj39HgTEFPugVn5v32aZ5z7XCu2kLWoygiBp0= k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/vendor/modules.txt b/vendor/modules.txt index be7ca4dd0..d4e943ff5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -772,7 +772,7 @@ gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# k8s.io/api v0.24.2 => k8s.io/api v0.24.2 +# k8s.io/api v0.24.3 => k8s.io/api v0.24.3 ## explicit; go 1.16 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -821,11 +821,11 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apiextensions-apiserver v0.23.0 => k8s.io/apiextensions-apiserver v0.24.2 +# k8s.io/apiextensions-apiserver v0.24.3 => k8s.io/apiextensions-apiserver v0.24.3 ## explicit; go 1.16 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 -# k8s.io/apimachinery v0.24.2 => k8s.io/apimachinery v0.24.2 +# k8s.io/apimachinery v0.24.3 => k8s.io/apimachinery v0.24.3 ## explicit; go 1.16 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -881,7 +881,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.24.2 => k8s.io/apiserver v0.24.2 +# k8s.io/apiserver v0.24.3 => k8s.io/apiserver v0.24.3 ## explicit; go 1.16 k8s.io/apiserver/pkg/admission k8s.io/apiserver/pkg/admission/configuration @@ -920,7 +920,7 @@ k8s.io/apiserver/pkg/util/feature k8s.io/apiserver/pkg/util/webhook k8s.io/apiserver/pkg/util/x509metrics k8s.io/apiserver/pkg/warning -# k8s.io/client-go v12.0.0+incompatible => k8s.io/client-go v0.24.2 +# k8s.io/client-go v12.0.0+incompatible => k8s.io/client-go v0.24.3 ## explicit; go 1.16 k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 @@ -1164,12 +1164,12 @@ k8s.io/client-go/util/homedir k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/cloud-provider v0.24.2 => k8s.io/cloud-provider v0.24.2 +# k8s.io/cloud-provider v0.24.3 => k8s.io/cloud-provider v0.24.3 ## explicit; go 1.16 k8s.io/cloud-provider k8s.io/cloud-provider/volume k8s.io/cloud-provider/volume/helpers -# k8s.io/component-base v0.24.2 => k8s.io/component-base v0.24.2 +# k8s.io/component-base v0.24.3 => k8s.io/component-base v0.24.3 ## explicit; go 1.16 k8s.io/component-base/cli/flag k8s.io/component-base/config @@ -1180,7 +1180,7 @@ k8s.io/component-base/metrics/legacyregistry k8s.io/component-base/metrics/testutil k8s.io/component-base/traces k8s.io/component-base/version -# k8s.io/component-helpers v0.24.2 => k8s.io/component-helpers v0.24.2 +# k8s.io/component-helpers v0.24.3 => k8s.io/component-helpers v0.24.3 ## explicit; go 1.16 k8s.io/component-helpers/node/util/sysctl k8s.io/component-helpers/scheduling/corev1 @@ -1205,14 +1205,14 @@ k8s.io/kube-openapi/pkg/schemamutation k8s.io/kube-openapi/pkg/spec3 k8s.io/kube-openapi/pkg/util/proto k8s.io/kube-openapi/pkg/validation/spec -# k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.24.2 +# k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.24.3 ## explicit; go 1.16 k8s.io/kubectl/pkg/scale k8s.io/kubectl/pkg/util/podutils -# k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.24.2 +# k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.24.3 ## explicit; go 1.16 k8s.io/kubelet/pkg/apis/stats/v1alpha1 -# k8s.io/kubernetes v1.24.2 +# k8s.io/kubernetes v1.24.3 ## explicit; go 1.16 k8s.io/kubernetes/pkg/api/legacyscheme k8s.io/kubernetes/pkg/api/service @@ -1273,10 +1273,10 @@ k8s.io/kubernetes/test/e2e/storage/utils k8s.io/kubernetes/test/e2e/testing-manifests k8s.io/kubernetes/test/utils k8s.io/kubernetes/test/utils/image -# k8s.io/mount-utils v0.24.2 => k8s.io/mount-utils v0.24.2 +# k8s.io/mount-utils v0.24.3 => k8s.io/mount-utils v0.24.3 ## explicit; go 1.16 k8s.io/mount-utils -# k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.24.2 +# k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.24.3 ## explicit; go 1.16 k8s.io/pod-security-admission/api # k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 @@ -1356,29 +1356,29 @@ sigs.k8s.io/yaml # github.com/golang/protobuf => github.com/golang/protobuf v1.4.3 # github.com/portworx/sched-ops => github.com/portworx/sched-ops v0.20.4-openstorage-rc3 # gomodules.xyz/jsonpatch/v2 => github.com/gomodules/jsonpatch/v2 v2.2.0 -# k8s.io/api => k8s.io/api v0.24.2 -# k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.2 -# k8s.io/apimachinery => k8s.io/apimachinery v0.24.2 -# k8s.io/apiserver => k8s.io/apiserver v0.24.2 -# k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.2 -# k8s.io/client-go => k8s.io/client-go v0.24.2 -# k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.2 -# k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.2 -# k8s.io/code-generator => k8s.io/code-generator v0.24.2 -# k8s.io/component-base => k8s.io/component-base v0.24.2 -# k8s.io/component-helpers => k8s.io/component-helpers v0.24.2 -# k8s.io/controller-manager => k8s.io/controller-manager v0.24.2 -# k8s.io/cri-api => k8s.io/cri-api v0.24.2 -# k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.2 -# k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.2 -# k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.2 -# k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.2 -# k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.2 -# k8s.io/kubectl => k8s.io/kubectl v0.24.2 -# k8s.io/kubelet => k8s.io/kubelet v0.24.2 -# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.2 -# k8s.io/metrics => k8s.io/metrics v0.24.2 -# k8s.io/mount-utils => k8s.io/mount-utils v0.24.2 -# k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.2 -# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.2 +# k8s.io/api => k8s.io/api v0.24.3 +# k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.3 +# k8s.io/apimachinery => k8s.io/apimachinery v0.24.3 +# k8s.io/apiserver => k8s.io/apiserver v0.24.3 +# k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.3 +# k8s.io/client-go => k8s.io/client-go v0.24.3 +# k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.3 +# k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.3 +# k8s.io/code-generator => k8s.io/code-generator v0.24.3 +# k8s.io/component-base => k8s.io/component-base v0.24.3 +# k8s.io/component-helpers => k8s.io/component-helpers v0.24.3 +# k8s.io/controller-manager => k8s.io/controller-manager v0.24.3 +# k8s.io/cri-api => k8s.io/cri-api v0.24.3 +# k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.3 +# k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.3 +# k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.3 +# k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.3 +# k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.3 +# k8s.io/kubectl => k8s.io/kubectl v0.24.3 +# k8s.io/kubelet => k8s.io/kubelet v0.24.3 +# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.3 +# k8s.io/metrics => k8s.io/metrics v0.24.3 +# k8s.io/mount-utils => k8s.io/mount-utils v0.24.3 +# k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.3 +# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.3 # layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917 From 56d7d3cd151071a68ceca420d6804bc5aa49c4f5 Mon Sep 17 00:00:00 2001 From: Anthony D'Atri Date: Sun, 31 Jul 2022 01:24:26 -0700 Subject: [PATCH 22/37] doc: minor cleanup Signed-off-by: Anthony D'Atri --- README.md | 25 ++++++++++++------------- docs/capabilities.md | 11 ++++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 03e07dfe3..aae1e2ea7 100644 --- a/README.md +++ b/README.md @@ -21,15 +21,15 @@ Card](https://goreportcard.com/badge/github.com/ceph/ceph-csi)](https://goreport - [Dev standup](#dev-standup) - [Contact](#contact) -This repo contains Ceph +This repo contains the Ceph [Container Storage Interface (CSI)](https://github.com/container-storage-interface/) -driver for RBD, CephFS and kubernetes sidecar deployment yamls of provisioner, -attacher, resizer, driver-registrar and snapshotter for supporting CSI functionalities. +driver for RBD, CephFS and Kubernetes sidecar deployment YAMLs to support CSI +functionality: provisioner, attacher, resizer, driver-registrar and snapshotter. ## Overview -Ceph CSI plugins implement an interface between CSI enabled Container Orchestrator -(CO) and Ceph cluster. It allows dynamically provisioning Ceph volumes and +Ceph CSI plugins implement an interface between a CSI-enabled Container Orchestrator +(CO) and Ceph clusters. They enable dynamically provisioning Ceph volumes and attaching them to workloads. Independent CSI plugins are provided to support RBD and CephFS backed volumes, @@ -38,7 +38,7 @@ Independent CSI plugins are provided to support RBD and CephFS backed volumes, [rbd doc](https://github.com/ceph/ceph-csi/blob/devel/docs/deploy-rbd.md) and for CephFS plugin configuration and deployment please refer [cephFS doc](https://github.com/ceph/ceph-csi/blob/devel/docs/deploy-cephfs.md). -- For example usage of RBD and CephFS CSI plugins, see examples in `examples/`. +- For example usage of the RBD and CephFS CSI plugins, see examples in `examples/`. - Stale resource cleanup, please refer [cleanup doc](docs/resource-cleanup.md). NOTE: @@ -51,7 +51,7 @@ Status: **GA** ## Known to work CO platforms -Ceph CSI drivers are currently developed and tested **exclusively** on Kubernetes +Ceph CSI drivers are currently developed and tested **exclusively** in Kubernetes environments. | Ceph CSI Version | Container Orchestrator Name | Version Tested| @@ -62,18 +62,17 @@ environments. | v3.5.0 | Kubernetes | v1.21, v1.22, v1.23| | v3.4.0 | Kubernetes | v1.20, v1.21, v1.22| -There is work in progress to make this CO independent and thus -support other orchestration environments (Nomad, Mesos..etc) in the future. +There is work in progress to make this CO-independent and thus +support other orchestration environments (Nomad, Mesos..etc). NOTE: -The supported window of Ceph CSI versions is known as "N.(x-1)": +The supported window of Ceph CSI versions is "N.(x-1)": (N (Latest major release) . (x (Latest minor release) - 1)). -For example, if Ceph CSI latest major version is `3.6.0` today, support is +For example, if the Ceph CSI latest major version is `3.6.0` today, support is provided for the versions above `3.5.0`. If users are running an unsupported -Ceph CSI version, they will be asked to upgrade when requesting support for the -cluster. +Ceph CSI version, they will be asked to upgrade when requesting support. ## Support Matrix diff --git a/docs/capabilities.md b/docs/capabilities.md index a4db72701..6c1454313 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -1,6 +1,7 @@ # Capabilities of a user required for ceph-csi in a Ceph cluster -Ceph uses the term capabilities to describe authorizing an authenticated user +Ceph uses the term _capabilities_ to describe authorizations for an +authenticated user to exercise the functionality of the monitors, OSDs and metadata servers. Capabilities can also restrict access to data within a pool or pool namespace. A Ceph administrative user sets a user's capabilities when creating or @@ -10,9 +11,9 @@ Hence, those capabilities are documented below. ## RBD -We have provisioner, controller expand and node stage secrets in storage class. -For the provisioner and controller expand stage secret in storageclass, the -user needs to have the below mentioned ceph capabilities. +We have provisioner, controller expand and node stage secrets in storageclass. +For the provisioner and controller expand stage secrets in storageclass, the +user needs to have the below Ceph capabilities. ``` "mon", "profile rbd", @@ -50,7 +51,7 @@ the below mentioned ceph capabilities. "mds", "allow rw" ``` -To get more insights on capabilities of cephfs you can refer +To get more insights on capabilities of CephFS you can refer [this document](https://ceph.readthedocs.io/en/latest/cephfs/client-auth/) ## Command to a create user with required capabilities From de7128b3a2a1c021c773851602412044b32db574 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Thu, 28 Jul 2022 14:14:52 +0530 Subject: [PATCH 23/37] cephfs: Add clusterName as metadata on snapshots Example: sh-4.4$ ceph fs subvolume snapshot metadata ls myfs csi-vol-ba248f9e-0e75-11ed-b774-8e97192ff5ec \ csi-snap-ce24e3bb-0e75-11ed-b774-8e97192ff5ec --group_name csi { "csi.ceph.com/cluster/name": "\"K8s-cluster-1\"", "csi.storage.k8s.io/volumesnapshot/name": "cephfs-pvc-snapshot", "csi.storage.k8s.io/volumesnapshot/namespace": "rook-ceph", "csi.storage.k8s.io/volumesnapshotcontent/name": "snapcontent-2e89e1b2-e6e9-48fe-b365-edb493d7022e" } Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 15 ++++++++++----- internal/cephfs/core/clone.go | 6 +++--- internal/cephfs/core/snapshot.go | 20 ++++++++++++++------ internal/cephfs/core/snapshot_metadata.go | 15 +++++++++++++++ internal/cephfs/store/fsjournal.go | 3 ++- internal/cephfs/store/volumeoptions.go | 3 ++- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index ea54f245a..1c1c91b35 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -602,6 +602,7 @@ func cleanUpBackingVolume( snapParentVolOptions.GetConnection(), snapID.FsSnapshotName, volOptions.ClusterID, + clusterName, &snapParentVolOptions.SubVolume, ) @@ -780,7 +781,7 @@ func (cs *ControllerServer) CreateSnapshot( } defer cs.VolumeLocks.Release(sourceVolID) snapName := req.GetName() - sid, snapInfo, err := store.CheckSnapExists(ctx, parentVolOptions, cephfsSnap, cr) + sid, snapInfo, err := store.CheckSnapExists(ctx, parentVolOptions, cephfsSnap, cs.ClusterName, cr) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -824,6 +825,7 @@ func (cs *ControllerServer) CreateSnapshot( parentVolOptions.GetConnection(), sid.FsSnapshotName, parentVolOptions.ClusterID, + cs.ClusterName, &parentVolOptions.SubVolume) if !(snapInfo.Protected == core.SnapshotIsProtected) { err = snapClient.ProtectSnapshot(ctx) @@ -868,7 +870,7 @@ func (cs *ControllerServer) CreateSnapshot( } } }() - snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, metadata) + snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, cs.ClusterName, metadata) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -887,12 +889,14 @@ func (cs *ControllerServer) CreateSnapshot( func doSnapshot( ctx context.Context, volOpt *store.VolumeOptions, - snapshotName string, + snapshotName, + clusterName string, metadata map[string]string, ) (core.SnapshotInfo, error) { snapID := fsutil.VolumeID(snapshotName) snap := core.SnapshotInfo{} - snapClient := core.NewSnapshot(volOpt.GetConnection(), snapshotName, volOpt.ClusterID, &volOpt.SubVolume) + snapClient := core.NewSnapshot(volOpt.GetConnection(), snapshotName, + volOpt.ClusterID, clusterName, &volOpt.SubVolume) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapID, err) @@ -1049,7 +1053,8 @@ func (cs *ControllerServer) DeleteSnapshot( if snapInfo.HasPendingClones == "yes" { return nil, status.Errorf(codes.FailedPrecondition, "snapshot %s has pending clones", snapshotID) } - snapClient := core.NewSnapshot(volOpt.GetConnection(), sid.FsSnapshotName, volOpt.ClusterID, &volOpt.SubVolume) + snapClient := core.NewSnapshot(volOpt.GetConnection(), sid.FsSnapshotName, + volOpt.ClusterID, cs.ClusterName, &volOpt.SubVolume) if snapInfo.Protected == core.SnapshotIsProtected { err = snapClient.UnprotectSnapshot(ctx) if err != nil { diff --git a/internal/cephfs/core/clone.go b/internal/cephfs/core/clone.go index d2a7f6c87..1e801750f 100644 --- a/internal/cephfs/core/clone.go +++ b/internal/cephfs/core/clone.go @@ -66,7 +66,7 @@ func (s *subVolumeClient) CreateCloneFromSubvolume( parentvolOpt *SubVolume, ) error { snapshotID := s.VolID - snapClient := NewSnapshot(s.conn, snapshotID, s.clusterID, parentvolOpt) + snapClient := NewSnapshot(s.conn, snapshotID, s.clusterID, s.clusterName, parentvolOpt) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapshotID, err) @@ -165,7 +165,7 @@ func (s *subVolumeClient) CleanupSnapshotFromSubvolume( // snapshot name is same as clone name as we need a name which can be // identified during PVC-PVC cloning. snapShotID := s.VolID - snapClient := NewSnapshot(s.conn, snapShotID, s.clusterID, parentVol) + snapClient := NewSnapshot(s.conn, snapShotID, s.clusterID, s.clusterName, parentVol) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { @@ -198,7 +198,7 @@ func (s *subVolumeClient) CreateCloneFromSnapshot( ctx context.Context, snap Snapshot, ) error { snapID := snap.SnapshotID - snapClient := NewSnapshot(s.conn, snapID, s.clusterID, snap.SubVolume) + snapClient := NewSnapshot(s.conn, snapID, s.clusterID, s.clusterName, snap.SubVolume) err := snapClient.CloneSnapshot(ctx, s.SubVolume) if err != nil { return err diff --git a/internal/cephfs/core/snapshot.go b/internal/cephfs/core/snapshot.go index 52b0146e9..4de877c2e 100644 --- a/internal/cephfs/core/snapshot.go +++ b/internal/cephfs/core/snapshot.go @@ -61,9 +61,10 @@ type SnapshotClient interface { // snapshotClient is the implementation of SnapshotClient interface. type snapshotClient struct { - *Snapshot // Embedded snapshot struct. - clusterID string // Cluster ID. - conn *util.ClusterConnection // Cluster connection. + *Snapshot // Embedded snapshot struct. + clusterID string // Cluster ID. + clusterName string // Cluster Name. + conn *util.ClusterConnection // Cluster connection. } // Snapshot represents a subvolume snapshot and its cluster information. @@ -73,14 +74,21 @@ type Snapshot struct { } // NewSnapshot creates a new snapshot client. -func NewSnapshot(conn *util.ClusterConnection, snapshotID, clusterID string, vol *SubVolume) SnapshotClient { +func NewSnapshot( + conn *util.ClusterConnection, + snapshotID, + clusterID, + clusterName string, + vol *SubVolume, +) SnapshotClient { return &snapshotClient{ Snapshot: &Snapshot{ SnapshotID: snapshotID, SubVolume: vol, }, - clusterID: clusterID, - conn: conn, + clusterID: clusterID, + clusterName: clusterName, + conn: conn, } } diff --git a/internal/cephfs/core/snapshot_metadata.go b/internal/cephfs/core/snapshot_metadata.go index f4f2c2cfc..060a7bbcb 100644 --- a/internal/cephfs/core/snapshot_metadata.go +++ b/internal/cephfs/core/snapshot_metadata.go @@ -99,6 +99,14 @@ func (s *snapshotClient) SetAllSnapshotMetadata(parameters map[string]string) er } } + if s.clusterName != "" { + err := s.setSnapshotMetadata(clusterNameKey, s.clusterName) + if err != nil { + return fmt.Errorf("failed to set metadata key %q, value %q on subvolume snapshot %s %s in fs %s: %w", + clusterNameKey, s.clusterName, s.SnapshotID, s.VolID, s.FsName, err) + } + } + return nil } @@ -114,5 +122,12 @@ func (s *snapshotClient) UnsetAllSnapshotMetadata(keys []string) error { } } + err := s.removeSnapshotMetadata(clusterNameKey) + // TODO: replace string comparison with errno. + if err != nil && !strings.Contains(err.Error(), "No such file or directory") { + return fmt.Errorf("failed to unset metadata key %q on subvolume snapshot %s %s in fs %s: %w", + clusterNameKey, s.SnapshotID, s.VolID, s.FsName, err) + } + return nil } diff --git a/internal/cephfs/store/fsjournal.go b/internal/cephfs/store/fsjournal.go index e5fab689d..83ef1d3c7 100644 --- a/internal/cephfs/store/fsjournal.go +++ b/internal/cephfs/store/fsjournal.go @@ -377,6 +377,7 @@ func CheckSnapExists( ctx context.Context, volOptions *VolumeOptions, snap *SnapshotOption, + clusterName string, cr *util.Credentials, ) (*SnapshotIdentifier, *core.SnapshotInfo, error) { // Connect to cephfs' default radosNamespace (csi) @@ -398,7 +399,7 @@ func CheckSnapExists( snapUUID := snapData.ImageUUID snapID := snapData.ImageAttributes.ImageName sid.FsSnapshotName = snapData.ImageAttributes.ImageName - snapClient := core.NewSnapshot(volOptions.conn, snapID, volOptions.ClusterID, &volOptions.SubVolume) + snapClient := core.NewSnapshot(volOptions.conn, snapID, volOptions.ClusterID, clusterName, &volOptions.SubVolume) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { diff --git a/internal/cephfs/store/volumeoptions.go b/internal/cephfs/store/volumeoptions.go index 8830ae733..29dbb3742 100644 --- a/internal/cephfs/store/volumeoptions.go +++ b/internal/cephfs/store/volumeoptions.go @@ -735,7 +735,8 @@ func NewSnapshotOptionsFromID( volOptions.Features = subvolInfo.Features volOptions.Size = subvolInfo.BytesQuota volOptions.RootPath = subvolInfo.Path - snap := core.NewSnapshot(volOptions.conn, sid.FsSnapshotName, volOptions.ClusterID, &volOptions.SubVolume) + snap := core.NewSnapshot(volOptions.conn, sid.FsSnapshotName, + volOptions.ClusterID, clusterName, &volOptions.SubVolume) info, err := snap.GetSnapshotInfo(ctx) if err != nil { return &volOptions, nil, &sid, err From cf97e377fa005f949e32fe0ccc08ad6d9f3e34ce Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Thu, 28 Jul 2022 16:18:00 +0530 Subject: [PATCH 24/37] e2e: validate clusterName metadata Signed-off-by: Prasanna Kumar Kalever --- e2e/cephfs.go | 7 +++++++ e2e/cephfs_helper.go | 1 + 2 files changed, 8 insertions(+) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index afb8d7835..509972c19 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -970,7 +970,10 @@ var _ = Describe(cephfsType, func() { } else if metadata.VolSnapContentNameKey != content.Name { e2elog.Failf("failed, contentname expected:%s got:%s", content.Name, metadata.VolSnapContentNameKey) + } else if metadata.ClusterNameKey != defaultClusterName { + e2elog.Failf("expected clusterName %q got %q", defaultClusterName, metadata.ClusterNameKey) } + // Delete the parent pvc before restoring // another one from snapshot. err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) @@ -1005,6 +1008,8 @@ var _ = Describe(cephfsType, func() { e2elog.Failf("expected pvcNamespace %q got %q", pvcClone.Namespace, cloneMetadata.PVCNamespaceKey) } else if cloneMetadata.PVNameKey != pvcCloneObj.Spec.VolumeName { e2elog.Failf("expected pvName %q got %q", pvcCloneObj.Spec.VolumeName, cloneMetadata.PVNameKey) + } else if cloneMetadata.ClusterNameKey != defaultClusterName { + e2elog.Failf("expected clusterName %q got %q", defaultClusterName, cloneMetadata.ClusterNameKey) } // delete clone @@ -1067,6 +1072,8 @@ var _ = Describe(cephfsType, func() { e2elog.Failf("expected pvcNamespace %q got %q", pvc.Namespace, cloneMetadata.PVCNamespaceKey) } else if cloneMetadata.PVNameKey != pvcCloneObj.Spec.VolumeName { e2elog.Failf("expected pvName %q got %q", pvcCloneObj.Spec.VolumeName, cloneMetadata.PVNameKey) + } else if cloneMetadata.ClusterNameKey != defaultClusterName { + e2elog.Failf("expected clusterName %q got %q", defaultClusterName, cloneMetadata.ClusterNameKey) } err = deletePVCAndValidatePV(f.ClientSet, pvcClone, deployTimeout) diff --git a/e2e/cephfs_helper.go b/e2e/cephfs_helper.go index e096734e5..dd0a58124 100644 --- a/e2e/cephfs_helper.go +++ b/e2e/cephfs_helper.go @@ -249,6 +249,7 @@ type cephfsSnapshotMetadata struct { VolSnapNameKey string `json:"csi.storage.k8s.io/volumesnapshot/name"` VolSnapNamespaceKey string `json:"csi.storage.k8s.io/volumesnapshot/namespace"` VolSnapContentNameKey string `json:"csi.storage.k8s.io/volumesnapshotcontent/name"` + ClusterNameKey string `json:"csi.ceph.com/cluster/name"` } func listCephFSSnapshotMetadata( From 14d6211d6d6f4eff652ec14aa139b0e025c56825 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Thu, 28 Jul 2022 17:35:33 +0530 Subject: [PATCH 25/37] cephfs: subvolumes honor `--setmetadata` option `--setmetadata` is false by default, honoring it will keep the metadata disabled by default Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 54 ++++++++++++------------ internal/cephfs/core/metadata.go | 8 ++++ internal/cephfs/core/volume.go | 26 ++++++++---- internal/cephfs/driver.go | 1 + internal/cephfs/nodeserver.go | 2 +- internal/cephfs/store/backingsnapshot.go | 4 +- internal/cephfs/store/fsjournal.go | 3 +- internal/cephfs/store/volumeoptions.go | 29 +++++++++---- 8 files changed, 81 insertions(+), 46 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index 1c1c91b35..e012ca4e9 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -55,6 +55,9 @@ type ControllerServer struct { // Cluster name ClusterName string + + // Set metadata on volume + SetMetadata bool } // createBackingVolume creates the backing subvolume and on any error cleans up any created entities. @@ -67,7 +70,7 @@ func (cs *ControllerServer) createBackingVolume( ) error { var err error volClient := core.NewSubVolume(volOptions.GetConnection(), - &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName, cs.SetMetadata) if sID != nil { return cs.createBackingVolumeFromSnapshotSource(ctx, volOptions, parentVolOpt, volClient, sID) @@ -101,7 +104,7 @@ func (cs *ControllerServer) createBackingVolumeFromSnapshotSource( defer cs.OperationLocks.ReleaseRestoreLock(sID.SnapshotID) if volOptions.BackingSnapshot { - if err := store.AddSnapshotBackedVolumeRef(ctx, volOptions, cs.ClusterName); err != nil { + if err := store.AddSnapshotBackedVolumeRef(ctx, volOptions, cs.ClusterName, cs.SetMetadata); err != nil { log.ErrorLog(ctx, "failed to create snapshot-backed volume from snapshot %s: %v", sID.FsSnapshotName, err) @@ -146,11 +149,10 @@ func (cs *ControllerServer) createBackingVolumeFromVolumeSource( return nil } -func checkContentSource( +func (cs *ControllerServer) checkContentSource( ctx context.Context, req *csi.CreateVolumeRequest, cr *util.Credentials, - clusterName string, ) (*store.VolumeOptions, *store.VolumeIdentifier, *store.SnapshotIdentifier, error) { if req.VolumeContentSource == nil { return nil, nil, nil, nil @@ -159,7 +161,7 @@ func checkContentSource( switch volumeSource.Type.(type) { case *csi.VolumeContentSource_Snapshot: snapshotID := req.VolumeContentSource.GetSnapshot().GetSnapshotId() - volOpt, _, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, clusterName) + volOpt, _, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, cs.ClusterName, cs.SetMetadata) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { return nil, nil, nil, status.Error(codes.NotFound, err.Error()) @@ -172,7 +174,8 @@ func checkContentSource( case *csi.VolumeContentSource_Volume: // Find the volume using the provided VolumeID volID := req.VolumeContentSource.GetVolume().GetVolumeId() - parentVol, pvID, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, req.Secrets, clusterName) + parentVol, pvID, err := store.NewVolumeOptionsFromVolID(ctx, + volID, nil, req.Secrets, cs.ClusterName, cs.SetMetadata) if err != nil { if !errors.Is(err, cerrors.ErrVolumeNotFound) { return nil, nil, nil, status.Error(codes.NotFound, err.Error()) @@ -257,7 +260,7 @@ func (cs *ControllerServer) CreateVolume( } defer cs.VolumeLocks.Release(requestName) - volOptions, err := store.NewVolumeOptions(ctx, requestName, cs.ClusterName, req, cr) + volOptions, err := store.NewVolumeOptions(ctx, requestName, cs.ClusterName, cs.SetMetadata, req, cr) if err != nil { log.ErrorLog(ctx, "validation and extraction of volume options failed: %v", err) @@ -269,7 +272,7 @@ func (cs *ControllerServer) CreateVolume( volOptions.Size = util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes()) } - parentVol, pvID, sID, err := checkContentSource(ctx, req, cr, cs.ClusterName) + parentVol, pvID, sID, err := cs.checkContentSource(ctx, req, cr) if err != nil { return nil, err } @@ -282,7 +285,7 @@ func (cs *ControllerServer) CreateVolume( return nil, status.Error(codes.InvalidArgument, err.Error()) } - vID, err := store.CheckVolExists(ctx, volOptions, parentVol, pvID, sID, cr, cs.ClusterName) + vID, err := store.CheckVolExists(ctx, volOptions, parentVol, pvID, sID, cr, cs.ClusterName, cs.SetMetadata) if err != nil { if cerrors.IsCloneRetryError(err) { return nil, status.Error(codes.Aborted, err.Error()) @@ -295,7 +298,7 @@ func (cs *ControllerServer) CreateVolume( metadata := k8s.GetVolumeMetadata(req.GetParameters()) if vID != nil { volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, - volOptions.ClusterID, cs.ClusterName) + volOptions.ClusterID, cs.ClusterName, cs.SetMetadata) if sID != nil || pvID != nil && !volOptions.BackingSnapshot { err = volClient.ExpandVolume(ctx, volOptions.Size) if err != nil { @@ -376,7 +379,7 @@ func (cs *ControllerServer) CreateVolume( } volClient := core.NewSubVolume(volOptions.GetConnection(), - &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName, cs.SetMetadata) if !volOptions.BackingSnapshot { // Get root path for the created subvolume. // Note that root path for snapshot-backed volumes has been already set when @@ -464,7 +467,8 @@ func (cs *ControllerServer) DeleteVolume( defer cs.OperationLocks.ReleaseDeleteLock(req.GetVolumeId()) // Find the volume using the provided VolumeID - volOptions, vID, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), nil, secrets, cs.ClusterName) + volOptions, vID, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), nil, secrets, + cs.ClusterName, cs.SetMetadata) if err != nil { // if error is ErrPoolNotFound, the pool is already deleted we dont // need to worry about deleting subvolume or omap data, return success @@ -519,7 +523,7 @@ func (cs *ControllerServer) DeleteVolume( } defer cr.DeleteCredentials() - if err := cleanUpBackingVolume(ctx, volOptions, vID, cr, cs.ClusterName); err != nil { + if err := cs.cleanUpBackingVolume(ctx, volOptions, vID, cr); err != nil { return nil, err } @@ -532,18 +536,17 @@ func (cs *ControllerServer) DeleteVolume( return &csi.DeleteVolumeResponse{}, nil } -func cleanUpBackingVolume( +func (cs *ControllerServer) cleanUpBackingVolume( ctx context.Context, volOptions *store.VolumeOptions, volID *store.VolumeIdentifier, cr *util.Credentials, - clusterName string, ) error { if !volOptions.BackingSnapshot { // Regular volumes need to be purged. volClient := core.NewSubVolume(volOptions.GetConnection(), - &volOptions.SubVolume, volOptions.ClusterID, clusterName) + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName, cs.SetMetadata) if err := volClient.PurgeVolume(ctx, false); err != nil { log.ErrorLog(ctx, "failed to delete volume %s: %v", volID, err) if errors.Is(err, cerrors.ErrVolumeHasSnapshots) { @@ -576,7 +579,7 @@ func cleanUpBackingVolume( } snapParentVolOptions, _, snapID, err := store.NewSnapshotOptionsFromID(ctx, - volOptions.BackingSnapshotID, cr, clusterName) + volOptions.BackingSnapshotID, cr, cs.ClusterName, cs.SetMetadata) if err != nil { absorbErrs := []error{ util.ErrPoolNotFound, @@ -602,7 +605,7 @@ func cleanUpBackingVolume( snapParentVolOptions.GetConnection(), snapID.FsSnapshotName, volOptions.ClusterID, - clusterName, + cs.ClusterName, &snapParentVolOptions.SubVolume, ) @@ -671,7 +674,8 @@ func (cs *ControllerServer) ControllerExpandVolume( } defer cr.DeleteCredentials() - volOptions, volIdentifier, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, secret, cs.ClusterName) + volOptions, volIdentifier, err := store.NewVolumeOptionsFromVolID(ctx, volID, nil, secret, + cs.ClusterName, cs.SetMetadata) if err != nil { log.ErrorLog(ctx, "validation and extraction of volume options failed: %v", err) @@ -686,7 +690,7 @@ func (cs *ControllerServer) ControllerExpandVolume( RoundOffSize := util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes()) volClient := core.NewSubVolume(volOptions.GetConnection(), - &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName) + &volOptions.SubVolume, volOptions.ClusterID, cs.ClusterName, cs.SetMetadata) if err = volClient.ResizeVolume(ctx, RoundOffSize); err != nil { log.ErrorLog(ctx, "failed to expand volume %s: %v", fsutil.VolumeID(volIdentifier.FsSubvolName), err) @@ -740,7 +744,7 @@ func (cs *ControllerServer) CreateSnapshot( // Find the volume using the provided VolumeID parentVolOptions, vid, err := store.NewVolumeOptionsFromVolID(ctx, - sourceVolID, nil, req.GetSecrets(), cs.ClusterName) + sourceVolID, nil, req.GetSecrets(), cs.ClusterName, cs.SetMetadata) if err != nil { if errors.Is(err, util.ErrPoolNotFound) { log.WarningLog(ctx, "failed to get backend volume for %s: %v", sourceVolID, err) @@ -792,10 +796,8 @@ func (cs *ControllerServer) CreateSnapshot( // request to create snapshot. // TODO: For this purpose we could make use of cached clusterAdditionalInfo // too. - volClient := core.NewSubVolume(parentVolOptions.GetConnection(), - &parentVolOptions.SubVolume, - parentVolOptions.ClusterID, - cs.ClusterName) + volClient := core.NewSubVolume(parentVolOptions.GetConnection(), &parentVolOptions.SubVolume, + parentVolOptions.ClusterID, cs.ClusterName, cs.SetMetadata) info, err := volClient.GetSubVolumeInfo(ctx) if err != nil { // Check error code value against ErrInvalidCommand to understand the cluster @@ -998,7 +1000,7 @@ func (cs *ControllerServer) DeleteSnapshot( } defer cs.OperationLocks.ReleaseDeleteLock(snapshotID) - volOpt, snapInfo, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, cs.ClusterName) + volOpt, snapInfo, sid, err := store.NewSnapshotOptionsFromID(ctx, snapshotID, cr, cs.ClusterName, cs.SetMetadata) if err != nil { switch { case errors.Is(err, util.ErrPoolNotFound): diff --git a/internal/cephfs/core/metadata.go b/internal/cephfs/core/metadata.go index bb02e0a9e..d124d2eda 100644 --- a/internal/cephfs/core/metadata.go +++ b/internal/cephfs/core/metadata.go @@ -93,6 +93,10 @@ func (s *subVolumeClient) removeMetadata(key string) error { // SetAllMetadata set all the metadata from arg parameters on Ssubvolume. func (s *subVolumeClient) SetAllMetadata(parameters map[string]string) error { + if !s.enableMetadata { + return nil + } + for k, v := range parameters { err := s.setMetadata(k, v) if err != nil { @@ -113,6 +117,10 @@ func (s *subVolumeClient) SetAllMetadata(parameters map[string]string) error { // UnsetAllMetadata unset all the metadata from arg keys on subvolume. func (s *subVolumeClient) UnsetAllMetadata(keys []string) error { + if !s.enableMetadata { + return nil + } + for _, key := range keys { err := s.removeMetadata(key) // TODO: replace string comparison with errno. diff --git a/internal/cephfs/core/volume.go b/internal/cephfs/core/volume.go index 61e32c3bb..316d2c7cd 100644 --- a/internal/cephfs/core/volume.go +++ b/internal/cephfs/core/volume.go @@ -81,10 +81,11 @@ type SubVolumeClient interface { // subVolumeClient implements SubVolumeClient interface. type subVolumeClient struct { - *SubVolume // Embedded SubVolume struct. - clusterID string // Cluster ID to check subvolumegroup and resize functionality. - clusterName string // Cluster name - conn *util.ClusterConnection // Cluster connection. + *SubVolume // Embedded SubVolume struct. + clusterID string // Cluster ID to check subvolumegroup and resize functionality. + clusterName string // Cluster name + enableMetadata bool // Set metadata on volume + conn *util.ClusterConnection // Cluster connection. } // SubVolume holds the information about the subvolume. @@ -98,12 +99,19 @@ type SubVolume struct { } // NewSubVolume returns a new subvolume client. -func NewSubVolume(conn *util.ClusterConnection, vol *SubVolume, clusterID, clusterName string) SubVolumeClient { +func NewSubVolume( + conn *util.ClusterConnection, + vol *SubVolume, + clusterID, + clusterName string, + setMetadata bool, +) SubVolumeClient { return &subVolumeClient{ - SubVolume: vol, - clusterID: clusterID, - clusterName: clusterName, - conn: conn, + SubVolume: vol, + clusterID: clusterID, + clusterName: clusterName, + enableMetadata: setMetadata, + conn: conn, } } diff --git a/internal/cephfs/driver.go b/internal/cephfs/driver.go index 94d4d2d4d..5261d12aa 100644 --- a/internal/cephfs/driver.go +++ b/internal/cephfs/driver.go @@ -136,6 +136,7 @@ func (fs *Driver) Run(conf *util.Config) { if conf.IsControllerServer { fs.cs = NewControllerServer(fs.cd) fs.cs.ClusterName = conf.ClusterName + fs.cs.SetMetadata = conf.SetMetadata } if !conf.IsControllerServer && !conf.IsNodeServer { topology, err = util.GetTopologyFromDomainLabels(conf.DomainLabels, conf.NodeID, conf.DriverName) diff --git a/internal/cephfs/nodeserver.go b/internal/cephfs/nodeserver.go index d8cdf0063..cb540541f 100644 --- a/internal/cephfs/nodeserver.go +++ b/internal/cephfs/nodeserver.go @@ -82,7 +82,7 @@ func (ns *NodeServer) getVolumeOptions( volContext, volSecrets map[string]string, ) (*store.VolumeOptions, error) { - volOptions, _, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), volContext, volSecrets, "") + volOptions, _, err := store.NewVolumeOptionsFromVolID(ctx, string(volID), volContext, volSecrets, "", false) if err != nil { if !errors.Is(err, cerrors.ErrInvalidVolID) { return nil, status.Error(codes.Internal, err.Error()) diff --git a/internal/cephfs/store/backingsnapshot.go b/internal/cephfs/store/backingsnapshot.go index d9500e28c..b57321ceb 100644 --- a/internal/cephfs/store/backingsnapshot.go +++ b/internal/cephfs/store/backingsnapshot.go @@ -35,6 +35,7 @@ func AddSnapshotBackedVolumeRef( ctx context.Context, volOptions *VolumeOptions, clusterName string, + setMetadata bool, ) error { ioctx, err := volOptions.conn.GetIoctx(volOptions.MetadataPool) if err != nil { @@ -96,7 +97,8 @@ func AddSnapshotBackedVolumeRef( // There may have been a race between adding a ref to the reftracker and // deleting the backing snapshot. Make sure the snapshot still exists by // trying to retrieve it again. - _, _, _, err = NewSnapshotOptionsFromID(ctx, volOptions.BackingSnapshotID, volOptions.conn.Creds, clusterName) + _, _, _, err = NewSnapshotOptionsFromID(ctx, + volOptions.BackingSnapshotID, volOptions.conn.Creds, clusterName, setMetadata) if err != nil { log.ErrorLog(ctx, "failed to get backing snapshot %s: %v", volOptions.BackingSnapshotID, err) } diff --git a/internal/cephfs/store/fsjournal.go b/internal/cephfs/store/fsjournal.go index 83ef1d3c7..11b836a6d 100644 --- a/internal/cephfs/store/fsjournal.go +++ b/internal/cephfs/store/fsjournal.go @@ -79,6 +79,7 @@ func CheckVolExists(ctx context.Context, sID *SnapshotIdentifier, cr *util.Credentials, clusterName string, + setMetadata bool, ) (*VolumeIdentifier, error) { var vid VolumeIdentifier // Connect to cephfs' default radosNamespace (csi) @@ -100,7 +101,7 @@ func CheckVolExists(ctx context.Context, vid.FsSubvolName = imageData.ImageAttributes.ImageName volOptions.VolID = vid.FsSubvolName - vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName) + vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName, setMetadata) if (sID != nil || pvID != nil) && imageData.ImageAttributes.BackingSnapshotID == "" { cloneState, cloneStateErr := vol.GetCloneState(ctx) if cloneStateErr != nil { diff --git a/internal/cephfs/store/volumeoptions.go b/internal/cephfs/store/volumeoptions.go index 29dbb3742..937f2c4fa 100644 --- a/internal/cephfs/store/volumeoptions.go +++ b/internal/cephfs/store/volumeoptions.go @@ -196,7 +196,12 @@ func fmtBackingSnapshotOptionMismatch(optName, expected, actual string) error { // NewVolumeOptions generates a new instance of volumeOptions from the provided // CSI request parameters. -func NewVolumeOptions(ctx context.Context, requestName, clusterName string, req *csi.CreateVolumeRequest, +func NewVolumeOptions( + ctx context.Context, + requestName, + clusterName string, + setMetadata bool, + req *csi.CreateVolumeRequest, cr *util.Credentials, ) (*VolumeOptions, error) { var ( @@ -289,7 +294,7 @@ func NewVolumeOptions(ctx context.Context, requestName, clusterName string, req opts.BackingSnapshotID = req.GetVolumeContentSource().GetSnapshot().GetSnapshotId() - err = opts.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName) + err = opts.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName, setMetadata) if err != nil { return nil, err } @@ -305,6 +310,7 @@ func NewVolumeOptionsFromVolID( volID string, volOpt, secrets map[string]string, clusterName string, + setMetadata bool, ) (*VolumeOptions, *VolumeIdentifier, error) { var ( vi util.CSIIdentifier @@ -408,16 +414,20 @@ func NewVolumeOptionsFromVolID( volOptions.SubVolume.VolID = vid.FsSubvolName if volOptions.BackingSnapshot { - err = volOptions.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName) + err = volOptions.populateVolumeOptionsFromBackingSnapshot(ctx, cr, clusterName, setMetadata) } else { - err = volOptions.populateVolumeOptionsFromSubvolume(ctx, clusterName) + err = volOptions.populateVolumeOptionsFromSubvolume(ctx, clusterName, setMetadata) } return &volOptions, &vid, err } -func (vo *VolumeOptions) populateVolumeOptionsFromSubvolume(ctx context.Context, clusterName string) error { - vol := core.NewSubVolume(vo.conn, &vo.SubVolume, vo.ClusterID, clusterName) +func (vo *VolumeOptions) populateVolumeOptionsFromSubvolume( + ctx context.Context, + clusterName string, + setMetadata bool, +) error { + vol := core.NewSubVolume(vo.conn, &vo.SubVolume, vo.ClusterID, clusterName, setMetadata) var info *core.Subvolume info, err := vol.GetSubVolumeInfo(ctx) @@ -438,6 +448,7 @@ func (vo *VolumeOptions) populateVolumeOptionsFromBackingSnapshot( ctx context.Context, cr *util.Credentials, clusterName string, + setMetadata bool, ) error { // As of CephFS snapshot v2 API, snapshots may be found in two locations: // @@ -459,7 +470,8 @@ func (vo *VolumeOptions) populateVolumeOptionsFromBackingSnapshot( return nil } - parentBackingSnapVolOpts, _, snapID, err := NewSnapshotOptionsFromID(ctx, vo.BackingSnapshotID, cr, clusterName) + parentBackingSnapVolOpts, _, snapID, err := NewSnapshotOptionsFromID(ctx, + vo.BackingSnapshotID, cr, clusterName, setMetadata) if err != nil { return fmt.Errorf("failed to retrieve backing snapshot %s: %w", vo.BackingSnapshotID, err) } @@ -655,6 +667,7 @@ func NewSnapshotOptionsFromID( snapID string, cr *util.Credentials, clusterName string, + setMetadata bool, ) (*VolumeOptions, *core.SnapshotInfo, *SnapshotIdentifier, error) { var ( vi util.CSIIdentifier @@ -726,7 +739,7 @@ func NewSnapshotOptionsFromID( sid.FsSubvolName = imageAttributes.SourceName volOptions.SubVolume.VolID = sid.FsSubvolName - vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName) + vol := core.NewSubVolume(volOptions.conn, &volOptions.SubVolume, volOptions.ClusterID, clusterName, setMetadata) subvolInfo, err := vol.GetSubVolumeInfo(ctx) if err != nil { From 30244bf11ba1b5b4e946de61622dc9a693d4ba22 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Thu, 28 Jul 2022 17:56:55 +0530 Subject: [PATCH 26/37] cephfs: snapshots honor `--setmetadata` option `--setmetadata` is false by default, honoring it will keep the metadata disabled by default Signed-off-by: Prasanna Kumar Kalever --- internal/cephfs/controllerserver.go | 30 ++++++++--------------- internal/cephfs/core/clone.go | 6 ++--- internal/cephfs/core/snapshot.go | 17 +++++++------ internal/cephfs/core/snapshot_metadata.go | 8 ++++++ internal/cephfs/store/fsjournal.go | 4 ++- internal/cephfs/store/volumeoptions.go | 2 +- 6 files changed, 35 insertions(+), 32 deletions(-) diff --git a/internal/cephfs/controllerserver.go b/internal/cephfs/controllerserver.go index e012ca4e9..87f1d2617 100644 --- a/internal/cephfs/controllerserver.go +++ b/internal/cephfs/controllerserver.go @@ -601,13 +601,8 @@ func (cs *ControllerServer) cleanUpBackingVolume( return status.Error(codes.Internal, err.Error()) } } else { - snapClient := core.NewSnapshot( - snapParentVolOptions.GetConnection(), - snapID.FsSnapshotName, - volOptions.ClusterID, - cs.ClusterName, - &snapParentVolOptions.SubVolume, - ) + snapClient := core.NewSnapshot(snapParentVolOptions.GetConnection(), snapID.FsSnapshotName, + volOptions.ClusterID, cs.ClusterName, cs.SetMetadata, &snapParentVolOptions.SubVolume) err = deleteSnapshotAndUndoReservation(ctx, snapClient, snapParentVolOptions, snapID, cr) if err != nil { @@ -785,7 +780,7 @@ func (cs *ControllerServer) CreateSnapshot( } defer cs.VolumeLocks.Release(sourceVolID) snapName := req.GetName() - sid, snapInfo, err := store.CheckSnapExists(ctx, parentVolOptions, cephfsSnap, cs.ClusterName, cr) + sid, snapInfo, err := store.CheckSnapExists(ctx, parentVolOptions, cephfsSnap, cs.ClusterName, cs.SetMetadata, cr) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -823,12 +818,8 @@ func (cs *ControllerServer) CreateSnapshot( if sid != nil { // check snapshot is protected protected := true - snapClient := core.NewSnapshot( - parentVolOptions.GetConnection(), - sid.FsSnapshotName, - parentVolOptions.ClusterID, - cs.ClusterName, - &parentVolOptions.SubVolume) + snapClient := core.NewSnapshot(parentVolOptions.GetConnection(), sid.FsSnapshotName, + parentVolOptions.ClusterID, cs.ClusterName, cs.SetMetadata, &parentVolOptions.SubVolume) if !(snapInfo.Protected == core.SnapshotIsProtected) { err = snapClient.ProtectSnapshot(ctx) if err != nil { @@ -872,7 +863,7 @@ func (cs *ControllerServer) CreateSnapshot( } } }() - snap, err := doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, cs.ClusterName, metadata) + snap, err := cs.doSnapshot(ctx, parentVolOptions, sID.FsSnapshotName, metadata) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -888,17 +879,16 @@ func (cs *ControllerServer) CreateSnapshot( }, nil } -func doSnapshot( +func (cs *ControllerServer) doSnapshot( ctx context.Context, volOpt *store.VolumeOptions, - snapshotName, - clusterName string, + snapshotName string, metadata map[string]string, ) (core.SnapshotInfo, error) { snapID := fsutil.VolumeID(snapshotName) snap := core.SnapshotInfo{} snapClient := core.NewSnapshot(volOpt.GetConnection(), snapshotName, - volOpt.ClusterID, clusterName, &volOpt.SubVolume) + volOpt.ClusterID, cs.ClusterName, cs.SetMetadata, &volOpt.SubVolume) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapID, err) @@ -1056,7 +1046,7 @@ func (cs *ControllerServer) DeleteSnapshot( return nil, status.Errorf(codes.FailedPrecondition, "snapshot %s has pending clones", snapshotID) } snapClient := core.NewSnapshot(volOpt.GetConnection(), sid.FsSnapshotName, - volOpt.ClusterID, cs.ClusterName, &volOpt.SubVolume) + volOpt.ClusterID, cs.ClusterName, cs.SetMetadata, &volOpt.SubVolume) if snapInfo.Protected == core.SnapshotIsProtected { err = snapClient.UnprotectSnapshot(ctx) if err != nil { diff --git a/internal/cephfs/core/clone.go b/internal/cephfs/core/clone.go index 1e801750f..8f3a75a4d 100644 --- a/internal/cephfs/core/clone.go +++ b/internal/cephfs/core/clone.go @@ -66,7 +66,7 @@ func (s *subVolumeClient) CreateCloneFromSubvolume( parentvolOpt *SubVolume, ) error { snapshotID := s.VolID - snapClient := NewSnapshot(s.conn, snapshotID, s.clusterID, s.clusterName, parentvolOpt) + snapClient := NewSnapshot(s.conn, snapshotID, s.clusterID, s.clusterName, s.enableMetadata, parentvolOpt) err := snapClient.CreateSnapshot(ctx) if err != nil { log.ErrorLog(ctx, "failed to create snapshot %s %v", snapshotID, err) @@ -165,7 +165,7 @@ func (s *subVolumeClient) CleanupSnapshotFromSubvolume( // snapshot name is same as clone name as we need a name which can be // identified during PVC-PVC cloning. snapShotID := s.VolID - snapClient := NewSnapshot(s.conn, snapShotID, s.clusterID, s.clusterName, parentVol) + snapClient := NewSnapshot(s.conn, snapShotID, s.clusterID, s.clusterName, s.enableMetadata, parentVol) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { @@ -198,7 +198,7 @@ func (s *subVolumeClient) CreateCloneFromSnapshot( ctx context.Context, snap Snapshot, ) error { snapID := snap.SnapshotID - snapClient := NewSnapshot(s.conn, snapID, s.clusterID, s.clusterName, snap.SubVolume) + snapClient := NewSnapshot(s.conn, snapID, s.clusterID, s.clusterName, s.enableMetadata, snap.SubVolume) err := snapClient.CloneSnapshot(ctx, s.SubVolume) if err != nil { return err diff --git a/internal/cephfs/core/snapshot.go b/internal/cephfs/core/snapshot.go index 4de877c2e..b1994266e 100644 --- a/internal/cephfs/core/snapshot.go +++ b/internal/cephfs/core/snapshot.go @@ -61,10 +61,11 @@ type SnapshotClient interface { // snapshotClient is the implementation of SnapshotClient interface. type snapshotClient struct { - *Snapshot // Embedded snapshot struct. - clusterID string // Cluster ID. - clusterName string // Cluster Name. - conn *util.ClusterConnection // Cluster connection. + *Snapshot // Embedded snapshot struct. + clusterID string // Cluster ID. + clusterName string // Cluster Name. + enableMetadata bool // Set metadata on volume + conn *util.ClusterConnection // Cluster connection. } // Snapshot represents a subvolume snapshot and its cluster information. @@ -79,6 +80,7 @@ func NewSnapshot( snapshotID, clusterID, clusterName string, + setMetadata bool, vol *SubVolume, ) SnapshotClient { return &snapshotClient{ @@ -86,9 +88,10 @@ func NewSnapshot( SnapshotID: snapshotID, SubVolume: vol, }, - clusterID: clusterID, - clusterName: clusterName, - conn: conn, + clusterID: clusterID, + clusterName: clusterName, + enableMetadata: setMetadata, + conn: conn, } } diff --git a/internal/cephfs/core/snapshot_metadata.go b/internal/cephfs/core/snapshot_metadata.go index 060a7bbcb..5d00798c7 100644 --- a/internal/cephfs/core/snapshot_metadata.go +++ b/internal/cephfs/core/snapshot_metadata.go @@ -91,6 +91,10 @@ func (s *snapshotClient) removeSnapshotMetadata(key string) error { // SetAllSnapshotMetadata set all the metadata from arg parameters on // subvolume snapshot. func (s *snapshotClient) SetAllSnapshotMetadata(parameters map[string]string) error { + if !s.enableMetadata { + return nil + } + for k, v := range parameters { err := s.setSnapshotMetadata(k, v) if err != nil { @@ -113,6 +117,10 @@ func (s *snapshotClient) SetAllSnapshotMetadata(parameters map[string]string) er // UnsetAllSnapshotMetadata unset all the metadata from arg keys on subvolume // snapshot. func (s *snapshotClient) UnsetAllSnapshotMetadata(keys []string) error { + if !s.enableMetadata { + return nil + } + for _, key := range keys { err := s.removeSnapshotMetadata(key) // TODO: replace string comparison with errno. diff --git a/internal/cephfs/store/fsjournal.go b/internal/cephfs/store/fsjournal.go index 11b836a6d..d2a7e0678 100644 --- a/internal/cephfs/store/fsjournal.go +++ b/internal/cephfs/store/fsjournal.go @@ -379,6 +379,7 @@ func CheckSnapExists( volOptions *VolumeOptions, snap *SnapshotOption, clusterName string, + setMetadata bool, cr *util.Credentials, ) (*SnapshotIdentifier, *core.SnapshotInfo, error) { // Connect to cephfs' default radosNamespace (csi) @@ -400,7 +401,8 @@ func CheckSnapExists( snapUUID := snapData.ImageUUID snapID := snapData.ImageAttributes.ImageName sid.FsSnapshotName = snapData.ImageAttributes.ImageName - snapClient := core.NewSnapshot(volOptions.conn, snapID, volOptions.ClusterID, clusterName, &volOptions.SubVolume) + snapClient := core.NewSnapshot(volOptions.conn, snapID, + volOptions.ClusterID, clusterName, setMetadata, &volOptions.SubVolume) snapInfo, err := snapClient.GetSnapshotInfo(ctx) if err != nil { if errors.Is(err, cerrors.ErrSnapNotFound) { diff --git a/internal/cephfs/store/volumeoptions.go b/internal/cephfs/store/volumeoptions.go index 937f2c4fa..044f1c7fd 100644 --- a/internal/cephfs/store/volumeoptions.go +++ b/internal/cephfs/store/volumeoptions.go @@ -749,7 +749,7 @@ func NewSnapshotOptionsFromID( volOptions.Size = subvolInfo.BytesQuota volOptions.RootPath = subvolInfo.Path snap := core.NewSnapshot(volOptions.conn, sid.FsSnapshotName, - volOptions.ClusterID, clusterName, &volOptions.SubVolume) + volOptions.ClusterID, clusterName, setMetadata, &volOptions.SubVolume) info, err := snap.GetSnapshotInfo(ctx) if err != nil { return &volOptions, nil, &sid, err From c0a566b5ed7fbd07f6e3cbbc59cdb34d81e5ee97 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Fri, 29 Jul 2022 10:58:34 +0530 Subject: [PATCH 27/37] deploy: add setmetadata=true in the templates setmetadata on the volume by default, otherwise e2e will fail Signed-off-by: Prasanna Kumar Kalever --- charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml | 1 + charts/ceph-csi-cephfs/values.yaml | 3 +++ deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml | 1 + 3 files changed, 5 insertions(+) diff --git a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml index 16ddd5d1a..6d3c371cb 100644 --- a/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml +++ b/charts/ceph-csi-cephfs/templates/provisioner-deployment.yaml @@ -128,6 +128,7 @@ spec: {{- if .Values.provisioner.clustername }} - "--clustername={{ .Values.provisioner.clustername }}" {{- end }} + - "--setmetadata={{ .Values.provisioner.setmetadata }}" env: - name: POD_IP valueFrom: diff --git a/charts/ceph-csi-cephfs/values.yaml b/charts/ceph-csi-cephfs/values.yaml index 0ad9d5253..369674c68 100644 --- a/charts/ceph-csi-cephfs/values.yaml +++ b/charts/ceph-csi-cephfs/values.yaml @@ -180,6 +180,9 @@ provisioner: pullPolicy: IfNotPresent resources: {} + # set metadata on volume + setmetadata: true + resizer: name: resizer enabled: true diff --git a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml index d6d2d1caa..bc2ae95e0 100644 --- a/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml +++ b/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml @@ -105,6 +105,7 @@ spec: - "--drivername=cephfs.csi.ceph.com" - "--pidlimit=-1" - "--enableprofiling=false" + - "--setmetadata=true" env: - name: POD_IP valueFrom: From b4f44a43d56ecc0613f0e73e9f06dada784dafa2 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Fri, 29 Jul 2022 13:07:23 +0530 Subject: [PATCH 28/37] doc: Add documentation about `--setmetadata` option Signed-off-by: Prasanna Kumar Kalever --- charts/ceph-csi-cephfs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/ceph-csi-cephfs/README.md b/charts/ceph-csi-cephfs/README.md index 4fd98aab8..3e8ec4bc7 100644 --- a/charts/ceph-csi-cephfs/README.md +++ b/charts/ceph-csi-cephfs/README.md @@ -107,6 +107,7 @@ charts and their default values. | `provisioner.replicaCount` | Specifies the replicaCount | `3` | | `provisioner.timeout` | GRPC timeout for waiting for creation or deletion of a volume | `60s` | | `provisioner.clustername` | Cluster name to set on the subvolume | "" | +| `provisioner.setmetadata` | Set metadata on volume | `true` | | `provisioner.priorityClassName` | Set user created priorityclassName for csi provisioner pods. Default is `system-cluster-critical` which is less priority than `system-node-critical` | `system-cluster-critical` | | `provisioner.enableHostNetwork` | Specifies whether hostNetwork is enabled for provisioner pod. | `false` | | `provisioner.profiling.enabled` | Specifies whether profiling should be enabled | `false` | From bc9ad3d9f16f99929d72539cffe73c46b14eeb7c Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Wed, 20 Jul 2022 13:50:20 +0530 Subject: [PATCH 29/37] rbd: add dummy attacher implementation previously, it was a requirement to have attacher sidecar for CSI drivers and there had an implementation of dummy mode of operation. However skipAttach implementation has been stabilized and the dummy mode of operation is going to be removed from the external-attacher. Considering this driver work on volumeattachment objects for NBD driver use cases, we have to implement dummy controllerpublish and unpublish and thus keep supporting our operations even in absence of dummy mode of operation in the sidecar. This commit make a NOOP controller publish and unpublish for RBD driver. CephFS driver does not require attacher and it has already been made free from the attachment operations. Ref# https://github.com/ceph/ceph-csi/pull/3149 Ref# https://github.com/kubernetes-csi/external-attacher/issues/226 Signed-off-by: Humble Chirammal --- internal/rbd/controllerserver.go | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index c94790553..2814813d1 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -1587,3 +1587,36 @@ func (cs *ControllerServer) ControllerExpandVolume( NodeExpansionRequired: nodeExpansion, }, nil } + +// ControllerPublishVolume is a dummy publish implementation to mimic a successful attach operation being a NOOP. +func (cs *ControllerServer) ControllerPublishVolume( + ctx context.Context, + req *csi.ControllerPublishVolumeRequest, +) (*csi.ControllerPublishVolumeResponse, error) { + if req.GetVolumeId() == "" { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + if req.GetNodeId() == "" { + return nil, status.Error(codes.InvalidArgument, "Node ID cannot be empty") + } + if req.GetVolumeCapability() == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capabilities cannot be empty") + } + + return &csi.ControllerPublishVolumeResponse{ + // the dummy response carry an empty map in its response. + PublishContext: map[string]string{}, + }, nil +} + +// ControllerUnPublishVolume is a dummy unpublish implementation to mimic a successful attach operation being a NOOP. +func (cs *ControllerServer) ControllerUnpublishVolume( + ctx context.Context, + req *csi.ControllerUnpublishVolumeRequest, +) (*csi.ControllerUnpublishVolumeResponse, error) { + if req.GetVolumeId() == "" { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + return &csi.ControllerUnpublishVolumeResponse{}, nil +} From f0074a3ebf6dc5358138ea34bf282226b4cb5670 Mon Sep 17 00:00:00 2001 From: Yati Padia Date: Wed, 20 Jul 2022 12:04:10 +0530 Subject: [PATCH 30/37] deploy: enable HonorPVReclaimPolicy feature gate This commit enables the HonorPVReclaimPolicy feature gate. fixes: #3230 Signed-off-by: Yati Padia --- deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml | 4 +--- deploy/nfs/kubernetes/csi-provisioner-rbac.yaml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml b/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml index 61f105906..021ca0b91 100644 --- a/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml +++ b/deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml @@ -47,9 +47,7 @@ spec: - "--timeout=150s" - "--leader-election=true" - "--retry-interval-start=500ms" - # TODO: enable the feature-gate once error has been handled in nfs. - # Issue #3230 - # - "--feature-gates=HonorPVReclaimPolicy=true" + - "--feature-gates=HonorPVReclaimPolicy=true" - "--prevent-volume-mode-conversion=true" env: - name: ADDRESS diff --git a/deploy/nfs/kubernetes/csi-provisioner-rbac.yaml b/deploy/nfs/kubernetes/csi-provisioner-rbac.yaml index 0fd3fa697..5fa71cf4a 100644 --- a/deploy/nfs/kubernetes/csi-provisioner-rbac.yaml +++ b/deploy/nfs/kubernetes/csi-provisioner-rbac.yaml @@ -20,7 +20,7 @@ rules: verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: [""] resources: ["persistentvolumes"] - verbs: ["get", "list", "watch", "create", "delete", "patch"] + verbs: ["get", "list", "watch", "create", "update", "delete", "patch"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] From a6cd56ae7ea839c7fece49dcff6654db61bb2af5 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Thu, 21 Jul 2022 11:26:45 +0200 Subject: [PATCH 31/37] e2e: correct failure logging for NFS Some of the steps still refer to CephFS, likely missed some replacements while copy/pasting. The logging is a little confusing when messages claim something with CephFS failed, but the test is about NFS. Signed-off-by: Niels de Vos --- e2e/nfs.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/e2e/nfs.go b/e2e/nfs.go index 061fb6bac..874346e28 100644 --- a/e2e/nfs.go +++ b/e2e/nfs.go @@ -373,7 +373,7 @@ var _ = Describe("nfs", func() { By("verify RWOP volume support", func() { err := createNFSStorageClass(f.ClientSet, f, false, nil) if err != nil { - e2elog.Failf("failed to create CephFS storageclass: %v", err) + e2elog.Failf("failed to create NFS storageclass: %v", err) } pvc, err := loadPVC(pvcRWOPPath) if err != nil { @@ -411,40 +411,40 @@ var _ = Describe("nfs", func() { validateSubvolumeCount(f, 0, fileSystemName, defaultSubvolumegroup) err = deleteResource(nfsExamplePath + "storageclass.yaml") if err != nil { - e2elog.Failf("failed to delete CephFS storageclass: %v", err) + e2elog.Failf("failed to delete NFS storageclass: %v", err) } }) By("create a storageclass with pool and a PVC then bind it to an app", func() { err := createNFSStorageClass(f.ClientSet, f, false, nil) if err != nil { - e2elog.Failf("failed to create CephFS storageclass: %v", err) + e2elog.Failf("failed to create NFS storageclass: %v", err) } err = validatePVCAndAppBinding(pvcPath, appPath, f) if err != nil { - e2elog.Failf("failed to validate CephFS pvc and application binding: %v", err) + e2elog.Failf("failed to validate NFS pvc and application binding: %v", err) } err = deleteResource(nfsExamplePath + "storageclass.yaml") if err != nil { - e2elog.Failf("failed to delete CephFS storageclass: %v", err) + e2elog.Failf("failed to delete NFS storageclass: %v", err) } }) By("create a PVC and bind it to an app", func() { err := createNFSStorageClass(f.ClientSet, f, false, nil) if err != nil { - e2elog.Failf("failed to create CephFS storageclass: %v", err) + e2elog.Failf("failed to create NFS storageclass: %v", err) } err = validatePVCAndAppBinding(pvcPath, appPath, f) if err != nil { - e2elog.Failf("failed to validate CephFS pvc and application binding: %v", err) + e2elog.Failf("failed to validate NFS pvc and application binding: %v", err) } }) By("create a PVC and bind it to an app with normal user", func() { err := validateNormalUserPVCAccess(pvcPath, f) if err != nil { - e2elog.Failf("failed to validate normal user CephFS pvc and application binding: %v", err) + e2elog.Failf("failed to validate normal user NFS pvc and application binding: %v", err) } }) From 0a173a8a9ee1313870014ab9fd63faa7f66514b7 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 19 Jul 2022 17:09:37 +0200 Subject: [PATCH 32/37] nfs: make DeleteVolume (more) idempotent Signed-off-by: Niels de Vos --- internal/nfs/controller/controllerserver.go | 6 +-- internal/nfs/controller/errors.go | 43 +++++++++++++++++++++ internal/nfs/controller/volume.go | 31 ++++++++++----- 3 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 internal/nfs/controller/errors.go diff --git a/internal/nfs/controller/controllerserver.go b/internal/nfs/controller/controllerserver.go index 3c0330a15..0b3b8c61d 100644 --- a/internal/nfs/controller/controllerserver.go +++ b/internal/nfs/controller/controllerserver.go @@ -18,7 +18,7 @@ package controller import ( "context" - "strings" + "errors" "github.com/ceph/ceph-csi/internal/cephfs" "github.com/ceph/ceph-csi/internal/cephfs/store" @@ -147,11 +147,11 @@ func (cs *Server) DeleteVolume( err = nfsVolume.DeleteExport() // if the export does not exist, continue with deleting the backend volume - if err != nil && !strings.Contains(err.Error(), "Export does not exist") { + if err != nil && !errors.Is(err, ErrNotFound) { return nil, status.Errorf(codes.InvalidArgument, "failed to delete export: %v", err) } - log.DebugLog(ctx, "deleted NFS-export: %s", nfsVolume) + log.DebugLog(ctx, "NFS-export %q has been deleted", nfsVolume) return cs.backendServer.DeleteVolume(ctx, req) } diff --git a/internal/nfs/controller/errors.go b/internal/nfs/controller/errors.go new file mode 100644 index 000000000..c206afb03 --- /dev/null +++ b/internal/nfs/controller/errors.go @@ -0,0 +1,43 @@ +/* +Copyright 2022 The Ceph-CSI Authors. + +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 controller + +import ( + "errors" + "fmt" +) + +var ( + // ErrNotConnected is returned when components from the NFS + // ControllerServer can not connect to the Ceph cluster or NFS-Ganesha + // service. + ErrNotConnected = errors.New("not connected") + + // ErrNotFound is a generic error that is the parent of other "not + // found" failures. Callers can check if something was "not found", + // even if the actual error is more specific. + ErrNotFound = errors.New("not found") + + // ErrExportNotFound is returned by components that communicate with the + // NFS-Ganesha service, and have identified that the NFS-Export does + // not exist (anymore). This error is also a ErrNotFound. + ErrExportNotFound = fmt.Errorf("NFS-export %w", ErrNotFound) + + // ErrFilesystemNotFound is returned in case the filesystem + // does not exist. + ErrFilesystemNotFound = fmt.Errorf("filesystem %w", ErrNotFound) +) diff --git a/internal/nfs/controller/volume.go b/internal/nfs/controller/volume.go index 2177ce904..33f9a3fcd 100644 --- a/internal/nfs/controller/volume.go +++ b/internal/nfs/controller/volume.go @@ -18,6 +18,7 @@ package controller import ( "context" + "errors" "fmt" "strings" @@ -124,7 +125,7 @@ func (nv *NFSVolume) GetExportPath() string { // a new NFS-export for the volume on the Ceph managed NFS-server. func (nv *NFSVolume) CreateExport(backend *csi.Volume) error { if !nv.connected { - return fmt.Errorf("can not created export for %q: not connected", nv) + return fmt.Errorf("can not created export for %q: %w", nv, ErrNotConnected) } fs := backend.VolumeContext["fsName"] @@ -213,6 +214,8 @@ func (nv *NFSVolume) DeleteExport() error { return nil case strings.Contains(err.Error(), "API call not implemented"): // try with the old command break + case strings.Contains(err.Error(), "Export does not exist"): + return ErrExportNotFound default: // any other error return fmt.Errorf("failed to remove %q from NFS-cluster %q: "+ "%w", nv, nfsCluster, err) @@ -251,17 +254,21 @@ func (nv *NFSVolume) deleteExportCommand(cmd, nfsCluster string) []string { // getNFSCluster fetches the NFS-cluster name from the CephFS journal. func (nv *NFSVolume) getNFSCluster() (string, error) { if !nv.connected { - return "", fmt.Errorf("can not get NFS-cluster for %q: not connected", nv) + return "", fmt.Errorf("can not get NFS-cluster for %q: %w", nv, ErrNotConnected) } fs := fscore.NewFileSystem(nv.conn) fsName, err := fs.GetFsName(nv.ctx, nv.fscID) - if err != nil { + if err != nil && errors.Is(err, util.ErrPoolNotFound) { + return "", fmt.Errorf("%w for ID %x: %v", ErrFilesystemNotFound, nv.fscID, err) + } else if err != nil { return "", fmt.Errorf("failed to get filesystem name for ID %x: %w", nv.fscID, err) } mdPool, err := fs.GetMetadataPool(nv.ctx, fsName) - if err != nil { + if err != nil && errors.Is(err, util.ErrPoolNotFound) { + return "", fmt.Errorf("metadata pool for %q %w: %v", fsName, ErrNotFound, err) + } else if err != nil { return "", fmt.Errorf("failed to get metadata pool for %q: %w", fsName, err) } @@ -273,8 +280,10 @@ func (nv *NFSVolume) getNFSCluster() (string, error) { defer j.Destroy() clusterName, err := j.FetchAttribute(nv.ctx, mdPool, nv.objectUUID, clusterNameKey) - if err != nil { - return "", fmt.Errorf("failed to get cluster name: %w", err) + if err != nil && errors.Is(err, util.ErrPoolNotFound) || errors.Is(err, util.ErrKeyNotFound) { + return "", fmt.Errorf("cluster name for %q %w: %v", nv.objectUUID, ErrNotFound, err) + } else if err != nil { + return "", fmt.Errorf("failed to get cluster name for %q: %w", nv.objectUUID, err) } return clusterName, nil @@ -283,17 +292,21 @@ func (nv *NFSVolume) getNFSCluster() (string, error) { // setNFSCluster stores the NFS-cluster name in the CephFS journal. func (nv *NFSVolume) setNFSCluster(clusterName string) error { if !nv.connected { - return fmt.Errorf("can not set NFS-cluster for %q: not connected", nv) + return fmt.Errorf("can not set NFS-cluster for %q: %w", nv, ErrNotConnected) } fs := fscore.NewFileSystem(nv.conn) fsName, err := fs.GetFsName(nv.ctx, nv.fscID) - if err != nil { + if err != nil && errors.Is(err, util.ErrPoolNotFound) { + return fmt.Errorf("%w for ID %x: %v", ErrFilesystemNotFound, nv.fscID, err) + } else if err != nil { return fmt.Errorf("failed to get filesystem name for ID %x: %w", nv.fscID, err) } mdPool, err := fs.GetMetadataPool(nv.ctx, fsName) - if err != nil { + if err != nil && errors.Is(err, util.ErrPoolNotFound) { + return fmt.Errorf("metadata pool for %q %w: %v", fsName, ErrNotFound, err) + } else if err != nil { return fmt.Errorf("failed to get metadata pool for %q: %w", fsName, err) } From 3c3cbc8005bb493d6bfe50ac344f809576b4b730 Mon Sep 17 00:00:00 2001 From: Pedro Alvarez Date: Tue, 2 Aug 2022 17:22:42 +0200 Subject: [PATCH 33/37] doc: update relative path to ceph-config.yaml file Signed-off-by: Pedro Alvarez --- docs/deploy-cephfs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-cephfs.md b/docs/deploy-cephfs.md index 59a0f7b33..037b0ac4d 100644 --- a/docs/deploy-cephfs.md +++ b/docs/deploy-cephfs.md @@ -164,7 +164,7 @@ for more information. **Deploy Ceph configuration ConfigMap for CSI pods:** ```bash -kubectl create -f ../example/ceph-config.yaml +kubectl create -f ../../../example/ceph-config.yaml ``` **Deploy CSI sidecar containers:** From 533994daff124c85d32ff55711ab95dce93a6583 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Fri, 15 Jul 2022 11:53:35 +0200 Subject: [PATCH 34/37] rebase: update k8s.io/mount-utils to current master kubernetes/kubernetes#111083 has been merged and synced into k8s.io/mount-utils. This should remove any systemd log messages while calling NodeStageVolume and NodeGetVolumeStats. Signed-off-by: Niels de Vos --- go.mod | 9 +- go.sum | 51 +- vendor/github.com/go-logr/logr/README.md | 4 + vendor/github.com/go-logr/logr/logr.go | 20 +- vendor/github.com/moby/sys/mountinfo/LICENSE | 202 +++ vendor/github.com/moby/sys/mountinfo/doc.go | 44 + .../moby/sys/mountinfo/mounted_linux.go | 101 ++ .../moby/sys/mountinfo/mounted_unix.go | 54 + .../moby/sys/mountinfo/mountinfo.go | 67 + .../moby/sys/mountinfo/mountinfo_bsd.go | 72 + .../moby/sys/mountinfo/mountinfo_filters.go | 63 + .../moby/sys/mountinfo/mountinfo_linux.go | 214 +++ .../sys/mountinfo/mountinfo_unsupported.go | 19 + .../moby/sys/mountinfo/mountinfo_windows.go | 10 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 2 +- vendor/golang.org/x/sys/unix/ioctl_linux.go | 23 + vendor/golang.org/x/sys/unix/mkerrors.sh | 3 + vendor/golang.org/x/sys/unix/syscall_aix.go | 16 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 24 +- .../golang.org/x/sys/unix/syscall_darwin.go | 4 +- .../x/sys/unix/syscall_dragonfly.go | 4 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 4 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 33 +- .../x/sys/unix/syscall_linux_386.go | 12 +- .../x/sys/unix/syscall_linux_amd64.go | 5 +- .../x/sys/unix/syscall_linux_arm.go | 5 +- .../x/sys/unix/syscall_linux_arm64.go | 5 +- .../x/sys/unix/syscall_linux_mips64x.go | 5 +- .../x/sys/unix/syscall_linux_mipsx.go | 5 +- .../x/sys/unix/syscall_linux_ppc.go | 5 +- .../x/sys/unix/syscall_linux_ppc64x.go | 5 +- .../x/sys/unix/syscall_linux_riscv64.go | 5 +- .../x/sys/unix/syscall_linux_s390x.go | 13 +- .../x/sys/unix/syscall_linux_sparc64.go | 5 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 4 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 4 +- .../golang.org/x/sys/unix/syscall_solaris.go | 28 +- vendor/golang.org/x/sys/unix/syscall_unix.go | 51 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 17 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 4 +- .../x/sys/unix/zsyscall_aix_ppc64.go | 4 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 4 +- .../x/sys/unix/zsyscall_darwin_arm64.go | 4 +- .../x/sys/unix/zsyscall_freebsd_386.go | 4 +- .../x/sys/unix/zsyscall_freebsd_amd64.go | 4 +- .../x/sys/unix/zsyscall_freebsd_arm.go | 4 +- .../x/sys/unix/zsyscall_freebsd_arm64.go | 4 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 10 + .../x/sys/unix/zsyscall_linux_386.go | 4 +- .../x/sys/unix/zsyscall_linux_amd64.go | 15 +- .../x/sys/unix/zsyscall_linux_arm.go | 15 +- .../x/sys/unix/zsyscall_linux_arm64.go | 15 +- .../x/sys/unix/zsyscall_linux_mips.go | 15 +- .../x/sys/unix/zsyscall_linux_mips64.go | 15 +- .../x/sys/unix/zsyscall_linux_mips64le.go | 15 +- .../x/sys/unix/zsyscall_linux_mipsle.go | 15 +- .../x/sys/unix/zsyscall_linux_ppc.go | 15 +- .../x/sys/unix/zsyscall_linux_ppc64.go | 15 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 15 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 15 +- .../x/sys/unix/zsyscall_linux_s390x.go | 4 +- .../x/sys/unix/zsyscall_linux_sparc64.go | 15 +- .../x/sys/unix/zsyscall_netbsd_386.go | 4 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 4 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 4 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 4 +- .../x/sys/unix/zsyscall_openbsd_386.go | 4 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 4 +- .../x/sys/unix/zsyscall_openbsd_arm.go | 4 +- .../x/sys/unix/zsyscall_openbsd_arm64.go | 4 +- .../x/sys/unix/zsyscall_openbsd_mips64.go | 4 +- .../x/sys/unix/zsyscall_solaris_amd64.go | 16 +- vendor/golang.org/x/sys/unix/ztypes_linux.go | 1462 +++++++++++++++++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 7 + .../x/sys/unix/ztypes_linux_amd64.go | 8 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 7 + .../x/sys/unix/ztypes_linux_arm64.go | 8 + .../x/sys/unix/ztypes_linux_mips.go | 7 + .../x/sys/unix/ztypes_linux_mips64.go | 8 + .../x/sys/unix/ztypes_linux_mips64le.go | 8 + .../x/sys/unix/ztypes_linux_mipsle.go | 7 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 7 + .../x/sys/unix/ztypes_linux_ppc64.go | 8 + .../x/sys/unix/ztypes_linux_ppc64le.go | 8 + .../x/sys/unix/ztypes_linux_riscv64.go | 8 + .../x/sys/unix/ztypes_linux_s390x.go | 12 +- .../x/sys/unix/ztypes_linux_sparc64.go | 8 + .../x/sys/windows/syscall_windows.go | 42 +- .../x/sys/windows/zsyscall_windows.go | 4 +- vendor/k8s.io/mount-utils/fake_mounter.go | 22 +- vendor/k8s.io/mount-utils/mount.go | 80 +- .../k8s.io/mount-utils/mount_helper_common.go | 66 +- vendor/k8s.io/mount-utils/mount_linux.go | 149 +- .../k8s.io/mount-utils/mount_unsupported.go | 17 + vendor/k8s.io/mount-utils/mount_windows.go | 14 + .../mount-utils/resizefs_unsupported.go | 5 + vendor/k8s.io/utils/exec/exec.go | 10 +- vendor/k8s.io/utils/exec/fixup_go118.go | 32 + vendor/k8s.io/utils/exec/fixup_go119.go | 40 + vendor/k8s.io/utils/nsenter/nsenter.go | 1 + .../utils/nsenter/nsenter_unsupported.go | 1 + vendor/k8s.io/utils/pointer/pointer.go | 28 + vendor/modules.txt | 15 +- 103 files changed, 3102 insertions(+), 496 deletions(-) create mode 100644 vendor/github.com/moby/sys/mountinfo/LICENSE create mode 100644 vendor/github.com/moby/sys/mountinfo/doc.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mounted_linux.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mounted_unix.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go create mode 100644 vendor/k8s.io/utils/exec/fixup_go118.go create mode 100644 vendor/k8s.io/utils/exec/fixup_go119.go diff --git a/go.mod b/go.mod index bdc95631e..294a5c12d 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/prometheus/client_golang v1.12.2 github.com/stretchr/testify v1.8.0 golang.org/x/crypto v0.0.0-20220214200702-86341886e292 - golang.org/x/sys v0.0.0-20220209214540-3681064d5158 + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.28.0 k8s.io/api v0.24.3 @@ -38,7 +38,7 @@ require ( // k8s.io/kubernetes v1.24.3 k8s.io/mount-utils v0.24.3 - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 + k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2 ) @@ -64,7 +64,7 @@ require ( github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect - github.com/go-logr/logr v1.2.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.5 // indirect github.com/go-openapi/swag v0.19.14 // indirect @@ -111,6 +111,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/sys/mountinfo v0.6.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect @@ -197,7 +198,7 @@ replace ( k8s.io/kubelet => k8s.io/kubelet v0.24.3 k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.3 k8s.io/metrics => k8s.io/metrics v0.24.3 - k8s.io/mount-utils => k8s.io/mount-utils v0.24.3 + k8s.io/mount-utils => k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.3 k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.3 // layeh.com seems to be misbehaving diff --git a/go.sum b/go.sum index be3537427..d302b0867 100644 --- a/go.sum +++ b/go.sum @@ -373,8 +373,9 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= @@ -840,6 +841,7 @@ github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hx github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.0 h1:gUDhXQx58YNrpHlK4nSL+7y2pxFZkUcXqzFDKWdC0Oo= github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1444,8 +1446,9 @@ golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1749,49 +1752,27 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY= k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= k8s.io/apiextensions-apiserver v0.24.3 h1:kyx+Tmro1qEsTUr07ZGQOfvTsF61yn+AxnxytBWq8As= k8s.io/apiextensions-apiserver v0.24.3/go.mod h1:cL0xkmUefpYM4f6IuOau+6NMFEIh6/7wXe/O4vPVJ8A= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg= k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2 h1:orxipm5elPJSkkFNlwH9ClqaKEDJJA3yR2cAAlCnyj4= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= k8s.io/apiserver v0.24.3 h1:J8CKjUaZopT0hSgxjzUyp3T1GK78iixxOuFpEC0MI3k= k8s.io/apiserver v0.24.3/go.mod h1:aXfwtIn4U27B7lYs5f2BKgz6DRbgWy+HJeYReN1jLJ8= -k8s.io/cli-runtime v0.24.2/go.mod h1:1LIhKL2RblkhfG4v5lZEt7FtgFG5mVb8wqv5lE9m5qY= k8s.io/cli-runtime v0.24.3/go.mod h1:In84wauoMOqa7JDvDSXGbf8lTNlr70fOGpYlYfJtSqA= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY= k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw= -k8s.io/cloud-provider v0.24.2 h1:DYNf90zS/GAQbEHsTfJsH4Oas7vim4U+WU9GftMQlfs= -k8s.io/cloud-provider v0.24.2/go.mod h1:a7jyWjizk+IKbcIf8+mX2cj3NvpRv9ZyGdXDyb8UEkI= k8s.io/cloud-provider v0.24.3 h1:Z4O3AiuFxGRPn1ilzaeWS2uBnW8LsH5MbniCTf1xAgs= k8s.io/cloud-provider v0.24.3/go.mod h1:CRIMwnR4e6FpGO5g81nofNuKGQcpJx8El2JEU+BsH9M= -k8s.io/cluster-bootstrap v0.24.2/go.mod h1:eIHV338K03vBm3u/ROZiNXxWJ4AJRoTR9PEUhcTvYkg= k8s.io/cluster-bootstrap v0.24.3/go.mod h1:plud10KCFfNjsf2FNalENFGvJWVtcKa0KbKie5wQAvA= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/code-generator v0.24.3/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= k8s.io/component-base v0.24.3 h1:u99WjuHYCRJjS1xeLOx72DdRaghuDnuMgueiGMFy1ec= k8s.io/component-base v0.24.3/go.mod h1:bqom2IWN9Lj+vwAkPNOv2TflsP1PeVDIwIN0lRthxYY= -k8s.io/component-helpers v0.24.2 h1:gtXmI/TjVINtkAdZn7m5p8+Vd0Mk4d1q8kwJMMLBdwY= -k8s.io/component-helpers v0.24.2/go.mod h1:TRQPBQKfmqkmV6c0HAmUs8cXVNYYYLsXy4zu8eODi9g= k8s.io/component-helpers v0.24.3 h1:HKZTNf77K96StY2+FAgKvsXvHwoLvexeGDJatyuWlyI= k8s.io/component-helpers v0.24.3/go.mod h1:/1WNW8TfBOijQ1ED2uCHb4wtXYWDVNMqUll8h36iNVo= -k8s.io/controller-manager v0.24.2/go.mod h1:hpwCof4KxP4vrw/M5QiVxU6Zmmggmr1keGXtjGHF+vc= k8s.io/controller-manager v0.24.3/go.mod h1:qU/ZC8qmKxiVlRwLUfqXAzgsBi3q44E8Xn8qHs/MiVY= -k8s.io/cri-api v0.24.2/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= k8s.io/cri-api v0.24.3/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= -k8s.io/csi-translation-lib v0.24.2/go.mod h1:pdHc2CYLViQYYsOqOp79hjKYi8J4NZ7vpiVzn1SqBrg= k8s.io/csi-translation-lib v0.24.3/go.mod h1:PfajTaauPYSL4hWKDRBVbUfO611Uv+h3w1YA9Twmzjk= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -1807,50 +1788,36 @@ k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-aggregator v0.24.2/go.mod h1:Ju2jNDixn+vqeeKEBfjfpc204bO1pbdXX0N9knCxeMQ= k8s.io/kube-aggregator v0.24.3/go.mod h1:oMjdwraZtb0CtIxrzrAt/4GJxbivAM8AesZhYVmXZ54= -k8s.io/kube-controller-manager v0.24.2/go.mod h1:KDE0yqiEvxYiO0WRpPA4rVx8AcK1vsWydUF37AJ9lTI= k8s.io/kube-controller-manager v0.24.3/go.mod h1:c7YN1XesvesxKM5uO5JqmcecnUsitFos1sIyt0eOprE= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-proxy v0.24.2/go.mod h1:bozS2ufl/Ns6s40Ue34eV7rqyLVygi5usSmCgW7rFU8= k8s.io/kube-proxy v0.24.3/go.mod h1:zJ+koqfBkRUAzUfXlBtFfyfH3InqM38t5ELGlTlPwO0= -k8s.io/kube-scheduler v0.24.2/go.mod h1:DRa+aeXKSYUUOHHIc/9EcaO9+FW5FydaOfPSvaSW5Ko= k8s.io/kube-scheduler v0.24.3/go.mod h1:myFLGrPy8rcwPz6qg9L3rMRDT2eNIpizq+MXOzMjX/8= -k8s.io/kubectl v0.24.2 h1:+RfQVhth8akUmIc2Ge8krMl/pt66V7210ka3RE/p0J4= -k8s.io/kubectl v0.24.2/go.mod h1:+HIFJc0bA6Tzu5O/YcuUt45APAxnNL8LeMuXwoiGsPg= k8s.io/kubectl v0.24.3 h1:PqY8ho/S/KuE2/hCC3Iee7X+lOtARYo0LQsNzvV/edE= k8s.io/kubectl v0.24.3/go.mod h1:PYLcvw96sC1NLbxZEDbdlOEd6/C76VIWjGmWV5QjSk0= -k8s.io/kubelet v0.24.2 h1:VAvULig8RiylCtyxudgHV7nhKsLnNIrdVBCRD4bXQ3Y= -k8s.io/kubelet v0.24.2/go.mod h1:Xm9DkWQjwOs+uGOUIIGIPMvvmenvj0lDVOErvIKOOt0= k8s.io/kubelet v0.24.3 h1:6fqhHuUWkMpsGulIticCLUlDIhc30sypVVJjGVVKYzw= k8s.io/kubelet v0.24.3/go.mod h1:vIdQ8bybBvLeMysTyj37QZNKNnCGVfWqpbsLaMT7wTE= k8s.io/kubernetes v1.24.3 h1:RVuivOFTujzUDYZV8UFXCeD05US8DowBbxV+97JWEFg= k8s.io/kubernetes v1.24.3/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0= -k8s.io/legacy-cloud-providers v0.24.2/go.mod h1:sgkasgIP2ZOew8fzoOq0mQLVXJ4AmB57IUbFUjzPWEo= k8s.io/legacy-cloud-providers v0.24.3/go.mod h1:G548jzl58czqsrebwY1XXFKEkCEcJhX8tnPUCFv/uMo= -k8s.io/metrics v0.24.2/go.mod h1:5NWURxZ6Lz5gj8TFU83+vdWIVASx7W8lwPpHYCqopMo= k8s.io/metrics v0.24.3/go.mod h1:p1M0lhMySWfhISkSd3HEj8xIgrVnJTK3PPhFq2rA3To= -k8s.io/mount-utils v0.24.2 h1:UTHxyMz2LGBgapLcyl2y2hxWwJHotdmKLqV7CEf0fys= -k8s.io/mount-utils v0.24.2/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= -k8s.io/mount-utils v0.24.3 h1:o16GMv2uk3MzGgbgSYT49lNPHMgpmVbwJu9VPO47KgI= -k8s.io/mount-utils v0.24.3/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= -k8s.io/pod-security-admission v0.24.2 h1:Wl92TCvxsqba+kDK59Dnf/qIsSoP1ekRlj5qT1XEmNk= -k8s.io/pod-security-admission v0.24.2/go.mod h1:znnuDHWWWvh/tpbYYPwTsd4y//qHi3cOX+wGxET/mMI= +k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 h1:MBVsRiLUuVn8PX7je4jjBfHfRs65QwEtgM//Te1mFpQ= +k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084/go.mod h1:dHX0bJ3b1Mvh/OHsBV9r559Mdrf5Lcjxyoc7FHUtnBg= k8s.io/pod-security-admission v0.24.3 h1:Uy9jh3rp0T6WK68WSgnGhBoSLQUOB//G09TYTeJtAfo= k8s.io/pod-security-admission v0.24.3/go.mod h1:l862a6t98GO7IIIGIe/lh01TTq9fWu6ylTb7CLDrXkY= -k8s.io/sample-apiserver v0.24.2/go.mod h1:mf8qgDdu450wqpCJOkSAmoTgU4PIMAcfa5uTBwmJekE= k8s.io/sample-apiserver v0.24.3/go.mod h1:ZDr71tBj39HgTEFPugVn5v32aZ5z7XCu2kLWoygiBp0= k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= diff --git a/vendor/github.com/go-logr/logr/README.md b/vendor/github.com/go-logr/logr/README.md index ad825f5f0..ab5931181 100644 --- a/vendor/github.com/go-logr/logr/README.md +++ b/vendor/github.com/go-logr/logr/README.md @@ -105,14 +105,18 @@ with higher verbosity means more (and less important) logs will be generated. There are implementations for the following logging libraries: - **a function** (can bridge to non-structured libraries): [funcr](https://github.com/go-logr/logr/tree/master/funcr) +- **a testing.T** (for use in Go tests, with JSON-like output): [testr](https://github.com/go-logr/logr/tree/master/testr) - **github.com/google/glog**: [glogr](https://github.com/go-logr/glogr) - **k8s.io/klog** (for Kubernetes): [klogr](https://git.k8s.io/klog/klogr) +- **a testing.T** (with klog-like text output): [ktesting](https://git.k8s.io/klog/ktesting) - **go.uber.org/zap**: [zapr](https://github.com/go-logr/zapr) - **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr) - **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr) - **github.com/wojas/genericr**: [genericr](https://github.com/wojas/genericr) (makes it easy to implement your own backend) - **logfmt** (Heroku style [logging](https://www.brandur.org/logfmt)): [logfmtr](https://github.com/iand/logfmtr) - **github.com/rs/zerolog**: [zerologr](https://github.com/go-logr/zerologr) +- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0) +- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing) ## FAQ diff --git a/vendor/github.com/go-logr/logr/logr.go b/vendor/github.com/go-logr/logr/logr.go index 44cd398c9..c3b56b3d2 100644 --- a/vendor/github.com/go-logr/logr/logr.go +++ b/vendor/github.com/go-logr/logr/logr.go @@ -43,7 +43,9 @@ limitations under the License. // // Info() and Error() are very similar, but they are separate methods so that // LogSink implementations can choose to do things like attach additional -// information (such as stack traces) on calls to Error(). +// information (such as stack traces) on calls to Error(). Error() messages are +// always logged, regardless of the current verbosity. If there is no error +// instance available, passing nil is valid. // // Verbosity // @@ -53,6 +55,7 @@ limitations under the License. // Log-lines with V-levels that are not enabled (as per the LogSink) will not // be written. Level V(0) is the default, and logger.V(0).Info() has the same // meaning as logger.Info(). Negative V-levels have the same meaning as V(0). +// Error messages do not have a verbosity level and are always logged. // // Where we might have written: // if flVerbose >= 2 { @@ -112,6 +115,15 @@ limitations under the License. // may be any Go value, but how the value is formatted is determined by the // LogSink implementation. // +// Logger instances are meant to be passed around by value. Code that receives +// such a value can call its methods without having to check whether the +// instance is ready for use. +// +// Calling methods with the null logger (Logger{}) as instance will crash +// because it has no LogSink. Therefore this null logger should never be passed +// around. For cases where passing a logger is optional, a pointer to Logger +// should be used. +// // Key Naming Conventions // // Keys are not strictly required to conform to any specification or regex, but @@ -253,11 +265,13 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) { // Error logs an error, with the given message and key/value pairs as context. // It functions similarly to Info, but may have unique behavior, and should be // preferred for logging errors (see the package documentations for more -// information). +// information). The log message will always be emitted, regardless of +// verbosity level. // // The msg argument should be used to add context to any underlying error, // while the err argument should be used to attach the actual error that -// triggered this log line, if present. +// triggered this log line, if present. The err parameter is optional +// and nil may be passed instead of an error instance. func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() diff --git a/vendor/github.com/moby/sys/mountinfo/LICENSE b/vendor/github.com/moby/sys/mountinfo/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/LICENSE @@ -0,0 +1,202 @@ + + 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/moby/sys/mountinfo/doc.go b/vendor/github.com/moby/sys/mountinfo/doc.go new file mode 100644 index 000000000..b80e05efd --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/doc.go @@ -0,0 +1,44 @@ +// Package mountinfo provides a set of functions to retrieve information about OS mounts. +// +// Currently it supports Linux. For historical reasons, there is also some support for FreeBSD and OpenBSD, +// and a shallow implementation for Windows, but in general this is Linux-only package, so +// the rest of the document only applies to Linux, unless explicitly specified otherwise. +// +// In Linux, information about mounts seen by the current process is available from +// /proc/self/mountinfo. Note that due to mount namespaces, different processes can +// see different mounts. A per-process mountinfo table is available from /proc//mountinfo, +// where is a numerical process identifier. +// +// In general, /proc is not a very efficient interface, and mountinfo is not an exception. +// For example, there is no way to get information about a specific mount point (i.e. it +// is all-or-nothing). This package tries to hide the /proc ineffectiveness by using +// parse filters while reading mountinfo. A filter can skip some entries, or stop +// processing the rest of the file once the needed information is found. +// +// For mountinfo filters that accept path as an argument, the path must be absolute, +// having all symlinks resolved, and being cleaned (i.e. no extra slashes or dots). +// One way to achieve all of the above is to employ filepath.Abs followed by +// filepath.EvalSymlinks (the latter calls filepath.Clean on the result so +// there is no need to explicitly call filepath.Clean). +// +// NOTE that in many cases there is no need to consult mountinfo at all. Here are some +// of the cases where mountinfo should not be parsed: +// +// 1. Before performing a mount. Usually, this is not needed, but if required (say to +// prevent over-mounts), to check whether a directory is mounted, call os.Lstat +// on it and its parent directory, and compare their st.Sys().(*syscall.Stat_t).Dev +// fields -- if they differ, then the directory is the mount point. NOTE this does +// not work for bind mounts. Optionally, the filesystem type can also be checked +// by calling unix.Statfs and checking the Type field (i.e. filesystem type). +// +// 2. After performing a mount. If there is no error returned, the mount succeeded; +// checking the mount table for a new mount is redundant and expensive. +// +// 3. Before performing an unmount. It is more efficient to do an unmount and ignore +// a specific error (EINVAL) which tells the directory is not mounted. +// +// 4. After performing an unmount. If there is no error returned, the unmount succeeded. +// +// 5. To find the mount point root of a specific directory. You can perform os.Stat() +// on the directory and traverse up until the Dev field of a parent directory differs. +package mountinfo diff --git a/vendor/github.com/moby/sys/mountinfo/mounted_linux.go b/vendor/github.com/moby/sys/mountinfo/mounted_linux.go new file mode 100644 index 000000000..bf221e687 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mounted_linux.go @@ -0,0 +1,101 @@ +package mountinfo + +import ( + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +// MountedFast is a method of detecting a mount point without reading +// mountinfo from procfs. A caller can only trust the result if no error +// and sure == true are returned. Otherwise, other methods (e.g. parsing +// /proc/mounts) have to be used. If unsure, use Mounted instead (which +// uses MountedFast, but falls back to parsing mountinfo if needed). +// +// If a non-existent path is specified, an appropriate error is returned. +// In case the caller is not interested in this particular error, it should +// be handled separately using e.g. errors.Is(err, os.ErrNotExist). +// +// This function is only available on Linux. When available (since kernel +// v5.6), openat2(2) syscall is used to reliably detect all mounts. Otherwise, +// the implementation falls back to using stat(2), which can reliably detect +// normal (but not bind) mounts. +func MountedFast(path string) (mounted, sure bool, err error) { + // Root is always mounted. + if path == string(os.PathSeparator) { + return true, true, nil + } + + path, err = normalizePath(path) + if err != nil { + return false, false, err + } + mounted, sure, err = mountedFast(path) + return +} + +// mountedByOpenat2 is a method of detecting a mount that works for all kinds +// of mounts (incl. bind mounts), but requires a recent (v5.6+) linux kernel. +func mountedByOpenat2(path string) (bool, error) { + dir, last := filepath.Split(path) + + dirfd, err := unix.Openat2(unix.AT_FDCWD, dir, &unix.OpenHow{ + Flags: unix.O_PATH | unix.O_CLOEXEC, + }) + if err != nil { + return false, &os.PathError{Op: "openat2", Path: dir, Err: err} + } + fd, err := unix.Openat2(dirfd, last, &unix.OpenHow{ + Flags: unix.O_PATH | unix.O_CLOEXEC | unix.O_NOFOLLOW, + Resolve: unix.RESOLVE_NO_XDEV, + }) + _ = unix.Close(dirfd) + switch err { //nolint:errorlint // unix errors are bare + case nil: // definitely not a mount + _ = unix.Close(fd) + return false, nil + case unix.EXDEV: // definitely a mount + return true, nil + } + // not sure + return false, &os.PathError{Op: "openat2", Path: path, Err: err} +} + +// mountedFast is similar to MountedFast, except it expects a normalized path. +func mountedFast(path string) (mounted, sure bool, err error) { + // Root is always mounted. + if path == string(os.PathSeparator) { + return true, true, nil + } + + // Try a fast path, using openat2() with RESOLVE_NO_XDEV. + mounted, err = mountedByOpenat2(path) + if err == nil { + return mounted, true, nil + } + + // Another fast path: compare st.st_dev fields. + mounted, err = mountedByStat(path) + // This does not work for bind mounts, so false negative + // is possible, therefore only trust if return is true. + if mounted && err == nil { + return true, true, nil + } + + return +} + +func mounted(path string) (bool, error) { + path, err := normalizePath(path) + if err != nil { + return false, err + } + mounted, sure, err := mountedFast(path) + if sure && err == nil { + return mounted, nil + } + + // Fallback to parsing mountinfo. + return mountedByMountinfo(path) +} diff --git a/vendor/github.com/moby/sys/mountinfo/mounted_unix.go b/vendor/github.com/moby/sys/mountinfo/mounted_unix.go new file mode 100644 index 000000000..45ddad236 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mounted_unix.go @@ -0,0 +1,54 @@ +//go:build linux || (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo) +// +build linux freebsd,cgo openbsd,cgo darwin,cgo + +package mountinfo + +import ( + "fmt" + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +func mountedByStat(path string) (bool, error) { + var st unix.Stat_t + + if err := unix.Lstat(path, &st); err != nil { + return false, &os.PathError{Op: "stat", Path: path, Err: err} + } + dev := st.Dev + parent := filepath.Dir(path) + if err := unix.Lstat(parent, &st); err != nil { + return false, &os.PathError{Op: "stat", Path: parent, Err: err} + } + if dev != st.Dev { + // Device differs from that of parent, + // so definitely a mount point. + return true, nil + } + // NB: this does not detect bind mounts on Linux. + return false, nil +} + +func normalizePath(path string) (realPath string, err error) { + if realPath, err = filepath.Abs(path); err != nil { + return "", fmt.Errorf("unable to get absolute path for %q: %w", path, err) + } + if realPath, err = filepath.EvalSymlinks(realPath); err != nil { + return "", fmt.Errorf("failed to canonicalise path for %q: %w", path, err) + } + if _, err := os.Stat(realPath); err != nil { + return "", fmt.Errorf("failed to stat target of %q: %w", path, err) + } + return realPath, nil +} + +func mountedByMountinfo(path string) (bool, error) { + entries, err := GetMounts(SingleEntryFilter(path)) + if err != nil { + return false, err + } + + return len(entries) > 0, nil +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo.go b/vendor/github.com/moby/sys/mountinfo/mountinfo.go new file mode 100644 index 000000000..c7e5cb42a --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo.go @@ -0,0 +1,67 @@ +package mountinfo + +import ( + "os" +) + +// GetMounts retrieves a list of mounts for the current running process, +// with an optional filter applied (use nil for no filter). +func GetMounts(f FilterFunc) ([]*Info, error) { + return parseMountTable(f) +} + +// Mounted determines if a specified path is a mount point. In case of any +// error, false (and an error) is returned. +// +// If a non-existent path is specified, an appropriate error is returned. +// In case the caller is not interested in this particular error, it should +// be handled separately using e.g. errors.Is(err, os.ErrNotExist). +func Mounted(path string) (bool, error) { + // root is always mounted + if path == string(os.PathSeparator) { + return true, nil + } + return mounted(path) +} + +// Info reveals information about a particular mounted filesystem. This +// struct is populated from the content in the /proc//mountinfo file. +type Info struct { + // ID is a unique identifier of the mount (may be reused after umount). + ID int + + // Parent is the ID of the parent mount (or of self for the root + // of this mount namespace's mount tree). + Parent int + + // Major and Minor are the major and the minor components of the Dev + // field of unix.Stat_t structure returned by unix.*Stat calls for + // files on this filesystem. + Major, Minor int + + // Root is the pathname of the directory in the filesystem which forms + // the root of this mount. + Root string + + // Mountpoint is the pathname of the mount point relative to the + // process's root directory. + Mountpoint string + + // Options is a comma-separated list of mount options. + Options string + + // Optional are zero or more fields of the form "tag[:value]", + // separated by a space. Currently, the possible optional fields are + // "shared", "master", "propagate_from", and "unbindable". For more + // information, see mount_namespaces(7) Linux man page. + Optional string + + // FSType is the filesystem type in the form "type[.subtype]". + FSType string + + // Source is filesystem-specific information, or "none". + Source string + + // VFSOptions is a comma-separated list of superblock options. + VFSOptions string +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go new file mode 100644 index 000000000..d5513a26d --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go @@ -0,0 +1,72 @@ +//go:build (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo) +// +build freebsd,cgo openbsd,cgo darwin,cgo + +package mountinfo + +/* +#include +#include +#include +*/ +import "C" + +import ( + "fmt" + "reflect" + "unsafe" +) + +// parseMountTable returns information about mounted filesystems +func parseMountTable(filter FilterFunc) ([]*Info, error) { + var rawEntries *C.struct_statfs + + count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) + if count == 0 { + return nil, fmt.Errorf("failed to call getmntinfo") + } + + var entries []C.struct_statfs + header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) + header.Cap = count + header.Len = count + header.Data = uintptr(unsafe.Pointer(rawEntries)) + + var out []*Info + for _, entry := range entries { + var mountinfo Info + var skip, stop bool + mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) + mountinfo.FSType = C.GoString(&entry.f_fstypename[0]) + mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) + + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(&mountinfo) + if skip { + continue + } + } + + out = append(out, &mountinfo) + if stop { + break + } + } + return out, nil +} + +func mounted(path string) (bool, error) { + path, err := normalizePath(path) + if err != nil { + return false, err + } + // Fast path: compare st.st_dev fields. + // This should always work for FreeBSD and OpenBSD. + mounted, err := mountedByStat(path) + if err == nil { + return mounted, nil + } + + // Fallback to parsing mountinfo + return mountedByMountinfo(path) +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go new file mode 100644 index 000000000..16079c3c5 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go @@ -0,0 +1,63 @@ +package mountinfo + +import "strings" + +// FilterFunc is a type defining a callback function for GetMount(), +// used to filter out mountinfo entries we're not interested in, +// and/or stop further processing if we found what we wanted. +// +// It takes a pointer to the Info struct (fully populated with all available +// fields on the GOOS platform), and returns two booleans: +// +// skip: true if the entry should be skipped; +// +// stop: true if parsing should be stopped after the entry. +type FilterFunc func(*Info) (skip, stop bool) + +// PrefixFilter discards all entries whose mount points do not start with, or +// are equal to the path specified in prefix. The prefix path must be absolute, +// have all symlinks resolved, and cleaned (i.e. no extra slashes or dots). +// +// PrefixFilter treats prefix as a path, not a partial prefix, which means that +// given "/foo", "/foo/bar" and "/foobar" entries, PrefixFilter("/foo") returns +// "/foo" and "/foo/bar", and discards "/foobar". +func PrefixFilter(prefix string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(m.Mountpoint+"/", prefix+"/") + return skip, false + } +} + +// SingleEntryFilter looks for a specific entry. +func SingleEntryFilter(mp string) FilterFunc { + return func(m *Info) (bool, bool) { + if m.Mountpoint == mp { + return false, true // don't skip, stop now + } + return true, false // skip, keep going + } +} + +// ParentsFilter returns all entries whose mount points +// can be parents of a path specified, discarding others. +// +// For example, given /var/lib/docker/something, entries +// like /var/lib/docker, /var and / are returned. +func ParentsFilter(path string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(path, m.Mountpoint) + return skip, false + } +} + +// FSTypeFilter returns all entries that match provided fstype(s). +func FSTypeFilter(fstype ...string) FilterFunc { + return func(m *Info) (bool, bool) { + for _, t := range fstype { + if m.FSType == t { + return false, false // don't skip, keep going + } + } + return true, false // skip, keep going + } +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go new file mode 100644 index 000000000..59332b07b --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go @@ -0,0 +1,214 @@ +package mountinfo + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// GetMountsFromReader retrieves a list of mounts from the +// reader provided, with an optional filter applied (use nil +// for no filter). This can be useful in tests or benchmarks +// that provide fake mountinfo data, or when a source other +// than /proc/self/mountinfo needs to be read from. +// +// This function is Linux-specific. +func GetMountsFromReader(r io.Reader, filter FilterFunc) ([]*Info, error) { + s := bufio.NewScanner(r) + out := []*Info{} + for s.Scan() { + var err error + + /* + See http://man7.org/linux/man-pages/man5/proc.5.html + + 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) + + (1) mount ID: unique identifier of the mount (may be reused after umount) + (2) parent ID: ID of parent (or of self for the top of the mount tree) + (3) major:minor: value of st_dev for files on filesystem + (4) root: root of the mount within the filesystem + (5) mount point: mount point relative to the process's root + (6) mount options: per mount options + (7) optional fields: zero or more fields of the form "tag[:value]" + (8) separator: marks the end of the optional fields + (9) filesystem type: name of filesystem of the form "type[.subtype]" + (10) mount source: filesystem specific information or "none" + (11) super options: per super block options + + In other words, we have: + * 6 mandatory fields (1)..(6) + * 0 or more optional fields (7) + * a separator field (8) + * 3 mandatory fields (9)..(11) + */ + + text := s.Text() + fields := strings.Split(text, " ") + numFields := len(fields) + if numFields < 10 { + // should be at least 10 fields + return nil, fmt.Errorf("parsing '%s' failed: not enough fields (%d)", text, numFields) + } + + // separator field + sepIdx := numFields - 4 + // In Linux <= 3.9 mounting a cifs with spaces in a share + // name (like "//srv/My Docs") _may_ end up having a space + // in the last field of mountinfo (like "unc=//serv/My Docs"). + // Since kernel 3.10-rc1, cifs option "unc=" is ignored, + // so spaces should not appear. + // + // Check for a separator, and work around the spaces bug + for fields[sepIdx] != "-" { + sepIdx-- + if sepIdx == 5 { + return nil, fmt.Errorf("parsing '%s' failed: missing - separator", text) + } + } + + p := &Info{} + + p.Mountpoint, err = unescape(fields[4]) + if err != nil { + return nil, fmt.Errorf("parsing '%s' failed: mount point: %w", fields[4], err) + } + p.FSType, err = unescape(fields[sepIdx+1]) + if err != nil { + return nil, fmt.Errorf("parsing '%s' failed: fstype: %w", fields[sepIdx+1], err) + } + p.Source, err = unescape(fields[sepIdx+2]) + if err != nil { + return nil, fmt.Errorf("parsing '%s' failed: source: %w", fields[sepIdx+2], err) + } + p.VFSOptions = fields[sepIdx+3] + + // ignore any numbers parsing errors, as there should not be any + p.ID, _ = strconv.Atoi(fields[0]) + p.Parent, _ = strconv.Atoi(fields[1]) + mm := strings.SplitN(fields[2], ":", 3) + if len(mm) != 2 { + return nil, fmt.Errorf("parsing '%s' failed: unexpected major:minor pair %s", text, mm) + } + p.Major, _ = strconv.Atoi(mm[0]) + p.Minor, _ = strconv.Atoi(mm[1]) + + p.Root, err = unescape(fields[3]) + if err != nil { + return nil, fmt.Errorf("parsing '%s' failed: root: %w", fields[3], err) + } + + p.Options = fields[5] + + // zero or more optional fields + p.Optional = strings.Join(fields[6:sepIdx], " ") + + // Run the filter after parsing all fields. + var skip, stop bool + if filter != nil { + skip, stop = filter(p) + if skip { + continue + } + } + + out = append(out, p) + if stop { + break + } + } + if err := s.Err(); err != nil { + return nil, err + } + return out, nil +} + +func parseMountTable(filter FilterFunc) ([]*Info, error) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil, err + } + defer f.Close() + + return GetMountsFromReader(f, filter) +} + +// PidMountInfo retrieves the list of mounts from a given process' mount +// namespace. Unless there is a need to get mounts from a mount namespace +// different from that of a calling process, use GetMounts. +// +// This function is Linux-specific. +// +// Deprecated: this will be removed before v1; use GetMountsFromReader with +// opened /proc//mountinfo as an argument instead. +func PidMountInfo(pid int) ([]*Info, error) { + f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) + if err != nil { + return nil, err + } + defer f.Close() + + return GetMountsFromReader(f, nil) +} + +// A few specific characters in mountinfo path entries (root and mountpoint) +// are escaped using a backslash followed by a character's ascii code in octal. +// +// space -- as \040 +// tab (aka \t) -- as \011 +// newline (aka \n) -- as \012 +// backslash (aka \\) -- as \134 +// +// This function converts path from mountinfo back, i.e. it unescapes the above sequences. +func unescape(path string) (string, error) { + // try to avoid copying + if strings.IndexByte(path, '\\') == -1 { + return path, nil + } + + // The following code is UTF-8 transparent as it only looks for some + // specific characters (backslash and 0..7) with values < utf8.RuneSelf, + // and everything else is passed through as is. + buf := make([]byte, len(path)) + bufLen := 0 + for i := 0; i < len(path); i++ { + if path[i] != '\\' { + buf[bufLen] = path[i] + bufLen++ + continue + } + s := path[i:] + if len(s) < 4 { + // too short + return "", fmt.Errorf("bad escape sequence %q: too short", s) + } + c := s[1] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7': + v := c - '0' + for j := 2; j < 4; j++ { // one digit already; two more + if s[j] < '0' || s[j] > '7' { + return "", fmt.Errorf("bad escape sequence %q: not a digit", s[:3]) + } + x := s[j] - '0' + v = (v << 3) | x + } + if v > 255 { + return "", fmt.Errorf("bad escape sequence %q: out of range" + s[:3]) + } + buf[bufLen] = v + bufLen++ + i += 3 + continue + default: + return "", fmt.Errorf("bad escape sequence %q: not a digit" + s[:3]) + + } + } + + return string(buf[:bufLen]), nil +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go new file mode 100644 index 000000000..95769a76d --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go @@ -0,0 +1,19 @@ +//go:build (!windows && !linux && !freebsd && !openbsd && !darwin) || (freebsd && !cgo) || (openbsd && !cgo) || (darwin && !cgo) +// +build !windows,!linux,!freebsd,!openbsd,!darwin freebsd,!cgo openbsd,!cgo darwin,!cgo + +package mountinfo + +import ( + "fmt" + "runtime" +) + +var errNotImplemented = fmt.Errorf("not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) + +func parseMountTable(_ FilterFunc) ([]*Info, error) { + return nil, errNotImplemented +} + +func mounted(path string) (bool, error) { + return false, errNotImplemented +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go new file mode 100644 index 000000000..13fad165e --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go @@ -0,0 +1,10 @@ +package mountinfo + +func parseMountTable(_ FilterFunc) ([]*Info, error) { + // Do NOT return an error! + return nil, nil +} + +func mounted(_ string) (bool, error) { + return false, nil +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go index a864f24d7..96134157a 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -5,7 +5,7 @@ // Recreate a getsystemcfg syscall handler instead of // using the one provided by x/sys/unix to avoid having // the dependency between them. (See golang.org/issue/32102) -// Morever, this file will be used during the building of +// Moreover, this file will be used during the building of // gccgo's libgo and thus must not used a CGo method. //go:build aix && gccgo diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 1dadead21..884430b81 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -194,3 +194,26 @@ func ioctlIfreqData(fd int, req uint, value *ifreqData) error { // identical so pass *IfreqData directly. return ioctlPtr(fd, req, unsafe.Pointer(value)) } + +// IoctlKCMClone attaches a new file descriptor to a multiplexor by cloning an +// existing KCM socket, returning a structure containing the file descriptor of +// the new socket. +func IoctlKCMClone(fd int) (*KCMClone, error) { + var info KCMClone + if err := ioctlPtr(fd, SIOCKCMCLONE, unsafe.Pointer(&info)); err != nil { + return nil, err + } + + return &info, nil +} + +// IoctlKCMAttach attaches a TCP socket and associated BPF program file +// descriptor to a multiplexor. +func IoctlKCMAttach(fd int, info KCMAttach) error { + return ioctlPtr(fd, SIOCKCMATTACH, unsafe.Pointer(&info)) +} + +// IoctlKCMUnattach unattaches a TCP socket file descriptor from a multiplexor. +func IoctlKCMUnattach(fd int, info KCMUnattach) error { + return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info)) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index e92ddea00..a03708748 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -205,6 +205,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -231,6 +232,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -503,6 +505,7 @@ ccflags="$@" $2 ~ /^O?XTABS$/ || $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || + $2 ~ /^KCM/ || $2 ~ /^LANDLOCK_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 4f55c8d99..f2a114fc2 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -215,18 +215,12 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { // Recvmsg not implemented on AIX - sa := new(SockaddrUnix) - return -1, -1, -1, sa, ENOSYS + return -1, -1, -1, ENOSYS } -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { // SendmsgN not implemented on AIX return -1, ENOSYS } @@ -458,8 +452,8 @@ func Fsync(fd int) error { //sys Listen(s int, n int) (err error) //sys lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = pread64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) //sysnb Setregid(rgid int, egid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 0ce452326..a801b1b1b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -325,10 +325,9 @@ func GetsockoptString(fd, level, opt int) (string, error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -352,29 +351,12 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 0eaab9131..ca2ae3571 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -546,8 +546,8 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 2e37c3167..36c268b35 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -125,12 +125,12 @@ func Pipe2(p []int, flags int) (err error) { } //sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { return extpread(fd, p, 0, offset) } //sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { return extpwrite(fd, p, 0, offset) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 2f650ae66..ac3db019b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -638,8 +638,8 @@ func PtraceSingleStep(pid int) (err error) { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index f5915e234..2a6affedd 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -250,6 +250,13 @@ func Getwd() (wd string, err error) { if n < 1 || n > len(buf) || buf[n-1] != 0 { return "", EINVAL } + // In some cases, Linux can return a path that starts with the + // "(unreachable)" prefix, which can potentially be a valid relative + // path. To work around that, return ENOENT if path is not absolute. + if buf[0] != '/' { + return "", ENOENT + } + return string(buf[0 : n-1]), nil } @@ -1490,10 +1497,9 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error //sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL //sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -1524,28 +1530,10 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - var err error - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) @@ -2309,6 +2297,7 @@ type RemoteIovec struct { //sys PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN //sys PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD +//sys PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) = SYS_PIDFD_SEND_SIGNAL //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) //sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 5f757e8aa..518e476e6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -35,8 +35,8 @@ func setTimeval(sec, usec int64) Timeval { //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 @@ -173,14 +173,6 @@ const ( _SENDMMSG = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) - if e != 0 { - err = e - } - return -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) if e != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 4299125aa..b945ab254 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -29,8 +29,8 @@ func Lstat(path string, stat *Stat_t) (err error) { } //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -62,7 +62,6 @@ func Stat(path string, stat *Stat_t) (err error) { //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 79edeb9cb..c1a7778f1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -27,7 +27,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return newoffset, nil } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) @@ -97,8 +96,8 @@ func Utime(path string, buf *Utimbuf) error { //sys utimes(path string, times *[2]Timeval) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 862890de2..81db4833a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -22,8 +22,8 @@ import "unsafe" //sysnb getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -66,7 +66,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 8932e34ad..98a2660b9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -21,8 +21,8 @@ package unix //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK @@ -48,7 +48,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 7821c25d9..b8a18c0ad 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -25,8 +25,8 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sysnb Getuid() (uid int) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 @@ -41,7 +41,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index c5053a0f0..4ed9e67c6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -27,8 +27,8 @@ import ( //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 @@ -43,7 +43,6 @@ import ( //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 25786c421..db63d384c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -26,8 +26,8 @@ package unix //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT @@ -45,7 +45,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6f9f71041..8ff7adba0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -22,8 +22,8 @@ import "unsafe" //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { @@ -65,7 +65,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 6aa59cb27..6fcf277b0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -26,8 +26,8 @@ import ( //sys Lchown(path string, uid int, gid int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) @@ -145,15 +145,6 @@ const ( netSendMMsg = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { - args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} - fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) - if err != 0 { - return 0, err - } - return int(fd), nil -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index bbe8d174f..02a45d9cc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -23,8 +23,8 @@ package unix //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) @@ -42,7 +42,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 696fed496..d9946e5f5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -313,8 +313,8 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 11b1d419d..0d94765b1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -274,8 +274,8 @@ func Uname(uname *Utsname) error { //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 5c813921e..8c4e80060 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -451,10 +451,9 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -476,29 +475,12 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from return } oobn = int(msg.Accrightslen) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } - return -} - -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) @@ -661,8 +643,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pause() (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys pread(fd int, p []byte, offset int64) (n int, err error) +//sys pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index cf296a243..70508afc1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -177,6 +177,30 @@ func Write(fd int, p []byte) (n int, err error) { return } +func Pread(fd int, p []byte, offset int64) (n int, err error) { + n, err = pread(fd, p, offset) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = pwrite(fd, p, offset) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. var SocketDisableIPv6 bool @@ -313,6 +337,33 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { return } +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var rsa RawSockaddrAny + n, oobn, recvflags, err = recvmsgRaw(fd, p, oob, flags, &rsa) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + return sendmsgN(fd, p, oob, ptr, salen, flags) +} + func Send(s int, buf []byte, flags int) (err error) { return sendto(s, buf, flags, nil, 0) } diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 664db640a..bc7c9d075 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -260,6 +260,17 @@ const ( BUS_USB = 0x3 BUS_VIRTUAL = 0x6 CAN_BCM = 0x2 + CAN_CTRLMODE_3_SAMPLES = 0x4 + CAN_CTRLMODE_BERR_REPORTING = 0x10 + CAN_CTRLMODE_CC_LEN8_DLC = 0x100 + CAN_CTRLMODE_FD = 0x20 + CAN_CTRLMODE_FD_NON_ISO = 0x80 + CAN_CTRLMODE_LISTENONLY = 0x2 + CAN_CTRLMODE_LOOPBACK = 0x1 + CAN_CTRLMODE_ONE_SHOT = 0x8 + CAN_CTRLMODE_PRESUME_ACK = 0x40 + CAN_CTRLMODE_TDC_AUTO = 0x200 + CAN_CTRLMODE_TDC_MANUAL = 0x400 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff @@ -337,6 +348,7 @@ const ( CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff + CAN_TERMINATION_DISABLED = 0x0 CAN_TP16 = 0x3 CAN_TP20 = 0x4 CAP_AUDIT_CONTROL = 0x1e @@ -1274,6 +1286,8 @@ const ( IUTF8 = 0x4000 IXANY = 0x800 JFFS2_SUPER_MAGIC = 0x72b6 + KCMPROTO_CONNECTED = 0x0 + KCM_RECV_DISABLE = 0x1 KEXEC_ARCH_386 = 0x30000 KEXEC_ARCH_68K = 0x40000 KEXEC_ARCH_AARCH64 = 0xb70000 @@ -2446,6 +2460,9 @@ const ( SIOCGSTAMPNS = 0x8907 SIOCGSTAMPNS_OLD = 0x8907 SIOCGSTAMP_OLD = 0x8906 + SIOCKCMATTACH = 0x89e0 + SIOCKCMCLONE = 0x89e2 + SIOCKCMUNATTACH = 0x89e1 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 85e0cc386..870215d2c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -975,7 +975,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] @@ -992,7 +992,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index f1d4a73b0..a89b0bfa5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -931,7 +931,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] @@ -946,7 +946,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 0ae0ed4cb..fbfce0204 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1698,7 +1698,7 @@ var libc_pathconf_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1719,7 +1719,7 @@ var libc_pread_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index cf71be3ed..49d2225ef 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1698,7 +1698,7 @@ var libc_pathconf_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1719,7 +1719,7 @@ var libc_pread_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 3e9bddb7b..e9d9997ee 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1420,7 +1420,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1437,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index c72a462b9..edd373b1a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1420,7 +1420,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1437,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 530d5df90..82e9764b2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1420,7 +1420,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1437,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 71e7df9e8..a6479acd1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1420,7 +1420,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1437,7 +1437,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 30fa4055e..e5299395a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1992,6 +1992,16 @@ func PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) { + _, _, e1 := Syscall6(SYS_PIDFD_SEND_SIGNAL, uintptr(pidfd), uintptr(sig), uintptr(unsafe.Pointer(info)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { r0, _, e1 := Syscall(SYS_SHMAT, uintptr(id), uintptr(addr), uintptr(flag)) ret = uintptr(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 2fc6271f4..88af526b7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -200,7 +200,7 @@ func Lstat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -217,7 +217,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 21fb85079..c947a4d10 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -225,7 +225,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -242,7 +242,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -444,17 +444,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 654f91530..4882bde3a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -46,17 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) @@ -549,7 +538,7 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -566,7 +555,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index e893f987f..dd15284d8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -180,7 +180,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -389,17 +389,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index eab7ab9a4..d7d6f4244 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -150,7 +150,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -167,7 +167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index dc3f47f1c..7f1f8e653 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -180,7 +180,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 82b5e2d9e..f933d0f51 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -180,7 +180,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 691f3de42..297d0a998 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -150,7 +150,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -167,7 +167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index 5ce957c56..2e32e7a44 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -210,7 +210,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -227,7 +227,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -409,17 +409,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 82c5b6336..3c5317046 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -240,7 +240,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -257,7 +257,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 178847e35..a00c6744e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -240,7 +240,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -257,7 +257,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 63b393b80..a1a9bcbbd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -180,7 +180,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -197,7 +197,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -369,17 +369,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 9e462a96f..e0dabc602 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -210,7 +210,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -227,7 +227,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index ea7d7c29e..368623c0f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -220,7 +220,7 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -237,7 +237,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -455,17 +455,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 51d0c0742..4af561a48 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index df2efb6db..3b90e9448 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index c8536c2c9..890f4ccd1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 8b981bfc2..c79f071fc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1330,7 +1330,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1347,7 +1347,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 8f80f4ade..a057fc5d3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 3a47aca7b..04db8fa2f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 883a9b45e..69f803006 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index aac7fdc95..c96a50517 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index 877618746..016d959bc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -1128,7 +1128,7 @@ func Pathconf(path string, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) @@ -1145,7 +1145,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index b5f926cee..d12f4fbfe 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -227,8 +227,8 @@ import ( //go:linkname procOpenat libc_openat //go:linkname procPathconf libc_pathconf //go:linkname procPause libc_pause -//go:linkname procPread libc_pread -//go:linkname procPwrite libc_pwrite +//go:linkname procpread libc_pread +//go:linkname procpwrite libc_pwrite //go:linkname procread libc_read //go:linkname procReadlink libc_readlink //go:linkname procRename libc_rename @@ -364,8 +364,8 @@ var ( procOpenat, procPathconf, procPause, - procPread, - procPwrite, + procpread, + procpwrite, procread, procReadlink, procRename, @@ -1380,12 +1380,12 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pread(fd int, p []byte, offset int64) (n int, err error) { +func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 @@ -1395,12 +1395,12 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +func pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 824cadb41..2c26466e0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -3771,6 +3771,8 @@ const ( ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 ) +const SPEED_UNKNOWN = -0x1 + type EthtoolDrvinfo struct { Cmd uint32 Driver [32]byte @@ -4070,3 +4072,1463 @@ const ( NL_POLICY_TYPE_ATTR_MASK = 0xc NL_POLICY_TYPE_ATTR_MAX = 0xc ) + +type CANBitTiming struct { + Bitrate uint32 + Sample_point uint32 + Tq uint32 + Prop_seg uint32 + Phase_seg1 uint32 + Phase_seg2 uint32 + Sjw uint32 + Brp uint32 +} + +type CANBitTimingConst struct { + Name [16]uint8 + Tseg1_min uint32 + Tseg1_max uint32 + Tseg2_min uint32 + Tseg2_max uint32 + Sjw_max uint32 + Brp_min uint32 + Brp_max uint32 + Brp_inc uint32 +} + +type CANClock struct { + Freq uint32 +} + +type CANBusErrorCounters struct { + Txerr uint16 + Rxerr uint16 +} + +type CANCtrlMode struct { + Mask uint32 + Flags uint32 +} + +type CANDeviceStats struct { + Bus_error uint32 + Error_warning uint32 + Error_passive uint32 + Bus_off uint32 + Arbitration_lost uint32 + Restarts uint32 +} + +const ( + CAN_STATE_ERROR_ACTIVE = 0x0 + CAN_STATE_ERROR_WARNING = 0x1 + CAN_STATE_ERROR_PASSIVE = 0x2 + CAN_STATE_BUS_OFF = 0x3 + CAN_STATE_STOPPED = 0x4 + CAN_STATE_SLEEPING = 0x5 + CAN_STATE_MAX = 0x6 +) + +const ( + IFLA_CAN_UNSPEC = 0x0 + IFLA_CAN_BITTIMING = 0x1 + IFLA_CAN_BITTIMING_CONST = 0x2 + IFLA_CAN_CLOCK = 0x3 + IFLA_CAN_STATE = 0x4 + IFLA_CAN_CTRLMODE = 0x5 + IFLA_CAN_RESTART_MS = 0x6 + IFLA_CAN_RESTART = 0x7 + IFLA_CAN_BERR_COUNTER = 0x8 + IFLA_CAN_DATA_BITTIMING = 0x9 + IFLA_CAN_DATA_BITTIMING_CONST = 0xa + IFLA_CAN_TERMINATION = 0xb + IFLA_CAN_TERMINATION_CONST = 0xc + IFLA_CAN_BITRATE_CONST = 0xd + IFLA_CAN_DATA_BITRATE_CONST = 0xe + IFLA_CAN_BITRATE_MAX = 0xf +) + +type KCMAttach struct { + Fd int32 + Bpf_fd int32 +} + +type KCMUnattach struct { + Fd int32 +} + +type KCMClone struct { + Fd int32 +} + +const ( + NL80211_AC_BE = 0x2 + NL80211_AC_BK = 0x3 + NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED = 0x0 + NL80211_ACL_POLICY_DENY_UNLESS_LISTED = 0x1 + NL80211_AC_VI = 0x1 + NL80211_AC_VO = 0x0 + NL80211_ATTR_4ADDR = 0x53 + NL80211_ATTR_ACK = 0x5c + NL80211_ATTR_ACK_SIGNAL = 0x107 + NL80211_ATTR_ACL_POLICY = 0xa5 + NL80211_ATTR_ADMITTED_TIME = 0xd4 + NL80211_ATTR_AIRTIME_WEIGHT = 0x112 + NL80211_ATTR_AKM_SUITES = 0x4c + NL80211_ATTR_AP_ISOLATE = 0x60 + NL80211_ATTR_AUTH_DATA = 0x9c + NL80211_ATTR_AUTH_TYPE = 0x35 + NL80211_ATTR_BANDS = 0xef + NL80211_ATTR_BEACON_HEAD = 0xe + NL80211_ATTR_BEACON_INTERVAL = 0xc + NL80211_ATTR_BEACON_TAIL = 0xf + NL80211_ATTR_BG_SCAN_PERIOD = 0x98 + NL80211_ATTR_BSS_BASIC_RATES = 0x24 + NL80211_ATTR_BSS = 0x2f + NL80211_ATTR_BSS_CTS_PROT = 0x1c + NL80211_ATTR_BSS_HT_OPMODE = 0x6d + NL80211_ATTR_BSSID = 0xf5 + NL80211_ATTR_BSS_SELECT = 0xe3 + NL80211_ATTR_BSS_SHORT_PREAMBLE = 0x1d + NL80211_ATTR_BSS_SHORT_SLOT_TIME = 0x1e + NL80211_ATTR_CENTER_FREQ1 = 0xa0 + NL80211_ATTR_CENTER_FREQ1_OFFSET = 0x123 + NL80211_ATTR_CENTER_FREQ2 = 0xa1 + NL80211_ATTR_CHANNEL_WIDTH = 0x9f + NL80211_ATTR_CH_SWITCH_BLOCK_TX = 0xb8 + NL80211_ATTR_CH_SWITCH_COUNT = 0xb7 + NL80211_ATTR_CIPHER_SUITE_GROUP = 0x4a + NL80211_ATTR_CIPHER_SUITES = 0x39 + NL80211_ATTR_CIPHER_SUITES_PAIRWISE = 0x49 + NL80211_ATTR_CNTDWN_OFFS_BEACON = 0xba + NL80211_ATTR_CNTDWN_OFFS_PRESP = 0xbb + NL80211_ATTR_COALESCE_RULE = 0xb6 + NL80211_ATTR_COALESCE_RULE_CONDITION = 0x2 + NL80211_ATTR_COALESCE_RULE_DELAY = 0x1 + NL80211_ATTR_COALESCE_RULE_MAX = 0x3 + NL80211_ATTR_COALESCE_RULE_PKT_PATTERN = 0x3 + NL80211_ATTR_CONN_FAILED_REASON = 0x9b + NL80211_ATTR_CONTROL_PORT = 0x44 + NL80211_ATTR_CONTROL_PORT_ETHERTYPE = 0x66 + NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT = 0x67 + NL80211_ATTR_CONTROL_PORT_NO_PREAUTH = 0x11e + NL80211_ATTR_CONTROL_PORT_OVER_NL80211 = 0x108 + NL80211_ATTR_COOKIE = 0x58 + NL80211_ATTR_CQM_BEACON_LOSS_EVENT = 0x8 + NL80211_ATTR_CQM = 0x5e + NL80211_ATTR_CQM_MAX = 0x9 + NL80211_ATTR_CQM_PKT_LOSS_EVENT = 0x4 + NL80211_ATTR_CQM_RSSI_HYST = 0x2 + NL80211_ATTR_CQM_RSSI_LEVEL = 0x9 + NL80211_ATTR_CQM_RSSI_THOLD = 0x1 + NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT = 0x3 + NL80211_ATTR_CQM_TXE_INTVL = 0x7 + NL80211_ATTR_CQM_TXE_PKTS = 0x6 + NL80211_ATTR_CQM_TXE_RATE = 0x5 + NL80211_ATTR_CRIT_PROT_ID = 0xb3 + NL80211_ATTR_CSA_C_OFF_BEACON = 0xba + NL80211_ATTR_CSA_C_OFF_PRESP = 0xbb + NL80211_ATTR_CSA_C_OFFSETS_TX = 0xcd + NL80211_ATTR_CSA_IES = 0xb9 + NL80211_ATTR_DEVICE_AP_SME = 0x8d + NL80211_ATTR_DFS_CAC_TIME = 0x7 + NL80211_ATTR_DFS_REGION = 0x92 + NL80211_ATTR_DISABLE_HE = 0x12d + NL80211_ATTR_DISABLE_HT = 0x93 + NL80211_ATTR_DISABLE_VHT = 0xaf + NL80211_ATTR_DISCONNECTED_BY_AP = 0x47 + NL80211_ATTR_DONT_WAIT_FOR_ACK = 0x8e + NL80211_ATTR_DTIM_PERIOD = 0xd + NL80211_ATTR_DURATION = 0x57 + NL80211_ATTR_EXT_CAPA = 0xa9 + NL80211_ATTR_EXT_CAPA_MASK = 0xaa + NL80211_ATTR_EXTERNAL_AUTH_ACTION = 0x104 + NL80211_ATTR_EXTERNAL_AUTH_SUPPORT = 0x105 + NL80211_ATTR_EXT_FEATURES = 0xd9 + NL80211_ATTR_FEATURE_FLAGS = 0x8f + NL80211_ATTR_FILS_CACHE_ID = 0xfd + NL80211_ATTR_FILS_DISCOVERY = 0x126 + NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM = 0xfb + NL80211_ATTR_FILS_ERP_REALM = 0xfa + NL80211_ATTR_FILS_ERP_RRK = 0xfc + NL80211_ATTR_FILS_ERP_USERNAME = 0xf9 + NL80211_ATTR_FILS_KEK = 0xf2 + NL80211_ATTR_FILS_NONCES = 0xf3 + NL80211_ATTR_FRAME = 0x33 + NL80211_ATTR_FRAME_MATCH = 0x5b + NL80211_ATTR_FRAME_TYPE = 0x65 + NL80211_ATTR_FREQ_AFTER = 0x3b + NL80211_ATTR_FREQ_BEFORE = 0x3a + NL80211_ATTR_FREQ_FIXED = 0x3c + NL80211_ATTR_FREQ_RANGE_END = 0x3 + NL80211_ATTR_FREQ_RANGE_MAX_BW = 0x4 + NL80211_ATTR_FREQ_RANGE_START = 0x2 + NL80211_ATTR_FTM_RESPONDER = 0x10e + NL80211_ATTR_FTM_RESPONDER_STATS = 0x10f + NL80211_ATTR_GENERATION = 0x2e + NL80211_ATTR_HANDLE_DFS = 0xbf + NL80211_ATTR_HE_6GHZ_CAPABILITY = 0x125 + NL80211_ATTR_HE_BSS_COLOR = 0x11b + NL80211_ATTR_HE_CAPABILITY = 0x10d + NL80211_ATTR_HE_OBSS_PD = 0x117 + NL80211_ATTR_HIDDEN_SSID = 0x7e + NL80211_ATTR_HT_CAPABILITY = 0x1f + NL80211_ATTR_HT_CAPABILITY_MASK = 0x94 + NL80211_ATTR_IE_ASSOC_RESP = 0x80 + NL80211_ATTR_IE = 0x2a + NL80211_ATTR_IE_PROBE_RESP = 0x7f + NL80211_ATTR_IE_RIC = 0xb2 + NL80211_ATTR_IFACE_SOCKET_OWNER = 0xcc + NL80211_ATTR_IFINDEX = 0x3 + NL80211_ATTR_IFNAME = 0x4 + NL80211_ATTR_IFTYPE_AKM_SUITES = 0x11c + NL80211_ATTR_IFTYPE = 0x5 + NL80211_ATTR_IFTYPE_EXT_CAPA = 0xe6 + NL80211_ATTR_INACTIVITY_TIMEOUT = 0x96 + NL80211_ATTR_INTERFACE_COMBINATIONS = 0x78 + NL80211_ATTR_KEY_CIPHER = 0x9 + NL80211_ATTR_KEY = 0x50 + NL80211_ATTR_KEY_DATA = 0x7 + NL80211_ATTR_KEY_DEFAULT = 0xb + NL80211_ATTR_KEY_DEFAULT_MGMT = 0x28 + NL80211_ATTR_KEY_DEFAULT_TYPES = 0x6e + NL80211_ATTR_KEY_IDX = 0x8 + NL80211_ATTR_KEYS = 0x51 + NL80211_ATTR_KEY_SEQ = 0xa + NL80211_ATTR_KEY_TYPE = 0x37 + NL80211_ATTR_LOCAL_MESH_POWER_MODE = 0xa4 + NL80211_ATTR_LOCAL_STATE_CHANGE = 0x5f + NL80211_ATTR_MAC_ACL_MAX = 0xa7 + NL80211_ATTR_MAC_ADDRS = 0xa6 + NL80211_ATTR_MAC = 0x6 + NL80211_ATTR_MAC_HINT = 0xc8 + NL80211_ATTR_MAC_MASK = 0xd7 + NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca + NL80211_ATTR_MAX = 0x133 + NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 + NL80211_ATTR_MAX_CSA_COUNTERS = 0xce + NL80211_ATTR_MAX_MATCH_SETS = 0x85 + NL80211_ATTR_MAX_NUM_PMKIDS = 0x56 + NL80211_ATTR_MAX_NUM_SCAN_SSIDS = 0x2b + NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS = 0xde + NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS = 0x7b + NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION = 0x6f + NL80211_ATTR_MAX_SCAN_IE_LEN = 0x38 + NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL = 0xdf + NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS = 0xe0 + NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN = 0x7c + NL80211_ATTR_MCAST_RATE = 0x6b + NL80211_ATTR_MDID = 0xb1 + NL80211_ATTR_MEASUREMENT_DURATION = 0xeb + NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY = 0xec + NL80211_ATTR_MESH_CONFIG = 0x23 + NL80211_ATTR_MESH_ID = 0x18 + NL80211_ATTR_MESH_PEER_AID = 0xed + NL80211_ATTR_MESH_SETUP = 0x70 + NL80211_ATTR_MGMT_SUBTYPE = 0x29 + NL80211_ATTR_MNTR_FLAGS = 0x17 + NL80211_ATTR_MPATH_INFO = 0x1b + NL80211_ATTR_MPATH_NEXT_HOP = 0x1a + NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED = 0xf4 + NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR = 0xe8 + NL80211_ATTR_MU_MIMO_GROUP_DATA = 0xe7 + NL80211_ATTR_NAN_FUNC = 0xf0 + NL80211_ATTR_NAN_MASTER_PREF = 0xee + NL80211_ATTR_NAN_MATCH = 0xf1 + NL80211_ATTR_NETNS_FD = 0xdb + NL80211_ATTR_NOACK_MAP = 0x95 + NL80211_ATTR_NSS = 0x106 + NL80211_ATTR_OFFCHANNEL_TX_OK = 0x6c + NL80211_ATTR_OPER_CLASS = 0xd6 + NL80211_ATTR_OPMODE_NOTIF = 0xc2 + NL80211_ATTR_P2P_CTWINDOW = 0xa2 + NL80211_ATTR_P2P_OPPPS = 0xa3 + NL80211_ATTR_PAD = 0xe5 + NL80211_ATTR_PBSS = 0xe2 + NL80211_ATTR_PEER_AID = 0xb5 + NL80211_ATTR_PEER_MEASUREMENTS = 0x111 + NL80211_ATTR_PID = 0x52 + NL80211_ATTR_PMK = 0xfe + NL80211_ATTR_PMKID = 0x55 + NL80211_ATTR_PMK_LIFETIME = 0x11f + NL80211_ATTR_PMKR0_NAME = 0x102 + NL80211_ATTR_PMK_REAUTH_THRESHOLD = 0x120 + NL80211_ATTR_PMKSA_CANDIDATE = 0x86 + NL80211_ATTR_PORT_AUTHORIZED = 0x103 + NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN = 0x5 + NL80211_ATTR_POWER_RULE_MAX_EIRP = 0x6 + NL80211_ATTR_PREV_BSSID = 0x4f + NL80211_ATTR_PRIVACY = 0x46 + NL80211_ATTR_PROBE_RESP = 0x91 + NL80211_ATTR_PROBE_RESP_OFFLOAD = 0x90 + NL80211_ATTR_PROTOCOL_FEATURES = 0xad + NL80211_ATTR_PS_STATE = 0x5d + NL80211_ATTR_QOS_MAP = 0xc7 + NL80211_ATTR_RADAR_EVENT = 0xa8 + NL80211_ATTR_REASON_CODE = 0x36 + NL80211_ATTR_RECEIVE_MULTICAST = 0x121 + NL80211_ATTR_RECONNECT_REQUESTED = 0x12b + NL80211_ATTR_REG_ALPHA2 = 0x21 + NL80211_ATTR_REG_INDOOR = 0xdd + NL80211_ATTR_REG_INITIATOR = 0x30 + NL80211_ATTR_REG_RULE_FLAGS = 0x1 + NL80211_ATTR_REG_RULES = 0x22 + NL80211_ATTR_REG_TYPE = 0x31 + NL80211_ATTR_REKEY_DATA = 0x7a + NL80211_ATTR_REQ_IE = 0x4d + NL80211_ATTR_RESP_IE = 0x4e + NL80211_ATTR_ROAM_SUPPORT = 0x83 + NL80211_ATTR_RX_FRAME_TYPES = 0x64 + NL80211_ATTR_RXMGMT_FLAGS = 0xbc + NL80211_ATTR_RX_SIGNAL_DBM = 0x97 + NL80211_ATTR_S1G_CAPABILITY = 0x128 + NL80211_ATTR_S1G_CAPABILITY_MASK = 0x129 + NL80211_ATTR_SAE_DATA = 0x9c + NL80211_ATTR_SAE_PASSWORD = 0x115 + NL80211_ATTR_SAE_PWE = 0x12a + NL80211_ATTR_SAR_SPEC = 0x12c + NL80211_ATTR_SCAN_FLAGS = 0x9e + NL80211_ATTR_SCAN_FREQ_KHZ = 0x124 + NL80211_ATTR_SCAN_FREQUENCIES = 0x2c + NL80211_ATTR_SCAN_GENERATION = 0x2e + NL80211_ATTR_SCAN_SSIDS = 0x2d + NL80211_ATTR_SCAN_START_TIME_TSF_BSSID = 0xea + NL80211_ATTR_SCAN_START_TIME_TSF = 0xe9 + NL80211_ATTR_SCAN_SUPP_RATES = 0x7d + NL80211_ATTR_SCHED_SCAN_DELAY = 0xdc + NL80211_ATTR_SCHED_SCAN_INTERVAL = 0x77 + NL80211_ATTR_SCHED_SCAN_MATCH = 0x84 + NL80211_ATTR_SCHED_SCAN_MATCH_SSID = 0x1 + NL80211_ATTR_SCHED_SCAN_MAX_REQS = 0x100 + NL80211_ATTR_SCHED_SCAN_MULTI = 0xff + NL80211_ATTR_SCHED_SCAN_PLANS = 0xe1 + NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI = 0xf6 + NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST = 0xf7 + NL80211_ATTR_SMPS_MODE = 0xd5 + NL80211_ATTR_SOCKET_OWNER = 0xcc + NL80211_ATTR_SOFTWARE_IFTYPES = 0x79 + NL80211_ATTR_SPLIT_WIPHY_DUMP = 0xae + NL80211_ATTR_SSID = 0x34 + NL80211_ATTR_STA_AID = 0x10 + NL80211_ATTR_STA_CAPABILITY = 0xab + NL80211_ATTR_STA_EXT_CAPABILITY = 0xac + NL80211_ATTR_STA_FLAGS2 = 0x43 + NL80211_ATTR_STA_FLAGS = 0x11 + NL80211_ATTR_STA_INFO = 0x15 + NL80211_ATTR_STA_LISTEN_INTERVAL = 0x12 + NL80211_ATTR_STA_PLINK_ACTION = 0x19 + NL80211_ATTR_STA_PLINK_STATE = 0x74 + NL80211_ATTR_STA_SUPPORTED_CHANNELS = 0xbd + NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES = 0xbe + NL80211_ATTR_STA_SUPPORTED_RATES = 0x13 + NL80211_ATTR_STA_SUPPORT_P2P_PS = 0xe4 + NL80211_ATTR_STATUS_CODE = 0x48 + NL80211_ATTR_STA_TX_POWER = 0x114 + NL80211_ATTR_STA_TX_POWER_SETTING = 0x113 + NL80211_ATTR_STA_VLAN = 0x14 + NL80211_ATTR_STA_WME = 0x81 + NL80211_ATTR_SUPPORT_10_MHZ = 0xc1 + NL80211_ATTR_SUPPORT_5_MHZ = 0xc0 + NL80211_ATTR_SUPPORT_AP_UAPSD = 0x82 + NL80211_ATTR_SUPPORTED_COMMANDS = 0x32 + NL80211_ATTR_SUPPORTED_IFTYPES = 0x20 + NL80211_ATTR_SUPPORT_IBSS_RSN = 0x68 + NL80211_ATTR_SUPPORT_MESH_AUTH = 0x73 + NL80211_ATTR_SURVEY_INFO = 0x54 + NL80211_ATTR_SURVEY_RADIO_STATS = 0xda + NL80211_ATTR_TDLS_ACTION = 0x88 + NL80211_ATTR_TDLS_DIALOG_TOKEN = 0x89 + NL80211_ATTR_TDLS_EXTERNAL_SETUP = 0x8c + NL80211_ATTR_TDLS_INITIATOR = 0xcf + NL80211_ATTR_TDLS_OPERATION = 0x8a + NL80211_ATTR_TDLS_PEER_CAPABILITY = 0xcb + NL80211_ATTR_TDLS_SUPPORT = 0x8b + NL80211_ATTR_TESTDATA = 0x45 + NL80211_ATTR_TID_CONFIG = 0x11d + NL80211_ATTR_TIMED_OUT = 0x41 + NL80211_ATTR_TIMEOUT = 0x110 + NL80211_ATTR_TIMEOUT_REASON = 0xf8 + NL80211_ATTR_TSID = 0xd2 + NL80211_ATTR_TWT_RESPONDER = 0x116 + NL80211_ATTR_TX_FRAME_TYPES = 0x63 + NL80211_ATTR_TX_NO_CCK_RATE = 0x87 + NL80211_ATTR_TXQ_LIMIT = 0x10a + NL80211_ATTR_TXQ_MEMORY_LIMIT = 0x10b + NL80211_ATTR_TXQ_QUANTUM = 0x10c + NL80211_ATTR_TXQ_STATS = 0x109 + NL80211_ATTR_TX_RATES = 0x5a + NL80211_ATTR_UNSOL_BCAST_PROBE_RESP = 0x127 + NL80211_ATTR_UNSPEC = 0x0 + NL80211_ATTR_USE_MFP = 0x42 + NL80211_ATTR_USER_PRIO = 0xd3 + NL80211_ATTR_USER_REG_HINT_TYPE = 0x9a + NL80211_ATTR_USE_RRM = 0xd0 + NL80211_ATTR_VENDOR_DATA = 0xc5 + NL80211_ATTR_VENDOR_EVENTS = 0xc6 + NL80211_ATTR_VENDOR_ID = 0xc3 + NL80211_ATTR_VENDOR_SUBCMD = 0xc4 + NL80211_ATTR_VHT_CAPABILITY = 0x9d + NL80211_ATTR_VHT_CAPABILITY_MASK = 0xb0 + NL80211_ATTR_VLAN_ID = 0x11a + NL80211_ATTR_WANT_1X_4WAY_HS = 0x101 + NL80211_ATTR_WDEV = 0x99 + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX = 0x72 + NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX = 0x71 + NL80211_ATTR_WIPHY_ANTENNA_RX = 0x6a + NL80211_ATTR_WIPHY_ANTENNA_TX = 0x69 + NL80211_ATTR_WIPHY_BANDS = 0x16 + NL80211_ATTR_WIPHY_CHANNEL_TYPE = 0x27 + NL80211_ATTR_WIPHY = 0x1 + NL80211_ATTR_WIPHY_COVERAGE_CLASS = 0x59 + NL80211_ATTR_WIPHY_DYN_ACK = 0xd1 + NL80211_ATTR_WIPHY_EDMG_BW_CONFIG = 0x119 + NL80211_ATTR_WIPHY_EDMG_CHANNELS = 0x118 + NL80211_ATTR_WIPHY_FRAG_THRESHOLD = 0x3f + NL80211_ATTR_WIPHY_FREQ = 0x26 + NL80211_ATTR_WIPHY_FREQ_HINT = 0xc9 + NL80211_ATTR_WIPHY_FREQ_OFFSET = 0x122 + NL80211_ATTR_WIPHY_NAME = 0x2 + NL80211_ATTR_WIPHY_RETRY_LONG = 0x3e + NL80211_ATTR_WIPHY_RETRY_SHORT = 0x3d + NL80211_ATTR_WIPHY_RTS_THRESHOLD = 0x40 + NL80211_ATTR_WIPHY_SELF_MANAGED_REG = 0xd8 + NL80211_ATTR_WIPHY_TX_POWER_LEVEL = 0x62 + NL80211_ATTR_WIPHY_TX_POWER_SETTING = 0x61 + NL80211_ATTR_WIPHY_TXQ_PARAMS = 0x25 + NL80211_ATTR_WOWLAN_TRIGGERS = 0x75 + NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED = 0x76 + NL80211_ATTR_WPA_VERSIONS = 0x4b + NL80211_AUTHTYPE_AUTOMATIC = 0x8 + NL80211_AUTHTYPE_FILS_PK = 0x7 + NL80211_AUTHTYPE_FILS_SK = 0x5 + NL80211_AUTHTYPE_FILS_SK_PFS = 0x6 + NL80211_AUTHTYPE_FT = 0x2 + NL80211_AUTHTYPE_MAX = 0x7 + NL80211_AUTHTYPE_NETWORK_EAP = 0x3 + NL80211_AUTHTYPE_OPEN_SYSTEM = 0x0 + NL80211_AUTHTYPE_SAE = 0x4 + NL80211_AUTHTYPE_SHARED_KEY = 0x1 + NL80211_BAND_2GHZ = 0x0 + NL80211_BAND_5GHZ = 0x1 + NL80211_BAND_60GHZ = 0x2 + NL80211_BAND_6GHZ = 0x3 + NL80211_BAND_ATTR_EDMG_BW_CONFIG = 0xb + NL80211_BAND_ATTR_EDMG_CHANNELS = 0xa + NL80211_BAND_ATTR_FREQS = 0x1 + NL80211_BAND_ATTR_HT_AMPDU_DENSITY = 0x6 + NL80211_BAND_ATTR_HT_AMPDU_FACTOR = 0x5 + NL80211_BAND_ATTR_HT_CAPA = 0x4 + NL80211_BAND_ATTR_HT_MCS_SET = 0x3 + NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 + NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_RATES = 0x2 + NL80211_BAND_ATTR_VHT_CAPA = 0x8 + NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 + NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA = 0x6 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC = 0x2 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET = 0x4 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY = 0x3 + NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE = 0x5 + NL80211_BAND_IFTYPE_ATTR_IFTYPES = 0x1 + NL80211_BAND_IFTYPE_ATTR_MAX = 0x7 + NL80211_BAND_S1GHZ = 0x4 + NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE = 0x2 + NL80211_BITRATE_ATTR_MAX = 0x2 + NL80211_BITRATE_ATTR_RATE = 0x1 + NL80211_BSS_BEACON_IES = 0xb + NL80211_BSS_BEACON_INTERVAL = 0x4 + NL80211_BSS_BEACON_TSF = 0xd + NL80211_BSS_BSSID = 0x1 + NL80211_BSS_CAPABILITY = 0x5 + NL80211_BSS_CHAIN_SIGNAL = 0x13 + NL80211_BSS_CHAN_WIDTH_10 = 0x1 + NL80211_BSS_CHAN_WIDTH_1 = 0x3 + NL80211_BSS_CHAN_WIDTH_20 = 0x0 + NL80211_BSS_CHAN_WIDTH_2 = 0x4 + NL80211_BSS_CHAN_WIDTH_5 = 0x2 + NL80211_BSS_CHAN_WIDTH = 0xc + NL80211_BSS_FREQUENCY = 0x2 + NL80211_BSS_FREQUENCY_OFFSET = 0x14 + NL80211_BSS_INFORMATION_ELEMENTS = 0x6 + NL80211_BSS_LAST_SEEN_BOOTTIME = 0xf + NL80211_BSS_MAX = 0x14 + NL80211_BSS_PAD = 0x10 + NL80211_BSS_PARENT_BSSID = 0x12 + NL80211_BSS_PARENT_TSF = 0x11 + NL80211_BSS_PRESP_DATA = 0xe + NL80211_BSS_SEEN_MS_AGO = 0xa + NL80211_BSS_SELECT_ATTR_BAND_PREF = 0x2 + NL80211_BSS_SELECT_ATTR_MAX = 0x3 + NL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 0x3 + NL80211_BSS_SELECT_ATTR_RSSI = 0x1 + NL80211_BSS_SIGNAL_MBM = 0x7 + NL80211_BSS_SIGNAL_UNSPEC = 0x8 + NL80211_BSS_STATUS_ASSOCIATED = 0x1 + NL80211_BSS_STATUS_AUTHENTICATED = 0x0 + NL80211_BSS_STATUS = 0x9 + NL80211_BSS_STATUS_IBSS_JOINED = 0x2 + NL80211_BSS_TSF = 0x3 + NL80211_CHAN_HT20 = 0x1 + NL80211_CHAN_HT40MINUS = 0x2 + NL80211_CHAN_HT40PLUS = 0x3 + NL80211_CHAN_NO_HT = 0x0 + NL80211_CHAN_WIDTH_10 = 0x7 + NL80211_CHAN_WIDTH_160 = 0x5 + NL80211_CHAN_WIDTH_16 = 0xc + NL80211_CHAN_WIDTH_1 = 0x8 + NL80211_CHAN_WIDTH_20 = 0x1 + NL80211_CHAN_WIDTH_20_NOHT = 0x0 + NL80211_CHAN_WIDTH_2 = 0x9 + NL80211_CHAN_WIDTH_40 = 0x2 + NL80211_CHAN_WIDTH_4 = 0xa + NL80211_CHAN_WIDTH_5 = 0x6 + NL80211_CHAN_WIDTH_80 = 0x3 + NL80211_CHAN_WIDTH_80P80 = 0x4 + NL80211_CHAN_WIDTH_8 = 0xb + NL80211_CMD_ABORT_SCAN = 0x72 + NL80211_CMD_ACTION = 0x3b + NL80211_CMD_ACTION_TX_STATUS = 0x3c + NL80211_CMD_ADD_NAN_FUNCTION = 0x75 + NL80211_CMD_ADD_TX_TS = 0x69 + NL80211_CMD_ASSOCIATE = 0x26 + NL80211_CMD_AUTHENTICATE = 0x25 + NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 0x38 + NL80211_CMD_CHANGE_NAN_CONFIG = 0x77 + NL80211_CMD_CHANNEL_SWITCH = 0x66 + NL80211_CMD_CH_SWITCH_NOTIFY = 0x58 + NL80211_CMD_CH_SWITCH_STARTED_NOTIFY = 0x6e + NL80211_CMD_CONNECT = 0x2e + NL80211_CMD_CONN_FAILED = 0x5b + NL80211_CMD_CONTROL_PORT_FRAME = 0x81 + NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS = 0x8b + NL80211_CMD_CRIT_PROTOCOL_START = 0x62 + NL80211_CMD_CRIT_PROTOCOL_STOP = 0x63 + NL80211_CMD_DEAUTHENTICATE = 0x27 + NL80211_CMD_DEL_BEACON = 0x10 + NL80211_CMD_DEL_INTERFACE = 0x8 + NL80211_CMD_DEL_KEY = 0xc + NL80211_CMD_DEL_MPATH = 0x18 + NL80211_CMD_DEL_NAN_FUNCTION = 0x76 + NL80211_CMD_DEL_PMK = 0x7c + NL80211_CMD_DEL_PMKSA = 0x35 + NL80211_CMD_DEL_STATION = 0x14 + NL80211_CMD_DEL_TX_TS = 0x6a + NL80211_CMD_DEL_WIPHY = 0x4 + NL80211_CMD_DISASSOCIATE = 0x28 + NL80211_CMD_DISCONNECT = 0x30 + NL80211_CMD_EXTERNAL_AUTH = 0x7f + NL80211_CMD_FLUSH_PMKSA = 0x36 + NL80211_CMD_FRAME = 0x3b + NL80211_CMD_FRAME_TX_STATUS = 0x3c + NL80211_CMD_FRAME_WAIT_CANCEL = 0x43 + NL80211_CMD_FT_EVENT = 0x61 + NL80211_CMD_GET_BEACON = 0xd + NL80211_CMD_GET_COALESCE = 0x64 + NL80211_CMD_GET_FTM_RESPONDER_STATS = 0x82 + NL80211_CMD_GET_INTERFACE = 0x5 + NL80211_CMD_GET_KEY = 0x9 + NL80211_CMD_GET_MESH_CONFIG = 0x1c + NL80211_CMD_GET_MESH_PARAMS = 0x1c + NL80211_CMD_GET_MPATH = 0x15 + NL80211_CMD_GET_MPP = 0x6b + NL80211_CMD_GET_POWER_SAVE = 0x3e + NL80211_CMD_GET_PROTOCOL_FEATURES = 0x5f + NL80211_CMD_GET_REG = 0x1f + NL80211_CMD_GET_SCAN = 0x20 + NL80211_CMD_GET_STATION = 0x11 + NL80211_CMD_GET_SURVEY = 0x32 + NL80211_CMD_GET_WIPHY = 0x1 + NL80211_CMD_GET_WOWLAN = 0x49 + NL80211_CMD_JOIN_IBSS = 0x2b + NL80211_CMD_JOIN_MESH = 0x44 + NL80211_CMD_JOIN_OCB = 0x6c + NL80211_CMD_LEAVE_IBSS = 0x2c + NL80211_CMD_LEAVE_MESH = 0x45 + NL80211_CMD_LEAVE_OCB = 0x6d + NL80211_CMD_MAX = 0x92 + NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 + NL80211_CMD_NAN_MATCH = 0x78 + NL80211_CMD_NEW_BEACON = 0xf + NL80211_CMD_NEW_INTERFACE = 0x7 + NL80211_CMD_NEW_KEY = 0xb + NL80211_CMD_NEW_MPATH = 0x17 + NL80211_CMD_NEW_PEER_CANDIDATE = 0x48 + NL80211_CMD_NEW_SCAN_RESULTS = 0x22 + NL80211_CMD_NEW_STATION = 0x13 + NL80211_CMD_NEW_SURVEY_RESULTS = 0x33 + NL80211_CMD_NEW_WIPHY = 0x3 + NL80211_CMD_NOTIFY_CQM = 0x40 + NL80211_CMD_NOTIFY_RADAR = 0x86 + NL80211_CMD_PEER_MEASUREMENT_COMPLETE = 0x85 + NL80211_CMD_PEER_MEASUREMENT_RESULT = 0x84 + NL80211_CMD_PEER_MEASUREMENT_START = 0x83 + NL80211_CMD_PMKSA_CANDIDATE = 0x50 + NL80211_CMD_PORT_AUTHORIZED = 0x7d + NL80211_CMD_PROBE_CLIENT = 0x54 + NL80211_CMD_PROBE_MESH_LINK = 0x88 + NL80211_CMD_RADAR_DETECT = 0x5e + NL80211_CMD_REG_BEACON_HINT = 0x2a + NL80211_CMD_REG_CHANGE = 0x24 + NL80211_CMD_REGISTER_ACTION = 0x3a + NL80211_CMD_REGISTER_BEACONS = 0x55 + NL80211_CMD_REGISTER_FRAME = 0x3a + NL80211_CMD_RELOAD_REGDB = 0x7e + NL80211_CMD_REMAIN_ON_CHANNEL = 0x37 + NL80211_CMD_REQ_SET_REG = 0x1b + NL80211_CMD_ROAM = 0x2f + NL80211_CMD_SCAN_ABORTED = 0x23 + NL80211_CMD_SCHED_SCAN_RESULTS = 0x4d + NL80211_CMD_SCHED_SCAN_STOPPED = 0x4e + NL80211_CMD_SET_BEACON = 0xe + NL80211_CMD_SET_BSS = 0x19 + NL80211_CMD_SET_CHANNEL = 0x41 + NL80211_CMD_SET_COALESCE = 0x65 + NL80211_CMD_SET_CQM = 0x3f + NL80211_CMD_SET_INTERFACE = 0x6 + NL80211_CMD_SET_KEY = 0xa + NL80211_CMD_SET_MAC_ACL = 0x5d + NL80211_CMD_SET_MCAST_RATE = 0x5c + NL80211_CMD_SET_MESH_CONFIG = 0x1d + NL80211_CMD_SET_MESH_PARAMS = 0x1d + NL80211_CMD_SET_MGMT_EXTRA_IE = 0x1e + NL80211_CMD_SET_MPATH = 0x16 + NL80211_CMD_SET_MULTICAST_TO_UNICAST = 0x79 + NL80211_CMD_SET_NOACK_MAP = 0x57 + NL80211_CMD_SET_PMK = 0x7b + NL80211_CMD_SET_PMKSA = 0x34 + NL80211_CMD_SET_POWER_SAVE = 0x3d + NL80211_CMD_SET_QOS_MAP = 0x68 + NL80211_CMD_SET_REG = 0x1a + NL80211_CMD_SET_REKEY_OFFLOAD = 0x4f + NL80211_CMD_SET_SAR_SPECS = 0x8c + NL80211_CMD_SET_STATION = 0x12 + NL80211_CMD_SET_TID_CONFIG = 0x89 + NL80211_CMD_SET_TX_BITRATE_MASK = 0x39 + NL80211_CMD_SET_WDS_PEER = 0x42 + NL80211_CMD_SET_WIPHY = 0x2 + NL80211_CMD_SET_WIPHY_NETNS = 0x31 + NL80211_CMD_SET_WOWLAN = 0x4a + NL80211_CMD_STA_OPMODE_CHANGED = 0x80 + NL80211_CMD_START_AP = 0xf + NL80211_CMD_START_NAN = 0x73 + NL80211_CMD_START_P2P_DEVICE = 0x59 + NL80211_CMD_START_SCHED_SCAN = 0x4b + NL80211_CMD_STOP_AP = 0x10 + NL80211_CMD_STOP_NAN = 0x74 + NL80211_CMD_STOP_P2P_DEVICE = 0x5a + NL80211_CMD_STOP_SCHED_SCAN = 0x4c + NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH = 0x70 + NL80211_CMD_TDLS_CHANNEL_SWITCH = 0x6f + NL80211_CMD_TDLS_MGMT = 0x52 + NL80211_CMD_TDLS_OPER = 0x51 + NL80211_CMD_TESTMODE = 0x2d + NL80211_CMD_TRIGGER_SCAN = 0x21 + NL80211_CMD_UNEXPECTED_4ADDR_FRAME = 0x56 + NL80211_CMD_UNEXPECTED_FRAME = 0x53 + NL80211_CMD_UNPROT_BEACON = 0x8a + NL80211_CMD_UNPROT_DEAUTHENTICATE = 0x46 + NL80211_CMD_UNPROT_DISASSOCIATE = 0x47 + NL80211_CMD_UNSPEC = 0x0 + NL80211_CMD_UPDATE_CONNECT_PARAMS = 0x7a + NL80211_CMD_UPDATE_FT_IES = 0x60 + NL80211_CMD_UPDATE_OWE_INFO = 0x87 + NL80211_CMD_VENDOR = 0x67 + NL80211_CMD_WIPHY_REG_CHANGE = 0x71 + NL80211_COALESCE_CONDITION_MATCH = 0x0 + NL80211_COALESCE_CONDITION_NO_MATCH = 0x1 + NL80211_CONN_FAIL_BLOCKED_CLIENT = 0x1 + NL80211_CONN_FAIL_MAX_CLIENTS = 0x0 + NL80211_CQM_RSSI_BEACON_LOSS_EVENT = 0x2 + NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH = 0x1 + NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW = 0x0 + NL80211_CQM_TXE_MAX_INTVL = 0x708 + NL80211_CRIT_PROTO_APIPA = 0x3 + NL80211_CRIT_PROTO_DHCP = 0x1 + NL80211_CRIT_PROTO_EAPOL = 0x2 + NL80211_CRIT_PROTO_MAX_DURATION = 0x1388 + NL80211_CRIT_PROTO_UNSPEC = 0x0 + NL80211_DFS_AVAILABLE = 0x2 + NL80211_DFS_ETSI = 0x2 + NL80211_DFS_FCC = 0x1 + NL80211_DFS_JP = 0x3 + NL80211_DFS_UNAVAILABLE = 0x1 + NL80211_DFS_UNSET = 0x0 + NL80211_DFS_USABLE = 0x0 + NL80211_EDMG_BW_CONFIG_MAX = 0xf + NL80211_EDMG_BW_CONFIG_MIN = 0x4 + NL80211_EDMG_CHANNELS_MAX = 0x3c + NL80211_EDMG_CHANNELS_MIN = 0x1 + NL80211_EXTERNAL_AUTH_ABORT = 0x1 + NL80211_EXTERNAL_AUTH_START = 0x0 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 0x32 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 0x10 + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 0xf + NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 0x12 + NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 0x1b + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 0x21 + NL80211_EXT_FEATURE_AP_PMKSA_CACHING = 0x22 + NL80211_EXT_FEATURE_AQL = 0x28 + NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 0x2e + NL80211_EXT_FEATURE_BEACON_PROTECTION = 0x29 + NL80211_EXT_FEATURE_BEACON_RATE_HE = 0x36 + NL80211_EXT_FEATURE_BEACON_RATE_HT = 0x7 + NL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 0x6 + NL80211_EXT_FEATURE_BEACON_RATE_VHT = 0x8 + NL80211_EXT_FEATURE_BSS_PARENT_TSF = 0x4 + NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 0x1f + NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 0x2a + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 0x1a + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 0x30 + NL80211_EXT_FEATURE_CQM_RSSI_LIST = 0xd + NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 0x1b + NL80211_EXT_FEATURE_DEL_IBSS_STA = 0x2c + NL80211_EXT_FEATURE_DFS_OFFLOAD = 0x19 + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 0x20 + NL80211_EXT_FEATURE_EXT_KEY_ID = 0x24 + NL80211_EXT_FEATURE_FILS_DISCOVERY = 0x34 + NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 0x11 + NL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 0xe + NL80211_EXT_FEATURE_FILS_STA = 0x9 + NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 0x18 + NL80211_EXT_FEATURE_LOW_POWER_SCAN = 0x17 + NL80211_EXT_FEATURE_LOW_SPAN_SCAN = 0x16 + NL80211_EXT_FEATURE_MFP_OPTIONAL = 0x15 + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 0xa + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 0xb + NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 0x2d + NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 0x2 + NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 0x14 + NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 0x13 + NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 0x31 + NL80211_EXT_FEATURE_PROTECTED_TWT = 0x2b + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 0x39 + NL80211_EXT_FEATURE_RRM = 0x1 + NL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 0x33 + NL80211_EXT_FEATURE_SAE_OFFLOAD = 0x26 + NL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 0x2f + NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 0x1e + NL80211_EXT_FEATURE_SCAN_RANDOM_SN = 0x1d + NL80211_EXT_FEATURE_SCAN_START_TIME = 0x3 + NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 0x23 + NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 0xc + NL80211_EXT_FEATURE_SECURE_LTF = 0x37 + NL80211_EXT_FEATURE_SECURE_RTT = 0x38 + NL80211_EXT_FEATURE_SET_SCAN_DWELL = 0x5 + NL80211_EXT_FEATURE_STA_TX_PWR = 0x25 + NL80211_EXT_FEATURE_TXQS = 0x1c + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 0x35 + NL80211_EXT_FEATURE_VHT_IBSS = 0x0 + NL80211_EXT_FEATURE_VLAN_OFFLOAD = 0x27 + NL80211_FEATURE_ACKTO_ESTIMATION = 0x800000 + NL80211_FEATURE_ACTIVE_MONITOR = 0x20000 + NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 0x4000 + NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 0x40000 + NL80211_FEATURE_AP_SCAN = 0x100 + NL80211_FEATURE_CELL_BASE_REG_HINTS = 0x8 + NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES = 0x80000 + NL80211_FEATURE_DYNAMIC_SMPS = 0x2000000 + NL80211_FEATURE_FULL_AP_CLIENT_STATE = 0x8000 + NL80211_FEATURE_HT_IBSS = 0x2 + NL80211_FEATURE_INACTIVITY_TIMER = 0x4 + NL80211_FEATURE_LOW_PRIORITY_SCAN = 0x40 + NL80211_FEATURE_MAC_ON_CREATE = 0x8000000 + NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 0x80000000 + NL80211_FEATURE_NEED_OBSS_SCAN = 0x400 + NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 0x10 + NL80211_FEATURE_P2P_GO_CTWIN = 0x800 + NL80211_FEATURE_P2P_GO_OPPPS = 0x1000 + NL80211_FEATURE_QUIET = 0x200000 + NL80211_FEATURE_SAE = 0x20 + NL80211_FEATURE_SCAN_FLUSH = 0x80 + NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR = 0x20000000 + NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 0x40000000 + NL80211_FEATURE_SK_TX_STATUS = 0x1 + NL80211_FEATURE_STATIC_SMPS = 0x1000000 + NL80211_FEATURE_SUPPORTS_WMM_ADMISSION = 0x4000000 + NL80211_FEATURE_TDLS_CHANNEL_SWITCH = 0x10000000 + NL80211_FEATURE_TX_POWER_INSERTION = 0x400000 + NL80211_FEATURE_USERSPACE_MPM = 0x10000 + NL80211_FEATURE_VIF_TXPOWER = 0x200 + NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = 0x100000 + NL80211_FILS_DISCOVERY_ATTR_INT_MAX = 0x2 + NL80211_FILS_DISCOVERY_ATTR_INT_MIN = 0x1 + NL80211_FILS_DISCOVERY_ATTR_MAX = 0x3 + NL80211_FILS_DISCOVERY_ATTR_TMPL = 0x3 + NL80211_FILS_DISCOVERY_TMPL_MIN_LEN = 0x2a + NL80211_FREQUENCY_ATTR_16MHZ = 0x19 + NL80211_FREQUENCY_ATTR_1MHZ = 0x15 + NL80211_FREQUENCY_ATTR_2MHZ = 0x16 + NL80211_FREQUENCY_ATTR_4MHZ = 0x17 + NL80211_FREQUENCY_ATTR_8MHZ = 0x18 + NL80211_FREQUENCY_ATTR_DFS_CAC_TIME = 0xd + NL80211_FREQUENCY_ATTR_DFS_STATE = 0x7 + NL80211_FREQUENCY_ATTR_DFS_TIME = 0x8 + NL80211_FREQUENCY_ATTR_DISABLED = 0x2 + NL80211_FREQUENCY_ATTR_FREQ = 0x1 + NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf + NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe + NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf + NL80211_FREQUENCY_ATTR_MAX = 0x19 + NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 + NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 + NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc + NL80211_FREQUENCY_ATTR_NO_20MHZ = 0x10 + NL80211_FREQUENCY_ATTR_NO_80MHZ = 0xb + NL80211_FREQUENCY_ATTR_NO_HE = 0x13 + NL80211_FREQUENCY_ATTR_NO_HT40_MINUS = 0x9 + NL80211_FREQUENCY_ATTR_NO_HT40_PLUS = 0xa + NL80211_FREQUENCY_ATTR_NO_IBSS = 0x3 + NL80211_FREQUENCY_ATTR_NO_IR = 0x3 + NL80211_FREQUENCY_ATTR_OFFSET = 0x14 + NL80211_FREQUENCY_ATTR_PASSIVE_SCAN = 0x3 + NL80211_FREQUENCY_ATTR_RADAR = 0x5 + NL80211_FREQUENCY_ATTR_WMM = 0x12 + NL80211_FTM_RESP_ATTR_CIVICLOC = 0x3 + NL80211_FTM_RESP_ATTR_ENABLED = 0x1 + NL80211_FTM_RESP_ATTR_LCI = 0x2 + NL80211_FTM_RESP_ATTR_MAX = 0x3 + NL80211_FTM_STATS_ASAP_NUM = 0x4 + NL80211_FTM_STATS_FAILED_NUM = 0x3 + NL80211_FTM_STATS_MAX = 0xa + NL80211_FTM_STATS_NON_ASAP_NUM = 0x5 + NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM = 0x9 + NL80211_FTM_STATS_PAD = 0xa + NL80211_FTM_STATS_PARTIAL_NUM = 0x2 + NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM = 0x8 + NL80211_FTM_STATS_SUCCESS_NUM = 0x1 + NL80211_FTM_STATS_TOTAL_DURATION_MSEC = 0x6 + NL80211_FTM_STATS_UNKNOWN_TRIGGERS_NUM = 0x7 + NL80211_GENL_NAME = "nl80211" + NL80211_HE_BSS_COLOR_ATTR_COLOR = 0x1 + NL80211_HE_BSS_COLOR_ATTR_DISABLED = 0x2 + NL80211_HE_BSS_COLOR_ATTR_MAX = 0x3 + NL80211_HE_BSS_COLOR_ATTR_PARTIAL = 0x3 + NL80211_HE_MAX_CAPABILITY_LEN = 0x36 + NL80211_HE_MIN_CAPABILITY_LEN = 0x10 + NL80211_HE_NSS_MAX = 0x8 + NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP = 0x4 + NL80211_HE_OBSS_PD_ATTR_MAX = 0x6 + NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET = 0x2 + NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET = 0x1 + NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET = 0x3 + NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP = 0x5 + NL80211_HE_OBSS_PD_ATTR_SR_CTRL = 0x6 + NL80211_HIDDEN_SSID_NOT_IN_USE = 0x0 + NL80211_HIDDEN_SSID_ZERO_CONTENTS = 0x2 + NL80211_HIDDEN_SSID_ZERO_LEN = 0x1 + NL80211_HT_CAPABILITY_LEN = 0x1a + NL80211_IFACE_COMB_BI_MIN_GCD = 0x7 + NL80211_IFACE_COMB_LIMITS = 0x1 + NL80211_IFACE_COMB_MAXNUM = 0x2 + NL80211_IFACE_COMB_NUM_CHANNELS = 0x4 + NL80211_IFACE_COMB_RADAR_DETECT_REGIONS = 0x6 + NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS = 0x5 + NL80211_IFACE_COMB_STA_AP_BI_MATCH = 0x3 + NL80211_IFACE_COMB_UNSPEC = 0x0 + NL80211_IFACE_LIMIT_MAX = 0x1 + NL80211_IFACE_LIMIT_TYPES = 0x2 + NL80211_IFACE_LIMIT_UNSPEC = 0x0 + NL80211_IFTYPE_ADHOC = 0x1 + NL80211_IFTYPE_AKM_ATTR_IFTYPES = 0x1 + NL80211_IFTYPE_AKM_ATTR_MAX = 0x2 + NL80211_IFTYPE_AKM_ATTR_SUITES = 0x2 + NL80211_IFTYPE_AP = 0x3 + NL80211_IFTYPE_AP_VLAN = 0x4 + NL80211_IFTYPE_MAX = 0xc + NL80211_IFTYPE_MESH_POINT = 0x7 + NL80211_IFTYPE_MONITOR = 0x6 + NL80211_IFTYPE_NAN = 0xc + NL80211_IFTYPE_OCB = 0xb + NL80211_IFTYPE_P2P_CLIENT = 0x8 + NL80211_IFTYPE_P2P_DEVICE = 0xa + NL80211_IFTYPE_P2P_GO = 0x9 + NL80211_IFTYPE_STATION = 0x2 + NL80211_IFTYPE_UNSPECIFIED = 0x0 + NL80211_IFTYPE_WDS = 0x5 + NL80211_KCK_EXT_LEN = 0x18 + NL80211_KCK_LEN = 0x10 + NL80211_KEK_EXT_LEN = 0x20 + NL80211_KEK_LEN = 0x10 + NL80211_KEY_CIPHER = 0x3 + NL80211_KEY_DATA = 0x1 + NL80211_KEY_DEFAULT_BEACON = 0xa + NL80211_KEY_DEFAULT = 0x5 + NL80211_KEY_DEFAULT_MGMT = 0x6 + NL80211_KEY_DEFAULT_TYPE_MULTICAST = 0x2 + NL80211_KEY_DEFAULT_TYPES = 0x8 + NL80211_KEY_DEFAULT_TYPE_UNICAST = 0x1 + NL80211_KEY_IDX = 0x2 + NL80211_KEY_MAX = 0xa + NL80211_KEY_MODE = 0x9 + NL80211_KEY_NO_TX = 0x1 + NL80211_KEY_RX_TX = 0x0 + NL80211_KEY_SEQ = 0x4 + NL80211_KEY_SET_TX = 0x2 + NL80211_KEY_TYPE = 0x7 + NL80211_KEYTYPE_GROUP = 0x0 + NL80211_KEYTYPE_PAIRWISE = 0x1 + NL80211_KEYTYPE_PEERKEY = 0x2 + NL80211_MAX_NR_AKM_SUITES = 0x2 + NL80211_MAX_NR_CIPHER_SUITES = 0x5 + NL80211_MAX_SUPP_HT_RATES = 0x4d + NL80211_MAX_SUPP_RATES = 0x20 + NL80211_MAX_SUPP_REG_RULES = 0x80 + NL80211_MESHCONF_ATTR_MAX = 0x1f + NL80211_MESHCONF_AUTO_OPEN_PLINKS = 0x7 + NL80211_MESHCONF_AWAKE_WINDOW = 0x1b + NL80211_MESHCONF_CONFIRM_TIMEOUT = 0x2 + NL80211_MESHCONF_CONNECTED_TO_AS = 0x1f + NL80211_MESHCONF_CONNECTED_TO_GATE = 0x1d + NL80211_MESHCONF_ELEMENT_TTL = 0xf + NL80211_MESHCONF_FORWARDING = 0x13 + NL80211_MESHCONF_GATE_ANNOUNCEMENTS = 0x11 + NL80211_MESHCONF_HOLDING_TIMEOUT = 0x3 + NL80211_MESHCONF_HT_OPMODE = 0x16 + NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT = 0xb + NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL = 0x19 + NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES = 0x8 + NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME = 0xd + NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT = 0x17 + NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL = 0x12 + NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL = 0xc + NL80211_MESHCONF_HWMP_RANN_INTERVAL = 0x10 + NL80211_MESHCONF_HWMP_ROOT_INTERVAL = 0x18 + NL80211_MESHCONF_HWMP_ROOTMODE = 0xe + NL80211_MESHCONF_MAX_PEER_LINKS = 0x4 + NL80211_MESHCONF_MAX_RETRIES = 0x5 + NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT = 0xa + NL80211_MESHCONF_NOLEARN = 0x1e + NL80211_MESHCONF_PATH_REFRESH_TIME = 0x9 + NL80211_MESHCONF_PLINK_TIMEOUT = 0x1c + NL80211_MESHCONF_POWER_MODE = 0x1a + NL80211_MESHCONF_RETRY_TIMEOUT = 0x1 + NL80211_MESHCONF_RSSI_THRESHOLD = 0x14 + NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR = 0x15 + NL80211_MESHCONF_TTL = 0x6 + NL80211_MESH_POWER_ACTIVE = 0x1 + NL80211_MESH_POWER_DEEP_SLEEP = 0x3 + NL80211_MESH_POWER_LIGHT_SLEEP = 0x2 + NL80211_MESH_POWER_MAX = 0x3 + NL80211_MESH_POWER_UNKNOWN = 0x0 + NL80211_MESH_SETUP_ATTR_MAX = 0x8 + NL80211_MESH_SETUP_AUTH_PROTOCOL = 0x8 + NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC = 0x2 + NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL = 0x1 + NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC = 0x6 + NL80211_MESH_SETUP_IE = 0x3 + NL80211_MESH_SETUP_USERSPACE_AMPE = 0x5 + NL80211_MESH_SETUP_USERSPACE_AUTH = 0x4 + NL80211_MESH_SETUP_USERSPACE_MPM = 0x7 + NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE = 0x3 + NL80211_MFP_NO = 0x0 + NL80211_MFP_OPTIONAL = 0x2 + NL80211_MFP_REQUIRED = 0x1 + NL80211_MIN_REMAIN_ON_CHANNEL_TIME = 0xa + NL80211_MNTR_FLAG_ACTIVE = 0x6 + NL80211_MNTR_FLAG_CONTROL = 0x3 + NL80211_MNTR_FLAG_COOK_FRAMES = 0x5 + NL80211_MNTR_FLAG_FCSFAIL = 0x1 + NL80211_MNTR_FLAG_MAX = 0x6 + NL80211_MNTR_FLAG_OTHER_BSS = 0x4 + NL80211_MNTR_FLAG_PLCPFAIL = 0x2 + NL80211_MPATH_FLAG_ACTIVE = 0x1 + NL80211_MPATH_FLAG_FIXED = 0x8 + NL80211_MPATH_FLAG_RESOLVED = 0x10 + NL80211_MPATH_FLAG_RESOLVING = 0x2 + NL80211_MPATH_FLAG_SN_VALID = 0x4 + NL80211_MPATH_INFO_DISCOVERY_RETRIES = 0x7 + NL80211_MPATH_INFO_DISCOVERY_TIMEOUT = 0x6 + NL80211_MPATH_INFO_EXPTIME = 0x4 + NL80211_MPATH_INFO_FLAGS = 0x5 + NL80211_MPATH_INFO_FRAME_QLEN = 0x1 + NL80211_MPATH_INFO_HOP_COUNT = 0x8 + NL80211_MPATH_INFO_MAX = 0x9 + NL80211_MPATH_INFO_METRIC = 0x3 + NL80211_MPATH_INFO_PATH_CHANGE = 0x9 + NL80211_MPATH_INFO_SN = 0x2 + NL80211_MULTICAST_GROUP_CONFIG = "config" + NL80211_MULTICAST_GROUP_MLME = "mlme" + NL80211_MULTICAST_GROUP_NAN = "nan" + NL80211_MULTICAST_GROUP_REG = "regulatory" + NL80211_MULTICAST_GROUP_SCAN = "scan" + NL80211_MULTICAST_GROUP_TESTMODE = "testmode" + NL80211_MULTICAST_GROUP_VENDOR = "vendor" + NL80211_NAN_FUNC_ATTR_MAX = 0x10 + NL80211_NAN_FUNC_CLOSE_RANGE = 0x9 + NL80211_NAN_FUNC_FOLLOW_UP = 0x2 + NL80211_NAN_FUNC_FOLLOW_UP_DEST = 0x8 + NL80211_NAN_FUNC_FOLLOW_UP_ID = 0x6 + NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID = 0x7 + NL80211_NAN_FUNC_INSTANCE_ID = 0xf + NL80211_NAN_FUNC_MAX_TYPE = 0x2 + NL80211_NAN_FUNC_PUBLISH_BCAST = 0x4 + NL80211_NAN_FUNC_PUBLISH = 0x0 + NL80211_NAN_FUNC_PUBLISH_TYPE = 0x3 + NL80211_NAN_FUNC_RX_MATCH_FILTER = 0xd + NL80211_NAN_FUNC_SERVICE_ID = 0x2 + NL80211_NAN_FUNC_SERVICE_ID_LEN = 0x6 + NL80211_NAN_FUNC_SERVICE_INFO = 0xb + NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN = 0xff + NL80211_NAN_FUNC_SRF = 0xc + NL80211_NAN_FUNC_SRF_MAX_LEN = 0xff + NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE = 0x5 + NL80211_NAN_FUNC_SUBSCRIBE = 0x1 + NL80211_NAN_FUNC_TERM_REASON = 0x10 + NL80211_NAN_FUNC_TERM_REASON_ERROR = 0x2 + NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED = 0x1 + NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST = 0x0 + NL80211_NAN_FUNC_TTL = 0xa + NL80211_NAN_FUNC_TX_MATCH_FILTER = 0xe + NL80211_NAN_FUNC_TYPE = 0x1 + NL80211_NAN_MATCH_ATTR_MAX = 0x2 + NL80211_NAN_MATCH_FUNC_LOCAL = 0x1 + NL80211_NAN_MATCH_FUNC_PEER = 0x2 + NL80211_NAN_SOLICITED_PUBLISH = 0x1 + NL80211_NAN_SRF_ATTR_MAX = 0x4 + NL80211_NAN_SRF_BF = 0x2 + NL80211_NAN_SRF_BF_IDX = 0x3 + NL80211_NAN_SRF_INCLUDE = 0x1 + NL80211_NAN_SRF_MAC_ADDRS = 0x4 + NL80211_NAN_UNSOLICITED_PUBLISH = 0x2 + NL80211_NUM_ACS = 0x4 + NL80211_P2P_PS_SUPPORTED = 0x1 + NL80211_P2P_PS_UNSUPPORTED = 0x0 + NL80211_PKTPAT_MASK = 0x1 + NL80211_PKTPAT_OFFSET = 0x3 + NL80211_PKTPAT_PATTERN = 0x2 + NL80211_PLINK_ACTION_BLOCK = 0x2 + NL80211_PLINK_ACTION_NO_ACTION = 0x0 + NL80211_PLINK_ACTION_OPEN = 0x1 + NL80211_PLINK_BLOCKED = 0x6 + NL80211_PLINK_CNF_RCVD = 0x3 + NL80211_PLINK_ESTAB = 0x4 + NL80211_PLINK_HOLDING = 0x5 + NL80211_PLINK_LISTEN = 0x0 + NL80211_PLINK_OPN_RCVD = 0x2 + NL80211_PLINK_OPN_SNT = 0x1 + NL80211_PMKSA_CANDIDATE_BSSID = 0x2 + NL80211_PMKSA_CANDIDATE_INDEX = 0x1 + NL80211_PMKSA_CANDIDATE_PREAUTH = 0x3 + NL80211_PMSR_ATTR_MAX = 0x5 + NL80211_PMSR_ATTR_MAX_PEERS = 0x1 + NL80211_PMSR_ATTR_PEERS = 0x5 + NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR = 0x3 + NL80211_PMSR_ATTR_REPORT_AP_TSF = 0x2 + NL80211_PMSR_ATTR_TYPE_CAPA = 0x4 + NL80211_PMSR_FTM_CAPA_ATTR_ASAP = 0x1 + NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS = 0x6 + NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT = 0x7 + NL80211_PMSR_FTM_CAPA_ATTR_MAX = 0xa + NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST = 0x8 + NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP = 0x2 + NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED = 0xa + NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES = 0x5 + NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC = 0x4 + NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI = 0x3 + NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED = 0x9 + NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS = 0x7 + NL80211_PMSR_FTM_FAILURE_INVALID_TIMESTAMP = 0x5 + NL80211_PMSR_FTM_FAILURE_NO_RESPONSE = 0x1 + NL80211_PMSR_FTM_FAILURE_PEER_BUSY = 0x6 + NL80211_PMSR_FTM_FAILURE_PEER_NOT_CAPABLE = 0x4 + NL80211_PMSR_FTM_FAILURE_REJECTED = 0x2 + NL80211_PMSR_FTM_FAILURE_UNSPECIFIED = 0x0 + NL80211_PMSR_FTM_FAILURE_WRONG_CHANNEL = 0x3 + NL80211_PMSR_FTM_REQ_ATTR_ASAP = 0x1 + NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION = 0x5 + NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD = 0x4 + NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST = 0x6 + NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK = 0xc + NL80211_PMSR_FTM_REQ_ATTR_MAX = 0xd + NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED = 0xb + NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP = 0x3 + NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES = 0x7 + NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE = 0x2 + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC = 0x9 + NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI = 0x8 + NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED = 0xa + NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION = 0x7 + NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX = 0x2 + NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME = 0x5 + NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC = 0x14 + NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG = 0x10 + NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD = 0x12 + NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE = 0x11 + NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON = 0x1 + NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST = 0x8 + NL80211_PMSR_FTM_RESP_ATTR_LCI = 0x13 + NL80211_PMSR_FTM_RESP_ATTR_MAX = 0x15 + NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP = 0x6 + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS = 0x3 + NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES = 0x4 + NL80211_PMSR_FTM_RESP_ATTR_PAD = 0x15 + NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG = 0x9 + NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD = 0xa + NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG = 0xd + NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD = 0xf + NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE = 0xe + NL80211_PMSR_FTM_RESP_ATTR_RX_RATE = 0xc + NL80211_PMSR_FTM_RESP_ATTR_TX_RATE = 0xb + NL80211_PMSR_PEER_ATTR_ADDR = 0x1 + NL80211_PMSR_PEER_ATTR_CHAN = 0x2 + NL80211_PMSR_PEER_ATTR_MAX = 0x4 + NL80211_PMSR_PEER_ATTR_REQ = 0x3 + NL80211_PMSR_PEER_ATTR_RESP = 0x4 + NL80211_PMSR_REQ_ATTR_DATA = 0x1 + NL80211_PMSR_REQ_ATTR_GET_AP_TSF = 0x2 + NL80211_PMSR_REQ_ATTR_MAX = 0x2 + NL80211_PMSR_RESP_ATTR_AP_TSF = 0x4 + NL80211_PMSR_RESP_ATTR_DATA = 0x1 + NL80211_PMSR_RESP_ATTR_FINAL = 0x5 + NL80211_PMSR_RESP_ATTR_HOST_TIME = 0x3 + NL80211_PMSR_RESP_ATTR_MAX = 0x6 + NL80211_PMSR_RESP_ATTR_PAD = 0x6 + NL80211_PMSR_RESP_ATTR_STATUS = 0x2 + NL80211_PMSR_STATUS_FAILURE = 0x3 + NL80211_PMSR_STATUS_REFUSED = 0x1 + NL80211_PMSR_STATUS_SUCCESS = 0x0 + NL80211_PMSR_STATUS_TIMEOUT = 0x2 + NL80211_PMSR_TYPE_FTM = 0x1 + NL80211_PMSR_TYPE_INVALID = 0x0 + NL80211_PMSR_TYPE_MAX = 0x1 + NL80211_PREAMBLE_DMG = 0x3 + NL80211_PREAMBLE_HE = 0x4 + NL80211_PREAMBLE_HT = 0x1 + NL80211_PREAMBLE_LEGACY = 0x0 + NL80211_PREAMBLE_VHT = 0x2 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 0x8 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P = 0x4 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 = 0x2 + NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS = 0x1 + NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 0x1 + NL80211_PS_DISABLED = 0x0 + NL80211_PS_ENABLED = 0x1 + NL80211_RADAR_CAC_ABORTED = 0x2 + NL80211_RADAR_CAC_FINISHED = 0x1 + NL80211_RADAR_CAC_STARTED = 0x5 + NL80211_RADAR_DETECTED = 0x0 + NL80211_RADAR_NOP_FINISHED = 0x3 + NL80211_RADAR_PRE_CAC_EXPIRED = 0x4 + NL80211_RATE_INFO_10_MHZ_WIDTH = 0xb + NL80211_RATE_INFO_160_MHZ_WIDTH = 0xa + NL80211_RATE_INFO_40_MHZ_WIDTH = 0x3 + NL80211_RATE_INFO_5_MHZ_WIDTH = 0xc + NL80211_RATE_INFO_80_MHZ_WIDTH = 0x8 + NL80211_RATE_INFO_80P80_MHZ_WIDTH = 0x9 + NL80211_RATE_INFO_BITRATE32 = 0x5 + NL80211_RATE_INFO_BITRATE = 0x1 + NL80211_RATE_INFO_HE_1XLTF = 0x0 + NL80211_RATE_INFO_HE_2XLTF = 0x1 + NL80211_RATE_INFO_HE_4XLTF = 0x2 + NL80211_RATE_INFO_HE_DCM = 0x10 + NL80211_RATE_INFO_HE_GI_0_8 = 0x0 + NL80211_RATE_INFO_HE_GI_1_6 = 0x1 + NL80211_RATE_INFO_HE_GI_3_2 = 0x2 + NL80211_RATE_INFO_HE_GI = 0xf + NL80211_RATE_INFO_HE_MCS = 0xd + NL80211_RATE_INFO_HE_NSS = 0xe + NL80211_RATE_INFO_HE_RU_ALLOC_106 = 0x2 + NL80211_RATE_INFO_HE_RU_ALLOC_242 = 0x3 + NL80211_RATE_INFO_HE_RU_ALLOC_26 = 0x0 + NL80211_RATE_INFO_HE_RU_ALLOC_2x996 = 0x6 + NL80211_RATE_INFO_HE_RU_ALLOC_484 = 0x4 + NL80211_RATE_INFO_HE_RU_ALLOC_52 = 0x1 + NL80211_RATE_INFO_HE_RU_ALLOC_996 = 0x5 + NL80211_RATE_INFO_HE_RU_ALLOC = 0x11 + NL80211_RATE_INFO_MAX = 0x11 + NL80211_RATE_INFO_MCS = 0x2 + NL80211_RATE_INFO_SHORT_GI = 0x4 + NL80211_RATE_INFO_VHT_MCS = 0x6 + NL80211_RATE_INFO_VHT_NSS = 0x7 + NL80211_REGDOM_SET_BY_CORE = 0x0 + NL80211_REGDOM_SET_BY_COUNTRY_IE = 0x3 + NL80211_REGDOM_SET_BY_DRIVER = 0x2 + NL80211_REGDOM_SET_BY_USER = 0x1 + NL80211_REGDOM_TYPE_COUNTRY = 0x0 + NL80211_REGDOM_TYPE_CUSTOM_WORLD = 0x2 + NL80211_REGDOM_TYPE_INTERSECTION = 0x3 + NL80211_REGDOM_TYPE_WORLD = 0x1 + NL80211_REG_RULE_ATTR_MAX = 0x7 + NL80211_REKEY_DATA_AKM = 0x4 + NL80211_REKEY_DATA_KCK = 0x2 + NL80211_REKEY_DATA_KEK = 0x1 + NL80211_REKEY_DATA_REPLAY_CTR = 0x3 + NL80211_REPLAY_CTR_LEN = 0x8 + NL80211_RRF_AUTO_BW = 0x800 + NL80211_RRF_DFS = 0x10 + NL80211_RRF_GO_CONCURRENT = 0x1000 + NL80211_RRF_IR_CONCURRENT = 0x1000 + NL80211_RRF_NO_160MHZ = 0x10000 + NL80211_RRF_NO_80MHZ = 0x8000 + NL80211_RRF_NO_CCK = 0x2 + NL80211_RRF_NO_HE = 0x20000 + NL80211_RRF_NO_HT40 = 0x6000 + NL80211_RRF_NO_HT40MINUS = 0x2000 + NL80211_RRF_NO_HT40PLUS = 0x4000 + NL80211_RRF_NO_IBSS = 0x80 + NL80211_RRF_NO_INDOOR = 0x4 + NL80211_RRF_NO_IR_ALL = 0x180 + NL80211_RRF_NO_IR = 0x80 + NL80211_RRF_NO_OFDM = 0x1 + NL80211_RRF_NO_OUTDOOR = 0x8 + NL80211_RRF_PASSIVE_SCAN = 0x80 + NL80211_RRF_PTMP_ONLY = 0x40 + NL80211_RRF_PTP_ONLY = 0x20 + NL80211_RXMGMT_FLAG_ANSWERED = 0x1 + NL80211_RXMGMT_FLAG_EXTERNAL_AUTH = 0x2 + NL80211_SAE_PWE_BOTH = 0x3 + NL80211_SAE_PWE_HASH_TO_ELEMENT = 0x2 + NL80211_SAE_PWE_HUNT_AND_PECK = 0x1 + NL80211_SAE_PWE_UNSPECIFIED = 0x0 + NL80211_SAR_ATTR_MAX = 0x2 + NL80211_SAR_ATTR_SPECS = 0x2 + NL80211_SAR_ATTR_SPECS_END_FREQ = 0x4 + NL80211_SAR_ATTR_SPECS_MAX = 0x4 + NL80211_SAR_ATTR_SPECS_POWER = 0x1 + NL80211_SAR_ATTR_SPECS_RANGE_INDEX = 0x2 + NL80211_SAR_ATTR_SPECS_START_FREQ = 0x3 + NL80211_SAR_ATTR_TYPE = 0x1 + NL80211_SAR_TYPE_POWER = 0x0 + NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP = 0x20 + NL80211_SCAN_FLAG_AP = 0x4 + NL80211_SCAN_FLAG_COLOCATED_6GHZ = 0x4000 + NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME = 0x10 + NL80211_SCAN_FLAG_FLUSH = 0x2 + NL80211_SCAN_FLAG_FREQ_KHZ = 0x2000 + NL80211_SCAN_FLAG_HIGH_ACCURACY = 0x400 + NL80211_SCAN_FLAG_LOW_POWER = 0x200 + NL80211_SCAN_FLAG_LOW_PRIORITY = 0x1 + NL80211_SCAN_FLAG_LOW_SPAN = 0x100 + NL80211_SCAN_FLAG_MIN_PREQ_CONTENT = 0x1000 + NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 0x80 + NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE = 0x40 + NL80211_SCAN_FLAG_RANDOM_ADDR = 0x8 + NL80211_SCAN_FLAG_RANDOM_SN = 0x800 + NL80211_SCAN_RSSI_THOLD_OFF = -0x12c + NL80211_SCHED_SCAN_MATCH_ATTR_BSSID = 0x5 + NL80211_SCHED_SCAN_MATCH_ATTR_MAX = 0x6 + NL80211_SCHED_SCAN_MATCH_ATTR_RELATIVE_RSSI = 0x3 + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI_ADJUST = 0x4 + NL80211_SCHED_SCAN_MATCH_ATTR_RSSI = 0x2 + NL80211_SCHED_SCAN_MATCH_ATTR_SSID = 0x1 + NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI = 0x6 + NL80211_SCHED_SCAN_PLAN_INTERVAL = 0x1 + NL80211_SCHED_SCAN_PLAN_ITERATIONS = 0x2 + NL80211_SCHED_SCAN_PLAN_MAX = 0x2 + NL80211_SMPS_DYNAMIC = 0x2 + NL80211_SMPS_MAX = 0x2 + NL80211_SMPS_OFF = 0x0 + NL80211_SMPS_STATIC = 0x1 + NL80211_STA_BSS_PARAM_BEACON_INTERVAL = 0x5 + NL80211_STA_BSS_PARAM_CTS_PROT = 0x1 + NL80211_STA_BSS_PARAM_DTIM_PERIOD = 0x4 + NL80211_STA_BSS_PARAM_MAX = 0x5 + NL80211_STA_BSS_PARAM_SHORT_PREAMBLE = 0x2 + NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME = 0x3 + NL80211_STA_FLAG_ASSOCIATED = 0x7 + NL80211_STA_FLAG_AUTHENTICATED = 0x5 + NL80211_STA_FLAG_AUTHORIZED = 0x1 + NL80211_STA_FLAG_MAX = 0x7 + NL80211_STA_FLAG_MAX_OLD_API = 0x6 + NL80211_STA_FLAG_MFP = 0x4 + NL80211_STA_FLAG_SHORT_PREAMBLE = 0x2 + NL80211_STA_FLAG_TDLS_PEER = 0x6 + NL80211_STA_FLAG_WME = 0x3 + NL80211_STA_INFO_ACK_SIGNAL_AVG = 0x23 + NL80211_STA_INFO_ACK_SIGNAL = 0x22 + NL80211_STA_INFO_AIRTIME_LINK_METRIC = 0x29 + NL80211_STA_INFO_AIRTIME_WEIGHT = 0x28 + NL80211_STA_INFO_ASSOC_AT_BOOTTIME = 0x2a + NL80211_STA_INFO_BEACON_LOSS = 0x12 + NL80211_STA_INFO_BEACON_RX = 0x1d + NL80211_STA_INFO_BEACON_SIGNAL_AVG = 0x1e + NL80211_STA_INFO_BSS_PARAM = 0xf + NL80211_STA_INFO_CHAIN_SIGNAL_AVG = 0x1a + NL80211_STA_INFO_CHAIN_SIGNAL = 0x19 + NL80211_STA_INFO_CONNECTED_TIME = 0x10 + NL80211_STA_INFO_CONNECTED_TO_AS = 0x2b + NL80211_STA_INFO_CONNECTED_TO_GATE = 0x26 + NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG = 0x23 + NL80211_STA_INFO_EXPECTED_THROUGHPUT = 0x1b + NL80211_STA_INFO_FCS_ERROR_COUNT = 0x25 + NL80211_STA_INFO_INACTIVE_TIME = 0x1 + NL80211_STA_INFO_LLID = 0x4 + NL80211_STA_INFO_LOCAL_PM = 0x14 + NL80211_STA_INFO_MAX = 0x2b + NL80211_STA_INFO_NONPEER_PM = 0x16 + NL80211_STA_INFO_PAD = 0x21 + NL80211_STA_INFO_PEER_PM = 0x15 + NL80211_STA_INFO_PLID = 0x5 + NL80211_STA_INFO_PLINK_STATE = 0x6 + NL80211_STA_INFO_RX_BITRATE = 0xe + NL80211_STA_INFO_RX_BYTES64 = 0x17 + NL80211_STA_INFO_RX_BYTES = 0x2 + NL80211_STA_INFO_RX_DROP_MISC = 0x1c + NL80211_STA_INFO_RX_DURATION = 0x20 + NL80211_STA_INFO_RX_MPDUS = 0x24 + NL80211_STA_INFO_RX_PACKETS = 0x9 + NL80211_STA_INFO_SIGNAL_AVG = 0xd + NL80211_STA_INFO_SIGNAL = 0x7 + NL80211_STA_INFO_STA_FLAGS = 0x11 + NL80211_STA_INFO_TID_STATS = 0x1f + NL80211_STA_INFO_T_OFFSET = 0x13 + NL80211_STA_INFO_TX_BITRATE = 0x8 + NL80211_STA_INFO_TX_BYTES64 = 0x18 + NL80211_STA_INFO_TX_BYTES = 0x3 + NL80211_STA_INFO_TX_DURATION = 0x27 + NL80211_STA_INFO_TX_FAILED = 0xc + NL80211_STA_INFO_TX_PACKETS = 0xa + NL80211_STA_INFO_TX_RETRIES = 0xb + NL80211_STA_WME_MAX = 0x2 + NL80211_STA_WME_MAX_SP = 0x2 + NL80211_STA_WME_UAPSD_QUEUES = 0x1 + NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY = 0x5 + NL80211_SURVEY_INFO_CHANNEL_TIME = 0x4 + NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 0x6 + NL80211_SURVEY_INFO_CHANNEL_TIME_RX = 0x7 + NL80211_SURVEY_INFO_CHANNEL_TIME_TX = 0x8 + NL80211_SURVEY_INFO_FREQUENCY = 0x1 + NL80211_SURVEY_INFO_FREQUENCY_OFFSET = 0xc + NL80211_SURVEY_INFO_IN_USE = 0x3 + NL80211_SURVEY_INFO_MAX = 0xc + NL80211_SURVEY_INFO_NOISE = 0x2 + NL80211_SURVEY_INFO_PAD = 0xa + NL80211_SURVEY_INFO_TIME_BSS_RX = 0xb + NL80211_SURVEY_INFO_TIME_BUSY = 0x5 + NL80211_SURVEY_INFO_TIME = 0x4 + NL80211_SURVEY_INFO_TIME_EXT_BUSY = 0x6 + NL80211_SURVEY_INFO_TIME_RX = 0x7 + NL80211_SURVEY_INFO_TIME_SCAN = 0x9 + NL80211_SURVEY_INFO_TIME_TX = 0x8 + NL80211_TDLS_DISABLE_LINK = 0x4 + NL80211_TDLS_DISCOVERY_REQ = 0x0 + NL80211_TDLS_ENABLE_LINK = 0x3 + NL80211_TDLS_PEER_HE = 0x8 + NL80211_TDLS_PEER_HT = 0x1 + NL80211_TDLS_PEER_VHT = 0x2 + NL80211_TDLS_PEER_WMM = 0x4 + NL80211_TDLS_SETUP = 0x1 + NL80211_TDLS_TEARDOWN = 0x2 + NL80211_TID_CONFIG_ATTR_AMPDU_CTRL = 0x9 + NL80211_TID_CONFIG_ATTR_AMSDU_CTRL = 0xb + NL80211_TID_CONFIG_ATTR_MAX = 0xd + NL80211_TID_CONFIG_ATTR_NOACK = 0x6 + NL80211_TID_CONFIG_ATTR_OVERRIDE = 0x4 + NL80211_TID_CONFIG_ATTR_PAD = 0x1 + NL80211_TID_CONFIG_ATTR_PEER_SUPP = 0x3 + NL80211_TID_CONFIG_ATTR_RETRY_LONG = 0x8 + NL80211_TID_CONFIG_ATTR_RETRY_SHORT = 0x7 + NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL = 0xa + NL80211_TID_CONFIG_ATTR_TIDS = 0x5 + NL80211_TID_CONFIG_ATTR_TX_RATE = 0xd + NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE = 0xc + NL80211_TID_CONFIG_ATTR_VIF_SUPP = 0x2 + NL80211_TID_CONFIG_DISABLE = 0x1 + NL80211_TID_CONFIG_ENABLE = 0x0 + NL80211_TID_STATS_MAX = 0x6 + NL80211_TID_STATS_PAD = 0x5 + NL80211_TID_STATS_RX_MSDU = 0x1 + NL80211_TID_STATS_TX_MSDU = 0x2 + NL80211_TID_STATS_TX_MSDU_FAILED = 0x4 + NL80211_TID_STATS_TX_MSDU_RETRIES = 0x3 + NL80211_TID_STATS_TXQ_STATS = 0x6 + NL80211_TIMEOUT_ASSOC = 0x3 + NL80211_TIMEOUT_AUTH = 0x2 + NL80211_TIMEOUT_SCAN = 0x1 + NL80211_TIMEOUT_UNSPECIFIED = 0x0 + NL80211_TKIP_DATA_OFFSET_ENCR_KEY = 0x0 + NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY = 0x18 + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY = 0x10 + NL80211_TX_POWER_AUTOMATIC = 0x0 + NL80211_TX_POWER_FIXED = 0x2 + NL80211_TX_POWER_LIMITED = 0x1 + NL80211_TXQ_ATTR_AC = 0x1 + NL80211_TXQ_ATTR_AIFS = 0x5 + NL80211_TXQ_ATTR_CWMAX = 0x4 + NL80211_TXQ_ATTR_CWMIN = 0x3 + NL80211_TXQ_ATTR_MAX = 0x5 + NL80211_TXQ_ATTR_QUEUE = 0x1 + NL80211_TXQ_ATTR_TXOP = 0x2 + NL80211_TXQ_Q_BE = 0x2 + NL80211_TXQ_Q_BK = 0x3 + NL80211_TXQ_Q_VI = 0x1 + NL80211_TXQ_Q_VO = 0x0 + NL80211_TXQ_STATS_BACKLOG_BYTES = 0x1 + NL80211_TXQ_STATS_BACKLOG_PACKETS = 0x2 + NL80211_TXQ_STATS_COLLISIONS = 0x8 + NL80211_TXQ_STATS_DROPS = 0x4 + NL80211_TXQ_STATS_ECN_MARKS = 0x5 + NL80211_TXQ_STATS_FLOWS = 0x3 + NL80211_TXQ_STATS_MAX = 0xb + NL80211_TXQ_STATS_MAX_FLOWS = 0xb + NL80211_TXQ_STATS_OVERLIMIT = 0x6 + NL80211_TXQ_STATS_OVERMEMORY = 0x7 + NL80211_TXQ_STATS_TX_BYTES = 0x9 + NL80211_TXQ_STATS_TX_PACKETS = 0xa + NL80211_TX_RATE_AUTOMATIC = 0x0 + NL80211_TXRATE_DEFAULT_GI = 0x0 + NL80211_TX_RATE_FIXED = 0x2 + NL80211_TXRATE_FORCE_LGI = 0x2 + NL80211_TXRATE_FORCE_SGI = 0x1 + NL80211_TXRATE_GI = 0x4 + NL80211_TXRATE_HE = 0x5 + NL80211_TXRATE_HE_GI = 0x6 + NL80211_TXRATE_HE_LTF = 0x7 + NL80211_TXRATE_HT = 0x2 + NL80211_TXRATE_LEGACY = 0x1 + NL80211_TX_RATE_LIMITED = 0x1 + NL80211_TXRATE_MAX = 0x7 + NL80211_TXRATE_MCS = 0x2 + NL80211_TXRATE_VHT = 0x3 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT = 0x1 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX = 0x2 + NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL = 0x2 + NL80211_USER_REG_HINT_CELL_BASE = 0x1 + NL80211_USER_REG_HINT_INDOOR = 0x2 + NL80211_USER_REG_HINT_USER = 0x0 + NL80211_VENDOR_ID_IS_LINUX = 0x80000000 + NL80211_VHT_CAPABILITY_LEN = 0xc + NL80211_VHT_NSS_MAX = 0x8 + NL80211_WIPHY_NAME_MAXLEN = 0x40 + NL80211_WMMR_AIFSN = 0x3 + NL80211_WMMR_CW_MAX = 0x2 + NL80211_WMMR_CW_MIN = 0x1 + NL80211_WMMR_MAX = 0x4 + NL80211_WMMR_TXOP = 0x4 + NL80211_WOWLAN_PKTPAT_MASK = 0x1 + NL80211_WOWLAN_PKTPAT_OFFSET = 0x3 + NL80211_WOWLAN_PKTPAT_PATTERN = 0x2 + NL80211_WOWLAN_TCP_DATA_INTERVAL = 0x9 + NL80211_WOWLAN_TCP_DATA_PAYLOAD = 0x6 + NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ = 0x7 + NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN = 0x8 + NL80211_WOWLAN_TCP_DST_IPV4 = 0x2 + NL80211_WOWLAN_TCP_DST_MAC = 0x3 + NL80211_WOWLAN_TCP_DST_PORT = 0x5 + NL80211_WOWLAN_TCP_SRC_IPV4 = 0x1 + NL80211_WOWLAN_TCP_SRC_PORT = 0x4 + NL80211_WOWLAN_TCP_WAKE_MASK = 0xb + NL80211_WOWLAN_TCP_WAKE_PAYLOAD = 0xa + NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE = 0x8 + NL80211_WOWLAN_TRIG_ANY = 0x1 + NL80211_WOWLAN_TRIG_DISCONNECT = 0x2 + NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST = 0x7 + NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE = 0x6 + NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED = 0x5 + NL80211_WOWLAN_TRIG_MAGIC_PKT = 0x3 + NL80211_WOWLAN_TRIG_NET_DETECT = 0x12 + NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS = 0x13 + NL80211_WOWLAN_TRIG_PKT_PATTERN = 0x4 + NL80211_WOWLAN_TRIG_RFKILL_RELEASE = 0x9 + NL80211_WOWLAN_TRIG_TCP_CONNECTION = 0xe + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211 = 0xa + NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN = 0xb + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023 = 0xc + NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN = 0xd + NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST = 0x10 + NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH = 0xf + NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS = 0x11 + NL80211_WPA_VERSION_1 = 0x1 + NL80211_WPA_VERSION_2 = 0x2 + NL80211_WPA_VERSION_3 = 0x4 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index bea254945..531aefab7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -250,6 +250,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index b8c8f2894..727f664bb 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -265,6 +265,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 4db443016..639141b1e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -241,6 +241,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 3ebcad8a8..6cb03b1d9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -244,6 +244,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 3eb33e48a..4a1555455 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -246,6 +246,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 79a944672..e1084926f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -247,6 +247,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 8f4b107ca..8904ac84e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -247,6 +247,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index e4eb21798..a1a28cc7d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -246,6 +246,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index d5b21f0f7..abdc53452 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -253,6 +253,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 5188d142b..f4afbbe00 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -254,6 +254,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index de4dd4c73..ea0b8406d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -254,6 +254,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index dccbf9b06..85d0a0d50 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -272,6 +272,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 635880610..81dd9c22c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -210,8 +210,8 @@ type PtraceFpregs struct { } type PtracePer struct { - _ [0]uint64 - _ [32]byte + Control_regs [3]uint64 + _ [8]byte Starting_addr uint64 Ending_addr uint64 Perc_atmid uint16 @@ -267,6 +267,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 765edc13f..6991b00b5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -249,6 +249,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index cf44e6933..ce3075c45 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -10,6 +10,7 @@ import ( errorspkg "errors" "fmt" "runtime" + "strings" "sync" "syscall" "time" @@ -86,10 +87,8 @@ func StringToUTF16(s string) []uint16 { // s, with a terminating NUL added. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func UTF16FromString(s string) ([]uint16, error) { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return nil, syscall.EINVAL - } + if strings.IndexByte(s, 0) != -1 { + return nil, syscall.EINVAL } return utf16.Encode([]rune(s + "\x00")), nil } @@ -186,8 +185,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetNamedPipeInfo(pipe Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) //sys GetNamedPipeHandleState(pipe Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW //sys SetNamedPipeHandleState(pipe Handle, state *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32) (err error) = SetNamedPipeHandleState -//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) -//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile +//sys writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile //sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) //sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] //sys CloseHandle(handle Handle) (err error) @@ -549,12 +548,6 @@ func Read(fd Handle, p []byte) (n int, err error) { } return 0, e } - if raceenabled { - if done > 0 { - raceWriteRange(unsafe.Pointer(&p[0]), int(done)) - } - raceAcquire(unsafe.Pointer(&ioSync)) - } return int(done), nil } @@ -567,12 +560,31 @@ func Write(fd Handle, p []byte) (n int, err error) { if e != nil { return 0, e } - if raceenabled && done > 0 { - raceReadRange(unsafe.Pointer(&p[0]), int(done)) - } return int(done), nil } +func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { + err := readFile(fd, p, done, overlapped) + if raceenabled { + if *done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(*done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return err +} + +func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + err := writeFile(fd, p, done, overlapped) + if raceenabled && *done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(*done)) + } + return err +} + var ioSync int64 func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 9ea1a44f0..68f52c1e6 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -2761,7 +2761,7 @@ func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree return } -func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { +func readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] @@ -3203,7 +3203,7 @@ func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, return } -func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { +func writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] diff --git a/vendor/k8s.io/mount-utils/fake_mounter.go b/vendor/k8s.io/mount-utils/fake_mounter.go index 55ea5e298..5a5701598 100644 --- a/vendor/k8s.io/mount-utils/fake_mounter.go +++ b/vendor/k8s.io/mount-utils/fake_mounter.go @@ -32,8 +32,9 @@ type FakeMounter struct { MountCheckErrors map[string]error // Some tests run things in parallel, make sure the mounter does not produce // any golang's DATA RACE warnings. - mutex sync.Mutex - UnmountFunc UnmountFunc + mutex sync.Mutex + UnmountFunc UnmountFunc + skipMountPointCheck bool } // UnmountFunc is a function callback to be executed during the Unmount() call. @@ -64,6 +65,11 @@ func NewFakeMounter(mps []MountPoint) *FakeMounter { } } +func (f *FakeMounter) WithSkipMountPointCheck() *FakeMounter { + f.skipMountPointCheck = true + return f +} + // ResetLog clears all the log entries in FakeMounter func (f *FakeMounter) ResetLog() { f.mutex.Lock() @@ -212,6 +218,18 @@ func (f *FakeMounter) IsLikelyNotMountPoint(file string) (bool, error) { return true, nil } +func (f *FakeMounter) canSafelySkipMountPointCheck() bool { + return f.skipMountPointCheck +} + +func (f *FakeMounter) IsMountPoint(file string) (bool, error) { + notMnt, err := f.IsLikelyNotMountPoint(file) + if err != nil { + return false, err + } + return !notMnt, nil +} + // GetMountRefs finds all mount references to the path, returns a // list of paths. func (f *FakeMounter) GetMountRefs(pathname string) ([]string, error) { diff --git a/vendor/k8s.io/mount-utils/mount.go b/vendor/k8s.io/mount-utils/mount.go index a882fcc73..c42836f06 100644 --- a/vendor/k8s.io/mount-utils/mount.go +++ b/vendor/k8s.io/mount-utils/mount.go @@ -21,7 +21,6 @@ package mount import ( "fmt" - "os" "path/filepath" "strings" "time" @@ -66,6 +65,18 @@ type Interface interface { // care about such situations, this is a faster alternative to calling List() // and scanning that output. IsLikelyNotMountPoint(file string) (bool, error) + // canSafelySkipMountPointCheck indicates whether this mounter returns errors on + // operations for targets that are not mount points. If this returns true, no such + // errors will be returned. + canSafelySkipMountPointCheck() bool + // IsMountPoint determines if a directory is a mountpoint. + // It should return ErrNotExist when the directory does not exist. + // IsMountPoint is more expensive than IsLikelyNotMountPoint. + // IsMountPoint detects bind mounts in linux. + // IsMountPoint may enumerate all the mountpoints using List() and + // the list of mountpoints may be large, then it uses + // isMountPointMatch to evaluate whether the directory is a mountpoint. + IsMountPoint(file string) (bool, error) // GetMountRefs finds all mount references to pathname, returning a slice of // paths. Pathname can be a mountpoint path or a normal directory // (for bind mount). On Linux, pathname is excluded from the slice. @@ -187,6 +198,24 @@ func getMountRefsByDev(mounter Interface, mountPath string) ([]string, error) { return refs, nil } +// IsNotMountPoint determines if a directory is a mountpoint. +// It should return ErrNotExist when the directory does not exist. +// IsNotMountPoint is more expensive than IsLikelyNotMountPoint +// and depends on IsMountPoint. +// +// If an error occurs, it returns true (assuming it is not a mountpoint) +// when ErrNotExist is returned for callers similar to IsLikelyNotMountPoint. +// +// Deprecated: This function is kept to keep changes backward compatible with +// previous library version. Callers should prefer mounter.IsMountPoint. +func IsNotMountPoint(mounter Interface, file string) (bool, error) { + isMnt, err := mounter.IsMountPoint(file) + if err != nil { + return true, err + } + return !isMnt, nil +} + // GetDeviceNameFromMount given a mnt point, find the device from /proc/mounts // returns the device name, reference count, and error code. func GetDeviceNameFromMount(mounter Interface, mountPath string) (string, int, error) { @@ -220,56 +249,11 @@ func GetDeviceNameFromMount(mounter Interface, mountPath string) (string, int, e return device, refCount, nil } -// IsNotMountPoint determines if a directory is a mountpoint. -// It should return ErrNotExist when the directory does not exist. -// IsNotMountPoint is more expensive than IsLikelyNotMountPoint. -// IsNotMountPoint detects bind mounts in linux. -// IsNotMountPoint enumerates all the mountpoints using List() and -// the list of mountpoints may be large, then it uses -// isMountPointMatch to evaluate whether the directory is a mountpoint. -func IsNotMountPoint(mounter Interface, file string) (bool, error) { - // IsLikelyNotMountPoint provides a quick check - // to determine whether file IS A mountpoint. - notMnt, notMntErr := mounter.IsLikelyNotMountPoint(file) - if notMntErr != nil && os.IsPermission(notMntErr) { - // We were not allowed to do the simple stat() check, e.g. on NFS with - // root_squash. Fall back to /proc/mounts check below. - notMnt = true - notMntErr = nil - } - if notMntErr != nil { - return notMnt, notMntErr - } - // identified as mountpoint, so return this fact. - if notMnt == false { - return notMnt, nil - } - - // Resolve any symlinks in file, kernel would do the same and use the resolved path in /proc/mounts. - resolvedFile, err := filepath.EvalSymlinks(file) - if err != nil { - return true, err - } - - // check all mountpoints since IsLikelyNotMountPoint - // is not reliable for some mountpoint types. - mountPoints, mountPointsErr := mounter.List() - if mountPointsErr != nil { - return notMnt, mountPointsErr - } - for _, mp := range mountPoints { - if isMountPointMatch(mp, resolvedFile) { - notMnt = false - break - } - } - return notMnt, nil -} - // MakeBindOpts detects whether a bind mount is being requested and makes the remount options to // use in case of bind mount, due to the fact that bind mount doesn't respect mount options. // The list equals: -// options - 'bind' + 'remount' (no duplicate) +// +// options - 'bind' + 'remount' (no duplicate) func MakeBindOpts(options []string) (bool, []string, []string) { bind, bindOpts, bindRemountOpts, _ := MakeBindOptsSensitive(options, nil /* sensitiveOptions */) return bind, bindOpts, bindRemountOpts diff --git a/vendor/k8s.io/mount-utils/mount_helper_common.go b/vendor/k8s.io/mount-utils/mount_helper_common.go index 196ae30ad..dc4131d78 100644 --- a/vendor/k8s.io/mount-utils/mount_helper_common.go +++ b/vendor/k8s.io/mount-utils/mount_helper_common.go @@ -31,7 +31,7 @@ import ( func CleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool) error { pathExists, pathErr := PathExists(mountPath) if !pathExists && pathErr == nil { - klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) + klog.Warningf("Warning: mount cleanup skipped because path does not exist: %v", mountPath) return nil } corruptedMnt := IsCorruptedMnt(pathErr) @@ -44,36 +44,41 @@ func CleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointC func CleanupMountWithForce(mountPath string, mounter MounterForceUnmounter, extensiveMountPointCheck bool, umountTimeout time.Duration) error { pathExists, pathErr := PathExists(mountPath) if !pathExists && pathErr == nil { - klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) + klog.Warningf("Warning: mount cleanup skipped because path does not exist: %v", mountPath) return nil } corruptedMnt := IsCorruptedMnt(pathErr) if pathErr != nil && !corruptedMnt { return fmt.Errorf("Error checking path: %v", pathErr) } - var notMnt bool - var err error - if !corruptedMnt { - notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) - // if mountPath was not a mount point - we would have attempted to remove mountPath - // and hence return errors if any. - if err != nil || notMnt { + + if corruptedMnt || mounter.canSafelySkipMountPointCheck() { + klog.V(4).Infof("unmounting %q (corruptedMount: %t, mounterCanSkipMountPointChecks: %t)", + mountPath, corruptedMnt, mounter.canSafelySkipMountPointCheck()) + if err := mounter.UnmountWithForce(mountPath, umountTimeout); err != nil { return err } + return removePath(mountPath) + } + + notMnt, err := removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // if mountPath is not a mount point, it's just been removed or there was an error + if err != nil || notMnt { + return err } - // Unmount the mount path klog.V(4).Infof("%q is a mountpoint, unmounting", mountPath) if err := mounter.UnmountWithForce(mountPath, umountTimeout); err != nil { return err } notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) - // mountPath is not a mount point we should return whatever error we saw + // if mountPath is not a mount point, it's either just been removed or there was an error if notMnt { return err } - return fmt.Errorf("Failed to unmount path %v", mountPath) + // mountPath is still a mount point + return fmt.Errorf("failed to cleanup mount point %v", mountPath) } // doCleanupMountPoint unmounts the given path and @@ -82,31 +87,35 @@ func CleanupMountWithForce(mountPath string, mounter MounterForceUnmounter, exte // IsNotMountPoint will be called instead of IsLikelyNotMountPoint. // IsNotMountPoint is more expensive but properly handles bind mounts within the same fs. // if corruptedMnt is true, it means that the mountPath is a corrupted mountpoint, and the mount point check -// will be skipped +// will be skipped. The mount point check will also be skipped if the mounter supports it. func doCleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool, corruptedMnt bool) error { - var notMnt bool - var err error - if !corruptedMnt { - notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) - // if mountPath was not a mount point - we would have attempted to remove mountPath - // and hence return errors if any. - if err != nil || notMnt { + if corruptedMnt || mounter.canSafelySkipMountPointCheck() { + klog.V(4).Infof("unmounting %q (corruptedMount: %t, mounterCanSkipMountPointChecks: %t)", + mountPath, corruptedMnt, mounter.canSafelySkipMountPointCheck()) + if err := mounter.Unmount(mountPath); err != nil { return err } + return removePath(mountPath) + } + + notMnt, err := removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // if mountPath is not a mount point, it's just been removed or there was an error + if err != nil || notMnt { + return err } - // Unmount the mount path klog.V(4).Infof("%q is a mountpoint, unmounting", mountPath) if err := mounter.Unmount(mountPath); err != nil { return err } notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) - // mountPath is not a mount point we should return whatever error we saw + // if mountPath is not a mount point, it's either just been removed or there was an error if notMnt { return err } - return fmt.Errorf("Failed to unmount path %v", mountPath) + // mountPath is still a mount point + return fmt.Errorf("failed to cleanup mount point %v", mountPath) } // removePathIfNotMountPoint verifies if given mountPath is a mount point if not it attempts @@ -135,3 +144,14 @@ func removePathIfNotMountPoint(mountPath string, mounter Interface, extensiveMou } return notMnt, nil } + +// removePath attempts to remove the directory. Returns nil if the directory was removed or does not exist. +func removePath(mountPath string) error { + klog.V(4).Infof("Warning: deleting path %q", mountPath) + err := os.Remove(mountPath) + if os.IsNotExist(err) { + klog.V(4).Infof("%q does not exist", mountPath) + return nil + } + return err +} diff --git a/vendor/k8s.io/mount-utils/mount_linux.go b/vendor/k8s.io/mount-utils/mount_linux.go index aaa592161..86323b712 100644 --- a/vendor/k8s.io/mount-utils/mount_linux.go +++ b/vendor/k8s.io/mount-utils/mount_linux.go @@ -21,7 +21,11 @@ package mount import ( "context" + "errors" "fmt" + "github.com/moby/sys/mountinfo" + "io/fs" + "io/ioutil" "os" "os/exec" "path/filepath" @@ -48,14 +52,18 @@ const ( fsckErrorsUncorrected = 4 // Error thrown by exec cmd.Run() when process spawned by cmd.Start() completes before cmd.Wait() is called (see - k/k issue #103753) errNoChildProcesses = "wait: no child processes" + // Error returned by some `umount` implementations when the specified path is not a mount point + errNotMounted = "not mounted" ) // Mounter provides the default implementation of mount.Interface // for the linux platform. This implementation assumes that the // kubelet is running in the host's root mount namespace. type Mounter struct { - mounterPath string - withSystemd bool + mounterPath string + withSystemd *bool + trySystemd bool + withSafeNotMountedBehavior bool } var _ MounterForceUnmounter = &Mounter{} @@ -65,11 +73,39 @@ var _ MounterForceUnmounter = &Mounter{} // mounterPath allows using an alternative to `/bin/mount` for mounting. func New(mounterPath string) Interface { return &Mounter{ - mounterPath: mounterPath, - withSystemd: detectSystemd(), + mounterPath: mounterPath, + trySystemd: true, + withSafeNotMountedBehavior: detectSafeNotMountedBehavior(), } } +// NewWithoutSystemd returns a Linux specific mount.Interface for the current +// system. It provides options to override the default mounter behavior. +// mounterPath allows using an alternative to `/bin/mount` for mounting. Any +// detection for systemd functionality is disabled with this Mounter. +func NewWithoutSystemd(mounterPath string) Interface { + return &Mounter{ + mounterPath: mounterPath, + trySystemd: false, + withSafeNotMountedBehavior: detectSafeNotMountedBehavior(), + } +} + +// hasSystemd validates that the withSystemd bool is set, if it is not, +// detectSystemd will be called once for this Mounter instance. +func (mounter *Mounter) hasSystemd() bool { + if !mounter.trySystemd { + mounter.withSystemd = &mounter.trySystemd + } + + if mounter.withSystemd == nil { + withSystemd := detectSystemd() + mounter.withSystemd = &withSystemd + } + + return *mounter.withSystemd +} + // Mount mounts source to target as fstype with given options. 'source' and 'fstype' must // be an empty string in case it's not required, e.g. for remount, or for auto filesystem // type, where kernel handles fstype for you. The mount 'options' is a list of options, @@ -90,11 +126,11 @@ func (mounter *Mounter) MountSensitive(source string, target string, fstype stri mounterPath := "" bind, bindOpts, bindRemountOpts, bindRemountOptsSensitive := MakeBindOptsSensitive(options, sensitiveOptions) if bind { - err := mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, bindOpts, bindRemountOptsSensitive, nil /* mountFlags */, true) + err := mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, bindOpts, bindRemountOptsSensitive, nil /* mountFlags */, mounter.trySystemd) if err != nil { return err } - return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, bindRemountOpts, bindRemountOptsSensitive, nil /* mountFlags */, true) + return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, bindRemountOpts, bindRemountOptsSensitive, nil /* mountFlags */, mounter.trySystemd) } // The list of filesystems that require containerized mounter on GCI image cluster fsTypesNeedMounter := map[string]struct{}{ @@ -106,7 +142,7 @@ func (mounter *Mounter) MountSensitive(source string, target string, fstype stri if _, ok := fsTypesNeedMounter[fstype]; ok { mounterPath = mounter.mounterPath } - return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, options, sensitiveOptions, nil /* mountFlags */, true) + return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, options, sensitiveOptions, nil /* mountFlags */, mounter.trySystemd) } // MountSensitiveWithoutSystemd is the same as MountSensitive() but disable using systemd mount. @@ -149,7 +185,7 @@ func (mounter *Mounter) doMount(mounterPath string, mountCmd string, source stri mountCmd = mounterPath } - if mounter.withSystemd && systemdMountRequired { + if systemdMountRequired && mounter.hasSystemd() { // Try to run mount via systemd-run --scope. This will escape the // service where kubelet runs and any fuse daemons will be started in a // specific scope. kubelet service than can be restarted without killing @@ -223,6 +259,36 @@ func detectSystemd() bool { return true } +// detectSafeNotMountedBehavior returns true if the umount implementation replies "not mounted" +// when the specified path is not mounted. When not sure (permission errors, ...), it returns false. +// When possible, we will trust umount's message and avoid doing our own mount point checks. +// More info: https://github.com/util-linux/util-linux/blob/v2.2/mount/umount.c#L179 +func detectSafeNotMountedBehavior() bool { + return detectSafeNotMountedBehaviorWithExec(utilexec.New()) +} + +// detectSafeNotMountedBehaviorWithExec is for testing with FakeExec. +func detectSafeNotMountedBehaviorWithExec(exec utilexec.Interface) bool { + // create a temp dir and try to umount it + path, err := ioutil.TempDir("", "kubelet-detect-safe-umount") + if err != nil { + klog.V(4).Infof("Cannot create temp dir to detect safe 'not mounted' behavior: %v", err) + return false + } + defer os.RemoveAll(path) + cmd := exec.Command("umount", path) + output, err := cmd.CombinedOutput() + if err != nil { + if strings.Contains(string(output), errNotMounted) { + klog.V(4).Infof("Detected umount with safe 'not mounted' behavior") + return true + } + klog.V(4).Infof("'umount %s' failed with: %v, output: %s", path, err, string(output)) + } + klog.V(4).Infof("Detected umount with unsafe 'not mounted' behavior") + return false +} + // MakeMountArgs makes the arguments to the mount(8) command. // options MUST not contain sensitive material (like passwords). func MakeMountArgs(source, target, fstype string, options []string) (mountArgs []string) { @@ -290,6 +356,7 @@ func AddSystemdScopeSensitive(systemdRunPath, mountName, command string, args [] } // Unmount unmounts the target. +// If the mounter has safe "not mounted" behavior, no error will be returned when the target is not a mount point. func (mounter *Mounter) Unmount(target string) error { klog.V(4).Infof("Unmounting %s", target) command := exec.Command("umount", target) @@ -303,6 +370,10 @@ func (mounter *Mounter) Unmount(target string) error { // Rewrite err with the actual exit error of the process. err = &exec.ExitError{ProcessState: command.ProcessState} } + if mounter.withSafeNotMountedBehavior && strings.Contains(string(output), errNotMounted) { + klog.V(4).Infof("ignoring 'not mounted' error for %s", target) + return nil + } return fmt.Errorf("unmount failed: %v\nUnmounting arguments: %s\nOutput: %s", err, target, string(output)) } return nil @@ -351,6 +422,11 @@ func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { return true, nil } +// canSafelySkipMountPointCheck relies on the detected behavior of umount when given a target that is not a mount point. +func (mounter *Mounter) canSafelySkipMountPointCheck() bool { + return mounter.withSafeNotMountedBehavior +} + // GetMountRefs finds all mount references to pathname, returns a // list of paths. Path could be a mountpoint or a normal // directory (for bind mount). @@ -637,6 +713,63 @@ func SearchMountPoints(hostSource, mountInfoPath string) ([]string, error) { return refs, nil } +// IsMountPoint determines if a file is a mountpoint. +// It first detects bind & any other mountpoints using +// MountedFast function. If the MountedFast function returns +// sure as true and err as nil, then a mountpoint is detected +// successfully. When an error is returned by MountedFast, the +// following is true: +// 1. All errors are returned with IsMountPoint as false +// except os.IsPermission. +// 2. When os.IsPermission is returned by MountedFast, List() +// is called to confirm if the given file is a mountpoint are not. +// +// os.ErrNotExist should always be returned if a file does not exist +// as callers have in past relied on this error and not fallback. +// +// When MountedFast returns sure as false and err as nil (eg: in +// case of bindmounts on kernel version 5.10- ); mounter.List() +// endpoint is called to enumerate all the mountpoints and check if +// it is mountpoint match or not. +func (mounter *Mounter) IsMountPoint(file string) (bool, error) { + isMnt, sure, isMntErr := mountinfo.MountedFast(file) + if sure && isMntErr == nil { + return isMnt, nil + } + if isMntErr != nil { + if errors.Is(isMntErr, fs.ErrNotExist) { + return false, fs.ErrNotExist + } + // We were not allowed to do the simple stat() check, e.g. on NFS with + // root_squash. Fall back to /proc/mounts check below when + // fs.ErrPermission is returned. + if !errors.Is(isMntErr, fs.ErrPermission) { + return false, isMntErr + } + } + // Resolve any symlinks in file, kernel would do the same and use the resolved path in /proc/mounts. + resolvedFile, err := filepath.EvalSymlinks(file) + if err != nil { + if errors.Is(isMntErr, fs.ErrNotExist) { + return false, fs.ErrNotExist + } + return false, err + } + + // check all mountpoints since MountedFast is not sure. + // is not reliable for some mountpoint types. + mountPoints, mountPointsErr := mounter.List() + if mountPointsErr != nil { + return false, mountPointsErr + } + for _, mp := range mountPoints { + if isMountPointMatch(mp, resolvedFile) { + return true, nil + } + } + return false, nil +} + // tryUnmount calls plain "umount" and waits for unmountTimeout for it to finish. func tryUnmount(path string, unmountTimeout time.Duration) error { klog.V(4).Infof("Unmounting %s", path) diff --git a/vendor/k8s.io/mount-utils/mount_unsupported.go b/vendor/k8s.io/mount-utils/mount_unsupported.go index 93ba9b2e3..026505282 100644 --- a/vendor/k8s.io/mount-utils/mount_unsupported.go +++ b/vendor/k8s.io/mount-utils/mount_unsupported.go @@ -74,6 +74,17 @@ func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { return true, errUnsupported } +// canSafelySkipMountPointCheck always returns false on unsupported platforms +func (mounter *Mounter) canSafelySkipMountPointCheck() bool { + return false +} + +// IsMountPoint determines if a directory is a mountpoint. +// It always returns an error on unsupported platforms. +func (mounter *Mounter) IsMountPoint(file string) (bool, error) { + return false, errUnsupported +} + // GetMountRefs always returns an error on unsupported platforms func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { return nil, errUnsupported @@ -86,3 +97,9 @@ func (mounter *SafeFormatAndMount) formatAndMountSensitive(source string, target func (mounter *SafeFormatAndMount) diskLooksUnformatted(disk string) (bool, error) { return true, errUnsupported } + +// IsMountPoint determines if a directory is a mountpoint. +// It always returns an error on unsupported platforms. +func (mounter *SafeFormatAndMount) IsMountPoint(file string) (bool, error) { + return false, errUnsupported +} diff --git a/vendor/k8s.io/mount-utils/mount_windows.go b/vendor/k8s.io/mount-utils/mount_windows.go index 3286a69c4..3800f75d4 100644 --- a/vendor/k8s.io/mount-utils/mount_windows.go +++ b/vendor/k8s.io/mount-utils/mount_windows.go @@ -244,6 +244,20 @@ func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { return true, nil } +// canSafelySkipMountPointCheck always returns false on Windows +func (mounter *Mounter) canSafelySkipMountPointCheck() bool { + return false +} + +// IsMountPoint: determines if a directory is a mountpoint. +func (mounter *Mounter) IsMountPoint(file string) (bool, error) { + isNotMnt, err := mounter.IsLikelyNotMountPoint(file) + if err != nil { + return false, err + } + return !isNotMnt, nil +} + // GetMountRefs : empty implementation here since there is no place to query all mount points on Windows func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { windowsPath := NormalizeWindowsPath(pathname) diff --git a/vendor/k8s.io/mount-utils/resizefs_unsupported.go b/vendor/k8s.io/mount-utils/resizefs_unsupported.go index 2d08211b4..88b8b2410 100644 --- a/vendor/k8s.io/mount-utils/resizefs_unsupported.go +++ b/vendor/k8s.io/mount-utils/resizefs_unsupported.go @@ -39,3 +39,8 @@ func NewResizeFs(exec utilexec.Interface) *ResizeFs { func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) { return false, fmt.Errorf("Resize is not supported for this build") } + +// NeedResize check whether mounted volume needs resize +func (resizefs *ResizeFs) NeedResize(devicePath string, deviceMountPath string) (bool, error) { + return false, fmt.Errorf("NeedResize is not supported for this build") +} diff --git a/vendor/k8s.io/utils/exec/exec.go b/vendor/k8s.io/utils/exec/exec.go index 96bec01ca..d9c91e3ca 100644 --- a/vendor/k8s.io/utils/exec/exec.go +++ b/vendor/k8s.io/utils/exec/exec.go @@ -19,6 +19,7 @@ package exec import ( "context" "io" + "io/fs" osexec "os/exec" "syscall" "time" @@ -98,17 +99,18 @@ func New() Interface { // Command is part of the Interface interface. func (executor *executor) Command(cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.Command(cmd, args...)) + return (*cmdWrapper)(maskErrDotCmd(osexec.Command(cmd, args...))) } // CommandContext is part of the Interface interface. func (executor *executor) CommandContext(ctx context.Context, cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.CommandContext(ctx, cmd, args...)) + return (*cmdWrapper)(maskErrDotCmd(osexec.CommandContext(ctx, cmd, args...))) } // LookPath is part of the Interface interface func (executor *executor) LookPath(file string) (string, error) { - return osexec.LookPath(file) + path, err := osexec.LookPath(file) + return path, handleError(maskErrDot(err)) } // Wraps exec.Cmd so we can capture errors. @@ -198,6 +200,8 @@ func handleError(err error) error { switch e := err.(type) { case *osexec.ExitError: return &ExitErrorWrapper{e} + case *fs.PathError: + return ErrExecutableNotFound case *osexec.Error: if e.Err == osexec.ErrNotFound { return ErrExecutableNotFound diff --git a/vendor/k8s.io/utils/exec/fixup_go118.go b/vendor/k8s.io/utils/exec/fixup_go118.go new file mode 100644 index 000000000..acf45f1cd --- /dev/null +++ b/vendor/k8s.io/utils/exec/fixup_go118.go @@ -0,0 +1,32 @@ +//go:build !go1.19 +// +build !go1.19 + +/* +Copyright 2022 The Kubernetes Authors. + +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 exec + +import ( + osexec "os/exec" +) + +func maskErrDotCmd(cmd *osexec.Cmd) *osexec.Cmd { + return cmd +} + +func maskErrDot(err error) error { + return err +} diff --git a/vendor/k8s.io/utils/exec/fixup_go119.go b/vendor/k8s.io/utils/exec/fixup_go119.go new file mode 100644 index 000000000..55874c929 --- /dev/null +++ b/vendor/k8s.io/utils/exec/fixup_go119.go @@ -0,0 +1,40 @@ +//go:build go1.19 +// +build go1.19 + +/* +Copyright 2022 The Kubernetes Authors. + +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 exec + +import ( + "errors" + osexec "os/exec" +) + +// maskErrDotCmd reverts the behavior of osexec.Cmd to what it was before go1.19 +// specifically set the Err field to nil (LookPath returns a new error when the file +// is resolved to the current directory. +func maskErrDotCmd(cmd *osexec.Cmd) *osexec.Cmd { + cmd.Err = maskErrDot(cmd.Err) + return cmd +} + +func maskErrDot(err error) error { + if err != nil && errors.Is(err, osexec.ErrDot) { + return nil + } + return err +} diff --git a/vendor/k8s.io/utils/nsenter/nsenter.go b/vendor/k8s.io/utils/nsenter/nsenter.go index 545883900..237b636bc 100644 --- a/vendor/k8s.io/utils/nsenter/nsenter.go +++ b/vendor/k8s.io/utils/nsenter/nsenter.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/vendor/k8s.io/utils/nsenter/nsenter_unsupported.go b/vendor/k8s.io/utils/nsenter/nsenter_unsupported.go index e38c7e811..8b56e91d2 100644 --- a/vendor/k8s.io/utils/nsenter/nsenter_unsupported.go +++ b/vendor/k8s.io/utils/nsenter/nsenter_unsupported.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux /* diff --git a/vendor/k8s.io/utils/pointer/pointer.go b/vendor/k8s.io/utils/pointer/pointer.go index f5802d2e8..e745a81be 100644 --- a/vendor/k8s.io/utils/pointer/pointer.go +++ b/vendor/k8s.io/utils/pointer/pointer.go @@ -52,6 +52,8 @@ func Int(i int) *int { return &i } +// IntPtr is a function variable referring to Int. +// Deprecated: Use Int instead. var IntPtr = Int // for back-compat // IntDeref dereferences the int ptr and returns it if not nil, or else @@ -63,6 +65,8 @@ func IntDeref(ptr *int, def int) int { return def } +// IntPtrDerefOr is a function variable referring to IntDeref. +// Deprecated: Use IntDeref instead. var IntPtrDerefOr = IntDeref // for back-compat // Int32 returns a pointer to an int32. @@ -70,6 +74,8 @@ func Int32(i int32) *int32 { return &i } +// Int32Ptr is a function variable referring to Int32. +// Deprecated: Use Int32 instead. var Int32Ptr = Int32 // for back-compat // Int32Deref dereferences the int32 ptr and returns it if not nil, or else @@ -81,6 +87,8 @@ func Int32Deref(ptr *int32, def int32) int32 { return def } +// Int32PtrDerefOr is a function variable referring to Int32Deref. +// Deprecated: Use Int32Deref instead. var Int32PtrDerefOr = Int32Deref // for back-compat // Int32Equal returns true if both arguments are nil or both arguments @@ -100,6 +108,8 @@ func Int64(i int64) *int64 { return &i } +// Int64Ptr is a function variable referring to Int64. +// Deprecated: Use Int64 instead. var Int64Ptr = Int64 // for back-compat // Int64Deref dereferences the int64 ptr and returns it if not nil, or else @@ -111,6 +121,8 @@ func Int64Deref(ptr *int64, def int64) int64 { return def } +// Int64PtrDerefOr is a function variable referring to Int64Deref. +// Deprecated: Use Int64Deref instead. var Int64PtrDerefOr = Int64Deref // for back-compat // Int64Equal returns true if both arguments are nil or both arguments @@ -130,6 +142,8 @@ func Bool(b bool) *bool { return &b } +// BoolPtr is a function variable referring to Bool. +// Deprecated: Use Bool instead. var BoolPtr = Bool // for back-compat // BoolDeref dereferences the bool ptr and returns it if not nil, or else @@ -141,6 +155,8 @@ func BoolDeref(ptr *bool, def bool) bool { return def } +// BoolPtrDerefOr is a function variable referring to BoolDeref. +// Deprecated: Use BoolDeref instead. var BoolPtrDerefOr = BoolDeref // for back-compat // BoolEqual returns true if both arguments are nil or both arguments @@ -160,6 +176,8 @@ func String(s string) *string { return &s } +// StringPtr is a function variable referring to String. +// Deprecated: Use String instead. var StringPtr = String // for back-compat // StringDeref dereferences the string ptr and returns it if not nil, or else @@ -171,6 +189,8 @@ func StringDeref(ptr *string, def string) string { return def } +// StringPtrDerefOr is a function variable referring to StringDeref. +// Deprecated: Use StringDeref instead. var StringPtrDerefOr = StringDeref // for back-compat // StringEqual returns true if both arguments are nil or both arguments @@ -190,6 +210,8 @@ func Float32(i float32) *float32 { return &i } +// Float32Ptr is a function variable referring to Float32. +// Deprecated: Use Float32 instead. var Float32Ptr = Float32 // Float32Deref dereferences the float32 ptr and returns it if not nil, or else @@ -201,6 +223,8 @@ func Float32Deref(ptr *float32, def float32) float32 { return def } +// Float32PtrDerefOr is a function variable referring to Float32Deref. +// Deprecated: Use Float32Deref instead. var Float32PtrDerefOr = Float32Deref // for back-compat // Float32Equal returns true if both arguments are nil or both arguments @@ -220,6 +244,8 @@ func Float64(i float64) *float64 { return &i } +// Float64Ptr is a function variable referring to Float64. +// Deprecated: Use Float64 instead. var Float64Ptr = Float64 // Float64Deref dereferences the float64 ptr and returns it if not nil, or else @@ -231,6 +257,8 @@ func Float64Deref(ptr *float64, def float64) float64 { return def } +// Float64PtrDerefOr is a function variable referring to Float64Deref. +// Deprecated: Use Float64Deref instead. var Float64PtrDerefOr = Float64Deref // for back-compat // Float64Equal returns true if both arguments are nil or both arguments diff --git a/vendor/modules.txt b/vendor/modules.txt index d4e943ff5..5739831fa 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -176,7 +176,7 @@ github.com/fsnotify/fsnotify # github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 ## explicit github.com/ghodss/yaml -# github.com/go-logr/logr v1.2.0 +# github.com/go-logr/logr v1.2.3 ## explicit; go 1.16 github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.5 @@ -395,6 +395,9 @@ github.com/mitchellh/reflectwalk ## explicit; go 1.13 github.com/moby/spdystream github.com/moby/spdystream/spdy +# github.com/moby/sys/mountinfo v0.6.0 +## explicit; go 1.16 +github.com/moby/sys/mountinfo # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd ## explicit github.com/modern-go/concurrent @@ -609,7 +612,7 @@ golang.org/x/net/trace ## explicit; go 1.11 golang.org/x/oauth2 golang.org/x/oauth2/internal -# golang.org/x/sys v0.0.0-20220209214540-3681064d5158 +# golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/internal/unsafeheader @@ -1273,13 +1276,13 @@ k8s.io/kubernetes/test/e2e/storage/utils k8s.io/kubernetes/test/e2e/testing-manifests k8s.io/kubernetes/test/utils k8s.io/kubernetes/test/utils/image -# k8s.io/mount-utils v0.24.3 => k8s.io/mount-utils v0.24.3 -## explicit; go 1.16 +# k8s.io/mount-utils v0.24.3 => k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 +## explicit; go 1.18 k8s.io/mount-utils # k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.24.3 ## explicit; go 1.16 k8s.io/pod-security-admission/api -# k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 +# k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed ## explicit; go 1.12 k8s.io/utils/buffer k8s.io/utils/clock @@ -1378,7 +1381,7 @@ sigs.k8s.io/yaml # k8s.io/kubelet => k8s.io/kubelet v0.24.3 # k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.3 # k8s.io/metrics => k8s.io/metrics v0.24.3 -# k8s.io/mount-utils => k8s.io/mount-utils v0.24.3 +# k8s.io/mount-utils => k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 # k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.3 # k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.3 # layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917 From 3a200b6976de169b8a1c7e529bd15675be517d2c Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Fri, 15 Jul 2022 14:13:29 +0200 Subject: [PATCH 35/37] rbd: use IsLikelyNotMountPoint() to prevent systemd log messages Signed-off-by: Niels de Vos --- internal/rbd/nodeserver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/rbd/nodeserver.go b/internal/rbd/nodeserver.go index bd7a3facb..da7fe96ad 100644 --- a/internal/rbd/nodeserver.go +++ b/internal/rbd/nodeserver.go @@ -814,7 +814,7 @@ func (ns *NodeServer) mountVolume(ctx context.Context, stagingPath string, req * func (ns *NodeServer) createTargetMountPath(ctx context.Context, mountPath string, isBlock bool) (bool, error) { // Check if that mount path exists properly - notMnt, err := mount.IsNotMountPoint(ns.Mounter, mountPath) + notMnt, err := ns.Mounter.IsLikelyNotMountPoint(mountPath) if err == nil { return notMnt, nil } From 10b2277330d26a3aac9e673923c66b4af86a5ba5 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Mon, 18 Jul 2022 15:08:42 +0200 Subject: [PATCH 36/37] util: use k8s.io/mount-utils/NewWithoutSystemd() to prevent logging NewWithoutSystemd() has been introduced in the k8s.io/mount-utils package so that systemd is not called while executing functions. This offers consumers the ability to prevent confusing and scary messages from getting logged. See-also: kubernetes/kubernetes#111218 Signed-off-by: Niels de Vos --- internal/csi-common/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/csi-common/utils.go b/internal/csi-common/utils.go index e4f5c5933..c7a8366b5 100644 --- a/internal/csi-common/utils.go +++ b/internal/csi-common/utils.go @@ -64,7 +64,7 @@ func NewDefaultNodeServer(d *CSIDriver, t string, topology map[string]string) *D return &DefaultNodeServer{ Driver: d, Type: t, - Mounter: mount.New(""), + Mounter: mount.NewWithoutSystemd(""), } } From 83df1eae53a0e0e2b3b8ff0972f32ca110baf862 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 2 Aug 2022 09:50:18 +0200 Subject: [PATCH 37/37] rebase: k8s.io/mount-utils/IsNotMountPoint() is deprecated IsNotMountPoint() is deprecated and Mounter.IsMountPoint() is recommended to be used instead. Reported-by: golangci/staticcheck Signed-off-by: Niels de Vos --- internal/rbd/nodeserver.go | 12 ++++++------ internal/rbd/rbd_util.go | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/rbd/nodeserver.go b/internal/rbd/nodeserver.go index da7fe96ad..9c863920c 100644 --- a/internal/rbd/nodeserver.go +++ b/internal/rbd/nodeserver.go @@ -858,7 +858,7 @@ func (ns *NodeServer) NodeUnpublishVolume( targetPath := req.GetTargetPath() // considering kubelet make sure node operations like unpublish/unstage...etc can not be called // at same time, an explicit locking at time of nodeunpublish is not required. - notMnt, err := mount.IsNotMountPoint(ns.Mounter, targetPath) + isMnt, err := ns.Mounter.IsMountPoint(targetPath) if err != nil { if os.IsNotExist(err) { // targetPath has already been deleted @@ -869,7 +869,7 @@ func (ns *NodeServer) NodeUnpublishVolume( return nil, status.Error(codes.NotFound, err.Error()) } - if notMnt { + if !isMnt { if err = os.RemoveAll(targetPath); err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -925,15 +925,15 @@ func (ns *NodeServer) NodeUnstageVolume( stagingParentPath := req.GetStagingTargetPath() stagingTargetPath := getStagingTargetPath(req) - notMnt, err := mount.IsNotMountPoint(ns.Mounter, stagingTargetPath) + isMnt, err := ns.Mounter.IsMountPoint(stagingTargetPath) if err != nil { if !os.IsNotExist(err) { return nil, status.Error(codes.NotFound, err.Error()) } // Continue on ENOENT errors as we may still have the image mapped - notMnt = true + isMnt = false } - if !notMnt { + if isMnt { // Unmounting the image err = ns.Mounter.Unmount(stagingTargetPath) if err != nil { @@ -961,7 +961,7 @@ func (ns *NodeServer) NodeUnstageVolume( log.UsefulLog(ctx, "failed to find image metadata: %v", err) // It is an error if it was mounted, as we should have found the image metadata file with // no errors - if !notMnt { + if isMnt { return nil, status.Error(codes.Internal, err.Error()) } diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 3d36cf6f7..398557318 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -554,12 +554,12 @@ func checkValidImageFeatures(imageFeatures string, ok bool) bool { // isNotMountPoint checks whether MountPoint does not exists and // also discards error indicating mountPoint exists. func isNotMountPoint(mounter mount.Interface, stagingTargetPath string) (bool, error) { - isNotMnt, err := mount.IsNotMountPoint(mounter, stagingTargetPath) + isMnt, err := mounter.IsMountPoint(stagingTargetPath) if os.IsNotExist(err) { err = nil } - return isNotMnt, err + return !isMnt, err } // isCephMgrSupported determines if the cluster has support for MGR based operation