diff --git a/docs/functions.rst b/docs/functions.rst index 2ef0c46e5f..e1e4c8a654 100644 --- a/docs/functions.rst +++ b/docs/functions.rst @@ -14,6 +14,7 @@ implements the following go interface: Name() string Exec(ctx context.Context, args ...string) (map[string]interface{}, error) RequiredArgs() []string + Arguments() []string } Kanister Functions are registered by the return value of ``Name()``, which must be @@ -24,7 +25,9 @@ a ``BlueprintPhase`` is used to lookup a Kanister Function. After ``BlueprintPhase.Args`` are rendered, they are passed into the Kanister Function's ``Exec()`` method. -The ``RequiredArgs`` method returns the list of argument names that are required. +The ``RequiredArgs`` method returns the list of argument names that are required. And +``Arguments`` method returns the list of all the argument names that are supported +by the function. Existing Functions ================== diff --git a/pkg/function/backup_data.go b/pkg/function/backup_data.go index 55a2e5bfe4..d426c098bb 100644 --- a/pkg/function/backup_data.go +++ b/pkg/function/backup_data.go @@ -120,8 +120,24 @@ func (*backupDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args m } func (*backupDataFunc) RequiredArgs() []string { - return []string{BackupDataNamespaceArg, BackupDataPodArg, BackupDataContainerArg, - BackupDataIncludePathArg, BackupDataBackupArtifactPrefixArg} + return []string{ + BackupDataNamespaceArg, + BackupDataPodArg, + BackupDataContainerArg, + BackupDataIncludePathArg, + BackupDataBackupArtifactPrefixArg, + } +} + +func (*backupDataFunc) Arguments() []string { + return []string{ + BackupDataNamespaceArg, + BackupDataPodArg, + BackupDataContainerArg, + BackupDataIncludePathArg, + BackupDataBackupArtifactPrefixArg, + BackupDataEncryptionKeyArg, + } } type backupDataParsedOutput struct { diff --git a/pkg/function/backup_data_all.go b/pkg/function/backup_data_all.go index 8c9d20b303..66cece7ded 100644 --- a/pkg/function/backup_data_all.go +++ b/pkg/function/backup_data_all.go @@ -118,8 +118,23 @@ func (*backupDataAllFunc) Exec(ctx context.Context, tp param.TemplateParams, arg } func (*backupDataAllFunc) RequiredArgs() []string { - return []string{BackupDataAllNamespaceArg, BackupDataAllContainerArg, - BackupDataAllIncludePathArg, BackupDataAllBackupArtifactPrefixArg} + return []string{ + BackupDataAllNamespaceArg, + BackupDataAllContainerArg, + BackupDataAllIncludePathArg, + BackupDataAllBackupArtifactPrefixArg, + } +} + +func (*backupDataAllFunc) Arguments() []string { + return []string{ + BackupDataAllNamespaceArg, + BackupDataAllContainerArg, + BackupDataAllIncludePathArg, + BackupDataAllBackupArtifactPrefixArg, + BackupDataAllPodsArg, + BackupDataAllEncryptionKeyArg, + } } func backupDataAll(ctx context.Context, cli kubernetes.Interface, namespace string, ps []string, container string, backupArtifactPrefix, includePath, encryptionKey string, tp param.TemplateParams) (map[string]interface{}, error) { diff --git a/pkg/function/backup_data_stats.go b/pkg/function/backup_data_stats.go index 50cb5927fe..07a34d8030 100644 --- a/pkg/function/backup_data_stats.go +++ b/pkg/function/backup_data_stats.go @@ -147,5 +147,19 @@ func (*BackupDataStatsFunc) Exec(ctx context.Context, tp param.TemplateParams, a } func (*BackupDataStatsFunc) RequiredArgs() []string { - return []string{BackupDataStatsNamespaceArg, BackupDataStatsBackupArtifactPrefixArg} + return []string{ + BackupDataStatsNamespaceArg, + BackupDataStatsBackupArtifactPrefixArg, + BackupDataStatsBackupIdentifierArg, + } +} + +func (*BackupDataStatsFunc) Arguments() []string { + return []string{ + BackupDataStatsNamespaceArg, + BackupDataStatsBackupArtifactPrefixArg, + BackupDataStatsBackupIdentifierArg, + BackupDataStatsMode, + BackupDataStatsEncryptionKeyArg, + } } diff --git a/pkg/function/checkRepository.go b/pkg/function/checkRepository.go index c88776c1ba..443bced7f8 100644 --- a/pkg/function/checkRepository.go +++ b/pkg/function/checkRepository.go @@ -125,3 +125,10 @@ func (*CheckRepositoryFunc) Exec(ctx context.Context, tp param.TemplateParams, a func (*CheckRepositoryFunc) RequiredArgs() []string { return []string{CheckRepositoryArtifactPrefixArg} } + +func (*CheckRepositoryFunc) Arguments() []string { + return []string{ + CheckRepositoryArtifactPrefixArg, + CheckRepositoryEncryptionKeyArg, + } +} diff --git a/pkg/function/copy_volume_data.go b/pkg/function/copy_volume_data.go index 6c85b02505..e71ec0fdbf 100644 --- a/pkg/function/copy_volume_data.go +++ b/pkg/function/copy_volume_data.go @@ -167,5 +167,18 @@ func (*copyVolumeDataFunc) Exec(ctx context.Context, tp param.TemplateParams, ar } func (*copyVolumeDataFunc) RequiredArgs() []string { - return []string{CopyVolumeDataNamespaceArg, CopyVolumeDataVolumeArg, CopyVolumeDataArtifactPrefixArg} + return []string{ + CopyVolumeDataNamespaceArg, + CopyVolumeDataVolumeArg, + CopyVolumeDataArtifactPrefixArg, + } +} + +func (*copyVolumeDataFunc) Arguments() []string { + return []string{ + CopyVolumeDataNamespaceArg, + CopyVolumeDataVolumeArg, + CopyVolumeDataArtifactPrefixArg, + CopyVolumeDataEncryptionKeyArg, + } } diff --git a/pkg/function/create_csi_snapshot.go b/pkg/function/create_csi_snapshot.go index cfbd3af068..abcf9bb58d 100644 --- a/pkg/function/create_csi_snapshot.go +++ b/pkg/function/create_csi_snapshot.go @@ -122,6 +122,16 @@ func (*createCSISnapshotFunc) RequiredArgs() []string { } } +func (*createCSISnapshotFunc) Arguments() []string { + return []string{ + CreateCSISnapshotPVCNameArg, + CreateCSISnapshotNamespaceArg, + CreateCSISnapshotSnapshotClassArg, + CreateCSISnapshotNameArg, + CreateCSISnapshotLabelsArg, + } +} + func createCSISnapshot(ctx context.Context, snapshotter snapshot.Snapshotter, name, namespace, pvc, snapshotClass string, wait bool, labels map[string]string) (*v1.VolumeSnapshot, error) { if err := snapshotter.Create(ctx, name, namespace, pvc, &snapshotClass, wait, labels); err != nil { return nil, err diff --git a/pkg/function/create_rds_snapshot.go b/pkg/function/create_rds_snapshot.go index f40e95affa..acd41f8d49 100644 --- a/pkg/function/create_rds_snapshot.go +++ b/pkg/function/create_rds_snapshot.go @@ -159,3 +159,10 @@ func (*createRDSSnapshotFunc) RequiredArgs() []string { CreateRDSSnapshotInstanceIDArg, } } + +func (crs *createRDSSnapshotFunc) Arguments() []string { + return []string{ + CreateRDSSnapshotInstanceIDArg, + CreateRDSSnapshotDBEngine, + } +} diff --git a/pkg/function/create_volume_from_snapshot.go b/pkg/function/create_volume_from_snapshot.go index 75f4dfa666..156dca1442 100644 --- a/pkg/function/create_volume_from_snapshot.go +++ b/pkg/function/create_volume_from_snapshot.go @@ -141,5 +141,16 @@ func (kef *createVolumeFromSnapshotFunc) Exec(ctx context.Context, tp param.Temp } func (*createVolumeFromSnapshotFunc) RequiredArgs() []string { - return []string{CreateVolumeFromSnapshotNamespaceArg, CreateVolumeFromSnapshotManifestArg} + return []string{ + CreateVolumeFromSnapshotNamespaceArg, + CreateVolumeFromSnapshotManifestArg, + } +} + +func (*createVolumeFromSnapshotFunc) Arguments() []string { + return []string{ + CreateVolumeFromSnapshotNamespaceArg, + CreateVolumeFromSnapshotManifestArg, + CreateVolumeFromSnapshotPVCNamesArg, + } } diff --git a/pkg/function/create_volume_snapshot.go b/pkg/function/create_volume_snapshot.go index 6b57d3e32b..87f28684e7 100644 --- a/pkg/function/create_volume_snapshot.go +++ b/pkg/function/create_volume_snapshot.go @@ -309,3 +309,11 @@ func getConfig(profile *param.Profile, sType blockstorage.Type) map[string]strin func (*createVolumeSnapshotFunc) RequiredArgs() []string { return []string{CreateVolumeSnapshotNamespaceArg} } + +func (*createVolumeSnapshotFunc) Arguments() []string { + return []string{ + CreateVolumeSnapshotNamespaceArg, + CreateVolumeSnapshotPVCsArg, + CreateVolumeSnapshotSkipWaitArg, + } +} diff --git a/pkg/function/delete_csi_snapshot.go b/pkg/function/delete_csi_snapshot.go index dfd1027dc1..cbdfb3de56 100644 --- a/pkg/function/delete_csi_snapshot.go +++ b/pkg/function/delete_csi_snapshot.go @@ -86,6 +86,13 @@ func (*deleteCSISnapshotFunc) RequiredArgs() []string { } } +func (*deleteCSISnapshotFunc) Arguments() []string { + return []string{ + DeleteCSISnapshotNameArg, + DeleteCSISnapshotNamespaceArg, + } +} + func deleteCSISnapshot(ctx context.Context, snapshotter snapshot.Snapshotter, name, namespace string) (*v1.VolumeSnapshot, error) { return snapshotter.Delete(ctx, name, namespace) } diff --git a/pkg/function/delete_data.go b/pkg/function/delete_data.go index 5691f15959..0455813523 100644 --- a/pkg/function/delete_data.go +++ b/pkg/function/delete_data.go @@ -190,5 +190,19 @@ func (*deleteDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args m } func (*deleteDataFunc) RequiredArgs() []string { - return []string{DeleteDataNamespaceArg, DeleteDataBackupArtifactPrefixArg} + return []string{ + DeleteDataNamespaceArg, + DeleteDataBackupArtifactPrefixArg, + } +} + +func (*deleteDataFunc) Arguments() []string { + return []string{ + DeleteDataNamespaceArg, + DeleteDataBackupArtifactPrefixArg, + DeleteDataBackupIdentifierArg, + DeleteDataBackupTagArg, + DeleteDataEncryptionKeyArg, + DeleteDataReclaimSpace, + } } diff --git a/pkg/function/delete_data_all.go b/pkg/function/delete_data_all.go index c72ae7d9eb..2b6fd8e054 100644 --- a/pkg/function/delete_data_all.go +++ b/pkg/function/delete_data_all.go @@ -104,5 +104,19 @@ func (*deleteDataAllFunc) Exec(ctx context.Context, tp param.TemplateParams, arg } func (*deleteDataAllFunc) RequiredArgs() []string { - return []string{DeleteDataAllNamespaceArg, DeleteDataAllBackupArtifactPrefixArg, DeleteDataAllBackupInfo} + return []string{ + DeleteDataAllNamespaceArg, + DeleteDataAllBackupArtifactPrefixArg, + DeleteDataAllBackupInfo, + } +} + +func (*deleteDataAllFunc) Arguments() []string { + return []string{ + DeleteDataAllNamespaceArg, + DeleteDataAllBackupArtifactPrefixArg, + DeleteDataAllBackupInfo, + DeleteDataAllEncryptionKeyArg, + DeleteDataAllReclaimSpace, + } } diff --git a/pkg/function/delete_rds_snapshot.go b/pkg/function/delete_rds_snapshot.go index 9408abef90..9405a96045 100644 --- a/pkg/function/delete_rds_snapshot.go +++ b/pkg/function/delete_rds_snapshot.go @@ -125,3 +125,10 @@ func (crs *deleteRDSSnapshotFunc) Exec(ctx context.Context, tp param.TemplatePar func (*deleteRDSSnapshotFunc) RequiredArgs() []string { return []string{DeleteRDSSnapshotSnapshotIDArg} } + +func (*deleteRDSSnapshotFunc) Arguments() []string { + return []string{ + DeleteRDSSnapshotSnapshotIDArg, + CreateRDSSnapshotDBEngine, + } +} diff --git a/pkg/function/delete_volume_snapshot.go b/pkg/function/delete_volume_snapshot.go index 7bb18821d5..02b0debf3e 100644 --- a/pkg/function/delete_volume_snapshot.go +++ b/pkg/function/delete_volume_snapshot.go @@ -110,5 +110,15 @@ func (kef *deleteVolumeSnapshotFunc) Exec(ctx context.Context, tp param.Template } func (*deleteVolumeSnapshotFunc) RequiredArgs() []string { - return []string{DeleteVolumeSnapshotNamespaceArg, DeleteVolumeSnapshotManifestArg} + return []string{ + DeleteVolumeSnapshotNamespaceArg, + DeleteVolumeSnapshotManifestArg, + } +} + +func (*deleteVolumeSnapshotFunc) Arguments() []string { + return []string{ + DeleteVolumeSnapshotNamespaceArg, + DeleteVolumeSnapshotManifestArg, + } } diff --git a/pkg/function/describe_backups.go b/pkg/function/describe_backups.go index 39b09bb8f6..e073cc0777 100644 --- a/pkg/function/describe_backups.go +++ b/pkg/function/describe_backups.go @@ -169,3 +169,10 @@ func (*DescribeBackupsFunc) Exec(ctx context.Context, tp param.TemplateParams, a func (*DescribeBackupsFunc) RequiredArgs() []string { return []string{DescribeBackupsArtifactPrefixArg} } + +func (*DescribeBackupsFunc) Arguments() []string { + return []string{ + DescribeBackupsArtifactPrefixArg, + DescribeBackupsEncryptionKeyArg, + } +} diff --git a/pkg/function/export_rds_snapshot_location.go b/pkg/function/export_rds_snapshot_location.go index 5e6158e1ff..ab7af9fa2c 100644 --- a/pkg/function/export_rds_snapshot_location.go +++ b/pkg/function/export_rds_snapshot_location.go @@ -191,7 +191,24 @@ func (crs *exportRDSSnapshotToLocationFunc) Exec(ctx context.Context, tp param.T } func (*exportRDSSnapshotToLocationFunc) RequiredArgs() []string { - return []string{ExportRDSSnapshotToLocNamespaceArg, ExportRDSSnapshotToLocInstanceIDArg, ExportRDSSnapshotToLocSnapshotIDArg, ExportRDSSnapshotToLocDBEngineArg} + return []string{ + ExportRDSSnapshotToLocNamespaceArg, + ExportRDSSnapshotToLocInstanceIDArg, + ExportRDSSnapshotToLocSnapshotIDArg, + ExportRDSSnapshotToLocDBEngineArg, + } +} + +func (*exportRDSSnapshotToLocationFunc) Arguments() []string { + return []string{ + ExportRDSSnapshotToLocNamespaceArg, + ExportRDSSnapshotToLocInstanceIDArg, + ExportRDSSnapshotToLocSnapshotIDArg, + ExportRDSSnapshotToLocDBEngineArg, + ExportRDSSnapshotToLocDBUsernameArg, + ExportRDSSnapshotToLocDBPasswordArg, + ExportRDSSnapshotToLocBackupArtPrefixArg, + } } func execDumpCommand(ctx context.Context, dbEngine RDSDBEngine, action RDSAction, namespace, dbEndpoint, username, password string, databases []string, backupPrefix, backupID string, profile *param.Profile, dbEngineVersion string) (map[string]interface{}, error) { diff --git a/pkg/function/kube_exec.go b/pkg/function/kube_exec.go index 7fdbd2dbe1..d316f33f4a 100644 --- a/pkg/function/kube_exec.go +++ b/pkg/function/kube_exec.go @@ -107,5 +107,18 @@ func (kef *kubeExecFunc) Exec(ctx context.Context, tp param.TemplateParams, args } func (*kubeExecFunc) RequiredArgs() []string { - return []string{KubeExecNamespaceArg, KubeExecPodNameArg, KubeExecCommandArg} + return []string{ + KubeExecNamespaceArg, + KubeExecPodNameArg, + KubeExecCommandArg, + } +} + +func (*kubeExecFunc) Arguments() []string { + return []string{ + KubeExecNamespaceArg, + KubeExecPodNameArg, + KubeExecCommandArg, + KubeExecContainerNameArg, + } } diff --git a/pkg/function/kube_exec_all.go b/pkg/function/kube_exec_all.go index 2ea008fe64..10ee33b6ec 100644 --- a/pkg/function/kube_exec_all.go +++ b/pkg/function/kube_exec_all.go @@ -77,7 +77,21 @@ func (*kubeExecAllFunc) Exec(ctx context.Context, tp param.TemplateParams, args } func (*kubeExecAllFunc) RequiredArgs() []string { - return []string{KubeExecAllNamespaceArg, KubeExecAllPodsNameArg, KubeExecAllContainersNameArg, KubeExecAllCommandArg} + return []string{ + KubeExecAllNamespaceArg, + KubeExecAllPodsNameArg, + KubeExecAllContainersNameArg, + KubeExecAllCommandArg, + } +} + +func (*kubeExecAllFunc) Arguments() []string { + return []string{ + KubeExecAllNamespaceArg, + KubeExecAllPodsNameArg, + KubeExecAllContainersNameArg, + KubeExecAllCommandArg, + } } func execAll(ctx context.Context, cli kubernetes.Interface, namespace string, ps []string, cs []string, cmd []string) (map[string]interface{}, error) { diff --git a/pkg/function/kube_task.go b/pkg/function/kube_task.go index dd00d8c3cb..45591a7446 100644 --- a/pkg/function/kube_task.go +++ b/pkg/function/kube_task.go @@ -115,5 +115,17 @@ func (ktf *kubeTaskFunc) Exec(ctx context.Context, tp param.TemplateParams, args } func (*kubeTaskFunc) RequiredArgs() []string { - return []string{KubeTaskImageArg, KubeTaskCommandArg} + return []string{ + KubeTaskImageArg, + KubeTaskCommandArg, + } +} + +func (*kubeTaskFunc) Arguments() []string { + return []string{ + KubeTaskImageArg, + KubeTaskCommandArg, + KubeTaskNamespaceArg, + KubeTaskPodOverrideArg, + } } diff --git a/pkg/function/kubeops.go b/pkg/function/kubeops.go index 550e3f7236..5fd901ae79 100644 --- a/pkg/function/kubeops.go +++ b/pkg/function/kubeops.go @@ -119,3 +119,12 @@ func (*kubeops) RequiredArgs() []string { KubeOpsOperationArg, } } + +func (*kubeops) Arguments() []string { + return []string{ + KubeOpsSpecArg, + KubeOpsOperationArg, + KubeOpsNamespaceArg, + KubeOpsObjectReferenceArg, + } +} diff --git a/pkg/function/location_delete.go b/pkg/function/location_delete.go index 7919bc7b63..1977b7fa04 100644 --- a/pkg/function/location_delete.go +++ b/pkg/function/location_delete.go @@ -59,3 +59,7 @@ func (*locationDeleteFunc) Exec(ctx context.Context, tp param.TemplateParams, ar func (*locationDeleteFunc) RequiredArgs() []string { return []string{LocationDeleteArtifactArg} } + +func (*locationDeleteFunc) Arguments() []string { + return []string{LocationDeleteArtifactArg} +} diff --git a/pkg/function/prepare_data.go b/pkg/function/prepare_data.go index 5b2f606e46..e3ddcd26f6 100644 --- a/pkg/function/prepare_data.go +++ b/pkg/function/prepare_data.go @@ -153,5 +153,20 @@ func (*prepareDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args } func (*prepareDataFunc) RequiredArgs() []string { - return []string{PrepareDataNamespaceArg, PrepareDataImageArg, PrepareDataCommandArg} + return []string{ + PrepareDataNamespaceArg, + PrepareDataImageArg, + PrepareDataCommandArg, + } +} + +func (*prepareDataFunc) Arguments() []string { + return []string{ + PrepareDataNamespaceArg, + PrepareDataImageArg, + PrepareDataCommandArg, + PrepareDataVolumes, + PrepareDataServiceAccount, + PrepareDataPodOverrideArg, + } } diff --git a/pkg/function/restore_csi_snapshot.go b/pkg/function/restore_csi_snapshot.go index b85a2099bb..657897e745 100644 --- a/pkg/function/restore_csi_snapshot.go +++ b/pkg/function/restore_csi_snapshot.go @@ -135,6 +135,19 @@ func (*restoreCSISnapshotFunc) RequiredArgs() []string { } } +func (*restoreCSISnapshotFunc) Arguments() []string { + return []string{ + RestoreCSISnapshotNameArg, + RestoreCSISnapshotPVCNameArg, + RestoreCSISnapshotNamespaceArg, + RestoreCSISnapshotStorageClassArg, + RestoreCSISnapshotRestoreSizeArg, + RestoreCSISnapshotAccessModesArg, + RestoreCSISnapshotVolumeModeArg, + RestoreCSISnapshotLabelsArg, + } +} + func getClient() (kubernetes.Interface, error) { kubeCli, err := kube.NewClient() return kubeCli, err diff --git a/pkg/function/restore_data.go b/pkg/function/restore_data.go index 2b3d2ddeec..d1cbdf80df 100644 --- a/pkg/function/restore_data.go +++ b/pkg/function/restore_data.go @@ -214,6 +214,23 @@ func (*restoreDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args } func (*restoreDataFunc) RequiredArgs() []string { - return []string{RestoreDataNamespaceArg, RestoreDataImageArg, - RestoreDataBackupArtifactPrefixArg} + return []string{ + RestoreDataNamespaceArg, + RestoreDataImageArg, + RestoreDataBackupArtifactPrefixArg, + } +} + +func (*restoreDataFunc) Arguments() []string { + return []string{ + RestoreDataNamespaceArg, + RestoreDataImageArg, + RestoreDataBackupArtifactPrefixArg, + RestoreDataRestorePathArg, + RestoreDataEncryptionKeyArg, + RestoreDataPodArg, + RestoreDataVolsArg, + RestoreDataBackupTagArg, + RestoreDataBackupIdentifierArg, + } } diff --git a/pkg/function/restore_data_all.go b/pkg/function/restore_data_all.go index 9183406015..dd6fb967a9 100644 --- a/pkg/function/restore_data_all.go +++ b/pkg/function/restore_data_all.go @@ -170,6 +170,23 @@ func (*restoreDataAllFunc) Exec(ctx context.Context, tp param.TemplateParams, ar } func (*restoreDataAllFunc) RequiredArgs() []string { - return []string{RestoreDataAllNamespaceArg, RestoreDataAllImageArg, - RestoreDataAllBackupArtifactPrefixArg, RestoreDataAllBackupInfo} + return []string{ + RestoreDataAllNamespaceArg, + RestoreDataAllImageArg, + RestoreDataAllBackupArtifactPrefixArg, + RestoreDataAllBackupInfo, + } +} + +func (*restoreDataAllFunc) Arguments() []string { + return []string{ + RestoreDataAllNamespaceArg, + RestoreDataAllImageArg, + RestoreDataAllBackupArtifactPrefixArg, + RestoreDataAllBackupInfo, + RestoreDataAllRestorePathArg, + RestoreDataAllEncryptionKeyArg, + RestoreDataAllPodsArg, + RestoreDataAllPodOverrideArg, + } } diff --git a/pkg/function/restore_rds_snapshot.go b/pkg/function/restore_rds_snapshot.go index 93dd7407f9..a7bf2f15b4 100644 --- a/pkg/function/restore_rds_snapshot.go +++ b/pkg/function/restore_rds_snapshot.go @@ -81,6 +81,19 @@ func (*restoreRDSSnapshotFunc) RequiredArgs() []string { return []string{RestoreRDSSnapshotInstanceID} } +func (*restoreRDSSnapshotFunc) Arguments() []string { + return []string{ + RestoreRDSSnapshotInstanceID, + RestoreRDSSnapshotSnapshotID, + RestoreRDSSnapshotDBEngine, + RestoreRDSSnapshotBackupArtifactPrefix, + RestoreRDSSnapshotBackupID, + RestoreRDSSnapshotUsername, + RestoreRDSSnapshotPassword, + RestoreRDSSnapshotNamespace, + } +} + func (*restoreRDSSnapshotFunc) Exec(ctx context.Context, tp param.TemplateParams, args map[string]interface{}) (map[string]interface{}, error) { var namespace, instanceID, snapshotID, backupArtifactPrefix, backupID, username, password string var dbEngine RDSDBEngine diff --git a/pkg/function/scale_workload.go b/pkg/function/scale_workload.go index 6da518a974..378e66e9ff 100644 --- a/pkg/function/scale_workload.go +++ b/pkg/function/scale_workload.go @@ -86,6 +86,15 @@ func (*scaleWorkloadFunc) RequiredArgs() []string { return []string{ScaleWorkloadReplicas} } +func (*scaleWorkloadFunc) Arguments() []string { + return []string{ + ScaleWorkloadReplicas, + ScaleWorkloadNamespaceArg, + ScaleWorkloadNameArg, + ScaleWorkloadKindArg, + } +} + func getArgs(tp param.TemplateParams, args map[string]interface{}) (namespace, kind, name string, replicas int32, err error) { var rep interface{} err = Arg(args, ScaleWorkloadReplicas, &rep) diff --git a/pkg/function/wait.go b/pkg/function/wait.go index b16fc0438c..3892957f6a 100644 --- a/pkg/function/wait.go +++ b/pkg/function/wait.go @@ -90,7 +90,17 @@ func (ktf *waitFunc) Exec(ctx context.Context, tp param.TemplateParams, args map } func (*waitFunc) RequiredArgs() []string { - return []string{WaitTimeoutArg, WaitConditionsArg} + return []string{ + WaitTimeoutArg, + WaitConditionsArg, + } +} + +func (*waitFunc) Arguments() []string { + return []string{ + WaitTimeoutArg, + WaitConditionsArg, + } } // waitForCondition wait till the condition satisfies within the timeout duration diff --git a/pkg/function/wait_for_snapshot_completion.go b/pkg/function/wait_for_snapshot_completion.go index c743f25342..3195eb5074 100644 --- a/pkg/function/wait_for_snapshot_completion.go +++ b/pkg/function/wait_for_snapshot_completion.go @@ -51,6 +51,10 @@ func (*waitForSnapshotCompletionFunc) RequiredArgs() []string { return []string{WaitForSnapshotCompletionSnapshotsArg} } +func (*waitForSnapshotCompletionFunc) Arguments() []string { + return []string{WaitForSnapshotCompletionSnapshotsArg} +} + func (kef *waitForSnapshotCompletionFunc) Exec(ctx context.Context, tp param.TemplateParams, args map[string]interface{}) (map[string]interface{}, error) { var snapshotinfo string if err := Arg(args, WaitForSnapshotCompletionSnapshotsArg, &snapshotinfo); err != nil { diff --git a/pkg/kanister.go b/pkg/kanister.go index 7b19016552..793814528c 100644 --- a/pkg/kanister.go +++ b/pkg/kanister.go @@ -37,6 +37,7 @@ var ( type Func interface { Name() string RequiredArgs() []string + Arguments() []string Exec(context.Context, param.TemplateParams, map[string]interface{}) (map[string]interface{}, error) } @@ -58,7 +59,19 @@ func Register(f Func) error { return nil } -// RegisterVersion allows Kanister Functions to be registered with the given version +func RegisteredFunctions() map[string]struct{} { + names := make(map[string]struct{}, len(funcs)) + for k := range funcs { + names[k] = struct{}{} + } + return names +} + +func KanisterFuncForName(funcName, version string) Func { + return funcs[funcName][*semver.MustParse(version)] +} + +// RegisterVersion allows a Kanister Function to be registered with the given version func RegisterVersion(f Func, v string) error { version := *semver.MustParse(v) funcMu.Lock() diff --git a/pkg/phase.go b/pkg/phase.go index fab5bbd5cd..22f12240b8 100644 --- a/pkg/phase.go +++ b/pkg/phase.go @@ -19,6 +19,7 @@ import ( "github.com/Masterminds/semver" "github.com/pkg/errors" + "k8s.io/utils/strings/slices" crv1alpha1 "github.com/kanisterio/kanister/pkg/apis/cr/v1alpha1" "github.com/kanisterio/kanister/pkg/field" @@ -65,6 +66,11 @@ func (p *Phase) Exec(ctx context.Context, bp crv1alpha1.Blueprint, action string if err = checkRequiredArgs(p.f.RequiredArgs(), args); err != nil { return nil, errors.Wrapf(err, "Required args missing for function %s", p.f.Name()) } + + if err = checkSupportedArgs(p.f.Arguments(), args); err != nil { + return nil, errors.Wrapf(err, "Checking supported args for function %s.", p.f.Name()) + } + p.args = args } } @@ -72,6 +78,15 @@ func (p *Phase) Exec(ctx context.Context, bp crv1alpha1.Blueprint, action string return p.f.Exec(ctx, tp, p.args) } +func checkSupportedArgs(supportedArgs []string, args map[string]interface{}) error { + for a := range args { + if !slices.Contains(supportedArgs, a) { + return errors.Errorf("argument %s is not supported", a) + } + } + return nil +} + // GetPhases renders the returns a list of Phases with pre-rendered arguments. func GetPhases(bp crv1alpha1.Blueprint, action, version string, tp param.TemplateParams) ([]*Phase, error) { a, ok := bp.Actions[action] @@ -116,6 +131,10 @@ func GetPhases(bp crv1alpha1.Blueprint, action, version string, tp param.Templat // Validate gets the provided arguments from a blueprint and verifies that the required arguments are present func (p *Phase) Validate(args map[string]interface{}) error { + if err := checkSupportedArgs(p.f.Arguments(), args); err != nil { + return err + } + return checkRequiredArgs(p.f.RequiredArgs(), args) } diff --git a/pkg/phase_test.go b/pkg/phase_test.go index 6befc69579..7d4b93ab55 100644 --- a/pkg/phase_test.go +++ b/pkg/phase_test.go @@ -48,6 +48,10 @@ func (tf *testFunc) RequiredArgs() []string { return nil } +func (tf *testFunc) Arguments() []string { + return nil +} + func (s *PhaseSuite) TestExec(c *C) { for _, tc := range []struct { artifact string @@ -83,3 +87,44 @@ func (s *PhaseSuite) TestExec(c *C) { c.Assert(output, Equals, tc.expected) } } + +func (s *PhaseSuite) TestCheckSupportedArgs(c *C) { + for _, tc := range []struct { + supprtedArgs []string + providedArgs map[string]interface{} + err Checker + expErr string + }{ + { + supprtedArgs: []string{"a", "b", "c"}, + providedArgs: map[string]interface{}{ + "a": "val", + "b": "val", + "c": "val", + }, + err: IsNil, + }, + { + supprtedArgs: []string{"a", "b", "c"}, + providedArgs: map[string]interface{}{ + "a": "val", + "b": "val", + "c": "val", + "d": "val", + }, + err: NotNil, + expErr: "argument d is not supported", + }, + { + supprtedArgs: []string{"a", "b", "c"}, + providedArgs: map[string]interface{}{}, + err: IsNil, + }, + } { + err := checkSupportedArgs(tc.supprtedArgs, tc.providedArgs) + if err != nil { + c.Assert(err.Error(), Equals, tc.expErr) + } + c.Assert(err, tc.err) + } +} diff --git a/pkg/testutil/func.go b/pkg/testutil/func.go index 96e8eca5a1..72b28c4e72 100644 --- a/pkg/testutil/func.go +++ b/pkg/testutil/func.go @@ -130,6 +130,10 @@ func (mf *mockKanisterFunc) RequiredArgs() []string { return nil } +func (mf *mockKanisterFunc) Arguments() []string { + return []string{testBPArg} +} + func CancelFuncOut() error { return <-cancelFuncCh } diff --git a/pkg/testutil/testutil.go b/pkg/testutil/testutil.go index 1d86f64814..92857523af 100644 --- a/pkg/testutil/testutil.go +++ b/pkg/testutil/testutil.go @@ -32,6 +32,10 @@ import ( "github.com/kanisterio/kanister/pkg/consts" ) +const ( + testBPArg = "key" +) + // NewTestPVC function returns a pointer to a new PVC test object func NewTestPVC() *v1.PersistentVolumeClaim { return &v1.PersistentVolumeClaim{ @@ -300,7 +304,7 @@ func ActionSetWithConfigMap(as *crv1alpha1.ActionSet, name string) *crv1alpha1.A // BlueprintWithConfigMap function returns a pointer to a new Blueprint test object with CongigMap func BlueprintWithConfigMap(bp *crv1alpha1.Blueprint) *crv1alpha1.Blueprint { - cmArgs := map[string]interface{}{"key": "{{ .ConfigMaps.myCM.Data.myKey }}"} + cmArgs := map[string]interface{}{testBPArg: "{{ .ConfigMaps.myCM.Data.myKey }}"} for i := range bp.Actions[actionName].Phases { bp.Actions[actionName].Phases[i].Args = cmArgs }