From 4b61eaef5920da8b0110af8e6f2997354b8af63a Mon Sep 17 00:00:00 2001 From: Manabu Mccloskey Date: Tue, 30 Jan 2024 18:53:15 -0800 Subject: [PATCH] working integrations --- app-config.yaml | 91 +- packages/app/package.json | 57 +- packages/app/src/App.tsx | 4 + .../app/src/components/catalog/EntityPage.tsx | 39 + packages/backend/package.json | 2 + packages/backend/src/index.ts | 4 +- packages/backend/src/plugins/argocd.ts | 136 + packages/backend/src/plugins/gitea-actions.ts | 163 +- packages/backend/src/plugins/scaffolder.ts | 43 +- plugins/apache-spark/.eslintrc.js | 1 + plugins/apache-spark/README.md | 13 + plugins/apache-spark/dev/index.tsx | 12 + plugins/apache-spark/package.json | 51 + plugins/apache-spark/src/api/index.test.ts | 113 + plugins/apache-spark/src/api/index.ts | 176 + plugins/apache-spark/src/api/model.ts | 100 + .../ApacheSparkLogs/ApacheSparkLogs.test.tsx | 83 + .../ApacheSparkLogs/ApacheSparkLogs.tsx | 100 + .../ApacheSparkOverviewTable.tsx | 145 + .../DetailedDrawer/DetailedDrawer.tsx | 111 + .../DetailedDrawer/DrawerOverview.tsx | 103 + .../src/components/Overview/Overview.tsx | 14 + .../src/components/Overview/index.ts | 1 + plugins/apache-spark/src/components/utils.ts | 26 + plugins/apache-spark/src/consts.ts | 4 + plugins/apache-spark/src/index.ts | 1 + plugins/apache-spark/src/plugin.test.ts | 7 + plugins/apache-spark/src/plugin.ts | 42 + plugins/apache-spark/src/routes.ts | 5 + plugins/apache-spark/src/setupTests.ts | 2 + plugins/argo-workflows/.eslintrc.js | 1 + plugins/argo-workflows/README.md | 13 + plugins/argo-workflows/config.d.ts | 12 + plugins/argo-workflows/dev/index.tsx | 12 + plugins/argo-workflows/package.json | 53 + .../src/api/ArgoWorkflows.test.ts | 116 + .../argo-workflows/src/api/ArgoWorkflows.ts | 141 + .../src/api/generated/.gitignore | 4 + .../api/generated/.openapi-generator-ignore | 23 + .../api/generated/.openapi-generator/FILES | 397 + .../api/generated/.openapi-generator/VERSION | 1 + .../argo-workflows/src/api/generated/api.ts | 3 + .../src/api/generated/api/apis.ts | 33 + .../api/archivedWorkflowServiceApi.ts | 714 + .../api/generated/api/artifactServiceApi.ts | 558 + .../api/clusterWorkflowTemplateServiceApi.ts | 604 + .../generated/api/cronWorkflowServiceApi.ts | 818 + .../src/api/generated/api/eventServiceApi.ts | 295 + .../generated/api/eventSourceServiceApi.ts | 821 + .../src/api/generated/api/infoServiceApi.ts | 360 + .../src/api/generated/api/sensorServiceApi.ts | 821 + .../api/generated/api/workflowServiceApi.ts | 1785 ++ .../api/workflowTemplateServiceApi.ts | 646 + .../src/api/generated/git_push.sh | 57 + .../eventsourceCreateEventSourceRequest.ts | 39 + .../model/eventsourceEventSourceWatchEvent.ts | 39 + .../generated/model/eventsourceLogEntry.ts | 71 + .../eventsourceUpdateEventSourceRequest.ts | 45 + .../api/generated/model/googleProtobufAny.ts | 38 + .../model/grpcGatewayRuntimeError.ts | 51 + .../model/grpcGatewayRuntimeStreamError.ts | 57 + ...ArgoprojEventsV1alpha1AMQPConsumeConfig.ts | 56 + ...ioArgoprojEventsV1alpha1AMQPEventSource.ts | 125 + ...EventsV1alpha1AMQPExchangeDeclareConfig.ts | 50 + ...goprojEventsV1alpha1AMQPQueueBindConfig.ts | 32 + ...rojEventsV1alpha1AMQPQueueDeclareConfig.ts | 62 + ...oArgoprojEventsV1alpha1AWSLambdaTrigger.ts | 85 + .../model/ioArgoprojEventsV1alpha1Amount.ts | 35 + ...goprojEventsV1alpha1ArgoWorkflowTrigger.ts | 52 + ...oArgoprojEventsV1alpha1ArtifactLocation.ts | 74 + ...projEventsV1alpha1AzureEventHubsTrigger.ts | 67 + ...EventsV1alpha1AzureEventsHubEventSource.ts | 64 + .../model/ioArgoprojEventsV1alpha1Backoff.ts | 52 + .../ioArgoprojEventsV1alpha1BasicAuth.ts | 39 + .../ioArgoprojEventsV1alpha1BitbucketAuth.ts | 40 + ...rgoprojEventsV1alpha1BitbucketBasicAuth.ts | 39 + ...oprojEventsV1alpha1BitbucketEventSource.ts | 93 + ...goprojEventsV1alpha1BitbucketRepository.ts | 38 + ...ventsV1alpha1BitbucketServerEventSource.ts | 96 + ...EventsV1alpha1BitbucketServerRepository.ts | 38 + ...goprojEventsV1alpha1CalendarEventSource.ts | 73 + ...oprojEventsV1alpha1CatchupConfiguration.ts | 38 + .../ioArgoprojEventsV1alpha1Condition.ts | 59 + ...projEventsV1alpha1ConditionsResetByTime.ts | 38 + ...ojEventsV1alpha1ConditionsResetCriteria.ts | 33 + ...oprojEventsV1alpha1ConfigMapPersistence.ts | 38 + .../ioArgoprojEventsV1alpha1CustomTrigger.ts | 85 + .../ioArgoprojEventsV1alpha1DataFilter.ts | 62 + ...rgoprojEventsV1alpha1EmitterEventSource.ts | 93 + .../ioArgoprojEventsV1alpha1EventContext.ts | 86 + ...ioArgoprojEventsV1alpha1EventDependency.ts | 67 + ...projEventsV1alpha1EventDependencyFilter.ts | 87 + ...ventsV1alpha1EventDependencyTransformer.ts | 38 + ...oArgoprojEventsV1alpha1EventPersistence.ts | 40 + .../ioArgoprojEventsV1alpha1EventSource.ts | 47 + ...ArgoprojEventsV1alpha1EventSourceFilter.ts | 32 + ...ioArgoprojEventsV1alpha1EventSourceList.ts | 40 + ...ioArgoprojEventsV1alpha1EventSourceSpec.ts | 241 + ...ArgoprojEventsV1alpha1EventSourceStatus.ts | 33 + .../ioArgoprojEventsV1alpha1ExprFilter.ts | 45 + .../ioArgoprojEventsV1alpha1FileArtifact.ts | 32 + ...ioArgoprojEventsV1alpha1FileEventSource.ts | 61 + ...rgoprojEventsV1alpha1GenericEventSource.ts | 79 + .../ioArgoprojEventsV1alpha1GitArtifact.ts | 92 + .../model/ioArgoprojEventsV1alpha1GitCreds.ts | 39 + ...ioArgoprojEventsV1alpha1GitRemoteConfig.ts | 44 + .../ioArgoprojEventsV1alpha1GithubAppCreds.ts | 45 + ...ArgoprojEventsV1alpha1GithubEventSource.ts | 145 + ...ArgoprojEventsV1alpha1GitlabEventSource.ts | 98 + ...ioArgoprojEventsV1alpha1HDFSEventSource.ts | 120 + .../ioArgoprojEventsV1alpha1HTTPTrigger.ts | 90 + .../ioArgoprojEventsV1alpha1Int64OrString.ts | 44 + ...ArgoprojEventsV1alpha1K8SResourcePolicy.ts | 45 + ...rgoprojEventsV1alpha1KafkaConsumerGroup.ts | 44 + ...oArgoprojEventsV1alpha1KafkaEventSource.ts | 112 + .../ioArgoprojEventsV1alpha1KafkaTrigger.ts | 122 + .../ioArgoprojEventsV1alpha1LogTrigger.ts | 32 + ...ioArgoprojEventsV1alpha1MQTTEventSource.ts | 77 + .../model/ioArgoprojEventsV1alpha1Metadata.ts | 38 + .../model/ioArgoprojEventsV1alpha1NATSAuth.ts | 52 + ...oArgoprojEventsV1alpha1NATSEventsSource.ts | 78 + .../ioArgoprojEventsV1alpha1NATSTrigger.ts | 67 + .../ioArgoprojEventsV1alpha1NSQEventSource.ts | 80 + ...oArgoprojEventsV1alpha1OpenWhiskTrigger.ts | 85 + ...ArgoprojEventsV1alpha1OwnedRepositories.ts | 38 + .../ioArgoprojEventsV1alpha1PayloadField.ts | 47 + ...ArgoprojEventsV1alpha1PubSubEventSource.ts | 85 + ...ArgoprojEventsV1alpha1PulsarEventSource.ts | 102 + .../ioArgoprojEventsV1alpha1PulsarTrigger.ts | 99 + .../ioArgoprojEventsV1alpha1RateLimit.ts | 38 + ...oArgoprojEventsV1alpha1RedisEventSource.ts | 89 + ...rojEventsV1alpha1RedisStreamEventSource.ts | 92 + .../model/ioArgoprojEventsV1alpha1Resource.ts | 35 + ...goprojEventsV1alpha1ResourceEventSource.ts | 64 + .../ioArgoprojEventsV1alpha1ResourceFilter.ts | 60 + .../ioArgoprojEventsV1alpha1S3Artifact.ts | 83 + .../model/ioArgoprojEventsV1alpha1S3Bucket.ts | 38 + .../model/ioArgoprojEventsV1alpha1S3Filter.ts | 38 + .../ioArgoprojEventsV1alpha1SASLConfig.ts | 45 + .../ioArgoprojEventsV1alpha1SNSEventSource.ts | 89 + .../ioArgoprojEventsV1alpha1SQSEventSource.ts | 109 + .../ioArgoprojEventsV1alpha1SecureHeader.ts | 39 + .../model/ioArgoprojEventsV1alpha1Selector.ts | 47 + .../model/ioArgoprojEventsV1alpha1Sensor.ts | 47 + .../ioArgoprojEventsV1alpha1SensorList.ts | 40 + .../ioArgoprojEventsV1alpha1SensorSpec.ts | 74 + .../ioArgoprojEventsV1alpha1SensorStatus.ts | 36 + .../model/ioArgoprojEventsV1alpha1Service.ts | 39 + ...oArgoprojEventsV1alpha1SlackEventSource.ts | 59 + .../ioArgoprojEventsV1alpha1SlackTrigger.ts | 55 + ...rgoprojEventsV1alpha1StandardK8STrigger.ts | 61 + .../model/ioArgoprojEventsV1alpha1Status.ts | 36 + .../ioArgoprojEventsV1alpha1StatusPolicy.ts | 32 + ...rojEventsV1alpha1StorageGridEventSource.ts | 89 + ...ArgoprojEventsV1alpha1StorageGridFilter.ts | 38 + ...ArgoprojEventsV1alpha1StripeEventSource.ts | 58 + .../ioArgoprojEventsV1alpha1TLSConfig.ts | 54 + .../model/ioArgoprojEventsV1alpha1Template.ts | 99 + .../ioArgoprojEventsV1alpha1TimeFilter.ts | 47 + .../model/ioArgoprojEventsV1alpha1Trigger.ts | 61 + ...oArgoprojEventsV1alpha1TriggerParameter.ts | 51 + ...rojEventsV1alpha1TriggerParameterSource.ts | 74 + .../ioArgoprojEventsV1alpha1TriggerPolicy.ts | 40 + ...ioArgoprojEventsV1alpha1TriggerTemplate.ts | 135 + .../ioArgoprojEventsV1alpha1URLArtifact.ts | 41 + ...ioArgoprojEventsV1alpha1ValueFromSource.ts | 40 + ...ioArgoprojEventsV1alpha1WatchPathConfig.ts | 44 + .../ioArgoprojEventsV1alpha1WebhookContext.ts | 87 + ...rgoprojEventsV1alpha1WebhookEventSource.ts | 40 + ...ArgoprojWorkflowV1alpha1ArchiveStrategy.ts | 54 + .../ioArgoprojWorkflowV1alpha1Arguments.ts | 49 + .../ioArgoprojWorkflowV1alpha1ArtGCStatus.ts | 56 + .../ioArgoprojWorkflowV1alpha1Artifact.ts | 205 + .../ioArgoprojWorkflowV1alpha1ArtifactGC.ts | 54 + ...oArgoprojWorkflowV1alpha1ArtifactGCSpec.ts | 39 + ...rgoprojWorkflowV1alpha1ArtifactGCStatus.ts | 39 + ...rgoprojWorkflowV1alpha1ArtifactLocation.ts | 101 + ...rgoprojWorkflowV1alpha1ArtifactNodeSpec.ts | 46 + ...ioArgoprojWorkflowV1alpha1ArtifactPaths.ts | 205 + ...oprojWorkflowV1alpha1ArtifactRepository.ts | 80 + ...ojWorkflowV1alpha1ArtifactRepositoryRef.ts | 44 + ...flowV1alpha1ArtifactRepositoryRefStatus.ts | 69 + ...oArgoprojWorkflowV1alpha1ArtifactResult.ts | 56 + ...orkflowV1alpha1ArtifactResultNodeStatus.ts | 39 + ...projWorkflowV1alpha1ArtifactoryArtifact.ts | 51 + ...owV1alpha1ArtifactoryArtifactRepository.ts | 51 + ...ioArgoprojWorkflowV1alpha1AzureArtifact.ts | 72 + ...WorkflowV1alpha1AzureArtifactRepository.ts | 72 + .../ioArgoprojWorkflowV1alpha1Backoff.ts | 53 + .../ioArgoprojWorkflowV1alpha1BasicAuth.ts | 42 + .../model/ioArgoprojWorkflowV1alpha1Cache.ts | 36 + ...oArgoprojWorkflowV1alpha1ClientCertAuth.ts | 42 + ...WorkflowV1alpha1ClusterWorkflowTemplate.ts | 61 + ...ha1ClusterWorkflowTemplateCreateRequest.ts | 40 + ...lpha1ClusterWorkflowTemplateLintRequest.ts | 40 + ...flowV1alpha1ClusterWorkflowTemplateList.ts | 61 + ...ha1ClusterWorkflowTemplateUpdateRequest.ts | 42 + ...projWorkflowV1alpha1CollectEventRequest.ts | 32 + .../model/ioArgoprojWorkflowV1alpha1Column.ts | 56 + .../ioArgoprojWorkflowV1alpha1Condition.ts | 53 + ...ioArgoprojWorkflowV1alpha1ContainerNode.ts | 221 + ...rkflowV1alpha1ContainerSetRetryStrategy.ts | 41 + ...rojWorkflowV1alpha1ContainerSetTemplate.ts | 47 + .../ioArgoprojWorkflowV1alpha1ContinueOn.ts | 41 + .../ioArgoprojWorkflowV1alpha1Counter.ts | 38 + ...rkflowV1alpha1CreateCronWorkflowRequest.ts | 46 + ...ojWorkflowV1alpha1CreateS3BucketOptions.ts | 38 + .../ioArgoprojWorkflowV1alpha1CronWorkflow.ts | 68 + ...rgoprojWorkflowV1alpha1CronWorkflowList.ts | 61 + ...rkflowV1alpha1CronWorkflowResumeRequest.ts | 38 + ...rgoprojWorkflowV1alpha1CronWorkflowSpec.ts | 106 + ...oprojWorkflowV1alpha1CronWorkflowStatus.ts | 58 + ...kflowV1alpha1CronWorkflowSuspendRequest.ts | 38 + .../ioArgoprojWorkflowV1alpha1DAGTask.ts | 146 + .../ioArgoprojWorkflowV1alpha1DAGTemplate.ts | 57 + .../model/ioArgoprojWorkflowV1alpha1Data.ts | 46 + .../ioArgoprojWorkflowV1alpha1DataSource.ts | 36 + .../model/ioArgoprojWorkflowV1alpha1Event.ts | 35 + ...oArgoprojWorkflowV1alpha1ExecutorConfig.ts | 38 + .../ioArgoprojWorkflowV1alpha1GCSArtifact.ts | 54 + ...ojWorkflowV1alpha1GCSArtifactRepository.ts | 54 + .../model/ioArgoprojWorkflowV1alpha1Gauge.ts | 56 + ...projWorkflowV1alpha1GetUserInfoResponse.ts | 74 + .../ioArgoprojWorkflowV1alpha1GitArtifact.ts | 120 + .../ioArgoprojWorkflowV1alpha1HDFSArtifact.ts | 112 + ...jWorkflowV1alpha1HDFSArtifactRepository.ts | 112 + .../model/ioArgoprojWorkflowV1alpha1HTTP.ts | 97 + .../ioArgoprojWorkflowV1alpha1HTTPArtifact.ts | 55 + .../ioArgoprojWorkflowV1alpha1HTTPAuth.ts | 47 + ...oArgoprojWorkflowV1alpha1HTTPBodySource.ts | 35 + .../ioArgoprojWorkflowV1alpha1HTTPHeader.ts | 45 + ...rgoprojWorkflowV1alpha1HTTPHeaderSource.ts | 33 + .../model/ioArgoprojWorkflowV1alpha1Header.ts | 47 + .../ioArgoprojWorkflowV1alpha1Histogram.ts | 47 + .../ioArgoprojWorkflowV1alpha1InfoResponse.ts | 58 + .../model/ioArgoprojWorkflowV1alpha1Inputs.ts | 49 + .../ioArgoprojWorkflowV1alpha1LabelKeys.ts | 35 + ...oArgoprojWorkflowV1alpha1LabelValueFrom.ts | 32 + .../ioArgoprojWorkflowV1alpha1LabelValues.ts | 35 + ...ioArgoprojWorkflowV1alpha1LifecycleHook.ts | 58 + .../model/ioArgoprojWorkflowV1alpha1Link.ts | 56 + ...WorkflowV1alpha1LintCronWorkflowRequest.ts | 39 + .../ioArgoprojWorkflowV1alpha1LogEntry.ts | 38 + .../ioArgoprojWorkflowV1alpha1ManifestFrom.ts | 33 + ...goprojWorkflowV1alpha1MemoizationStatus.ts | 56 + .../ioArgoprojWorkflowV1alpha1Memoize.ts | 54 + .../ioArgoprojWorkflowV1alpha1Metadata.ts | 41 + .../ioArgoprojWorkflowV1alpha1MetricLabel.ts | 41 + .../ioArgoprojWorkflowV1alpha1Metrics.ts | 39 + .../model/ioArgoprojWorkflowV1alpha1Mutex.ts | 47 + .../ioArgoprojWorkflowV1alpha1MutexHolding.ts | 47 + .../ioArgoprojWorkflowV1alpha1MutexStatus.ts | 48 + .../ioArgoprojWorkflowV1alpha1NodeResult.ts | 51 + .../ioArgoprojWorkflowV1alpha1NodeStatus.ts | 235 + ...rkflowV1alpha1NodeSynchronizationStatus.ts | 38 + .../ioArgoprojWorkflowV1alpha1OAuth2Auth.ts | 61 + ...projWorkflowV1alpha1OAuth2EndpointParam.ts | 47 + .../ioArgoprojWorkflowV1alpha1OSSArtifact.ts | 94 + ...ojWorkflowV1alpha1OSSArtifactRepository.ts | 94 + ...rgoprojWorkflowV1alpha1OSSLifecycleRule.ts | 47 + .../ioArgoprojWorkflowV1alpha1Outputs.ts | 67 + .../ioArgoprojWorkflowV1alpha1Parameter.ts | 90 + .../model/ioArgoprojWorkflowV1alpha1PodGC.ts | 45 + .../ioArgoprojWorkflowV1alpha1Prometheus.ts | 87 + .../ioArgoprojWorkflowV1alpha1RawArtifact.ts | 38 + ...rgoprojWorkflowV1alpha1ResourceTemplate.ts | 99 + ...V1alpha1ResubmitArchivedWorkflowRequest.ts | 56 + ...ioArgoprojWorkflowV1alpha1RetryAffinity.ts | 38 + ...lowV1alpha1RetryArchivedWorkflowRequest.ts | 62 + ...ioArgoprojWorkflowV1alpha1RetryStrategy.ts | 67 + .../ioArgoprojWorkflowV1alpha1S3Artifact.ts | 119 + ...rojWorkflowV1alpha1S3ArtifactRepository.ts | 128 + ...projWorkflowV1alpha1S3EncryptionOptions.ts | 63 + ...oArgoprojWorkflowV1alpha1ScriptTemplate.ts | 227 + ...rgoprojWorkflowV1alpha1SemaphoreHolding.ts | 44 + .../ioArgoprojWorkflowV1alpha1SemaphoreRef.ts | 45 + ...ArgoprojWorkflowV1alpha1SemaphoreStatus.ts | 45 + .../ioArgoprojWorkflowV1alpha1Sequence.ts | 56 + .../model/ioArgoprojWorkflowV1alpha1Submit.ts | 47 + .../ioArgoprojWorkflowV1alpha1SubmitOpts.ts | 135 + ...ArgoprojWorkflowV1alpha1SuspendTemplate.ts | 38 + ...ArgoprojWorkflowV1alpha1Synchronization.ts | 43 + ...ojWorkflowV1alpha1SynchronizationStatus.ts | 43 + .../ioArgoprojWorkflowV1alpha1TTLStrategy.ts | 56 + .../ioArgoprojWorkflowV1alpha1TarStrategy.ts | 38 + .../ioArgoprojWorkflowV1alpha1Template.ts | 344 + .../ioArgoprojWorkflowV1alpha1TemplateRef.ts | 56 + ...oprojWorkflowV1alpha1TransformationStep.ts | 35 + ...rkflowV1alpha1UpdateCronWorkflowRequest.ts | 48 + ...ioArgoprojWorkflowV1alpha1UserContainer.ts | 227 + .../ioArgoprojWorkflowV1alpha1ValueFrom.ts | 108 + .../ioArgoprojWorkflowV1alpha1Version.ts | 74 + ...ioArgoprojWorkflowV1alpha1VolumeClaimGC.ts | 38 + .../ioArgoprojWorkflowV1alpha1Workflow.ts | 68 + ...ojWorkflowV1alpha1WorkflowCreateRequest.ts | 61 + ...rojWorkflowV1alpha1WorkflowEventBinding.ts | 61 + ...orkflowV1alpha1WorkflowEventBindingList.ts | 61 + ...orkflowV1alpha1WorkflowEventBindingSpec.ts | 40 + ...WorkflowV1alpha1WorkflowLevelArtifactGC.ts | 63 + ...projWorkflowV1alpha1WorkflowLintRequest.ts | 39 + .../ioArgoprojWorkflowV1alpha1WorkflowList.ts | 61 + ...rgoprojWorkflowV1alpha1WorkflowMetadata.ts | 45 + ...WorkflowV1alpha1WorkflowResubmitRequest.ts | 50 + ...ojWorkflowV1alpha1WorkflowResumeRequest.ts | 44 + ...rojWorkflowV1alpha1WorkflowRetryRequest.ts | 56 + ...oprojWorkflowV1alpha1WorkflowSetRequest.ts | 62 + .../ioArgoprojWorkflowV1alpha1WorkflowSpec.ts | 374 + ...oArgoprojWorkflowV1alpha1WorkflowStatus.ts | 185 + .../ioArgoprojWorkflowV1alpha1WorkflowStep.ts | 128 + ...projWorkflowV1alpha1WorkflowStopRequest.ts | 50 + ...ojWorkflowV1alpha1WorkflowSubmitRequest.ts | 51 + ...jWorkflowV1alpha1WorkflowSuspendRequest.ts | 38 + ...projWorkflowV1alpha1WorkflowTaskSetSpec.ts | 33 + ...ojWorkflowV1alpha1WorkflowTaskSetStatus.ts | 33 + ...rgoprojWorkflowV1alpha1WorkflowTemplate.ts | 61 + ...owV1alpha1WorkflowTemplateCreateRequest.ts | 46 + ...flowV1alpha1WorkflowTemplateLintRequest.ts | 46 + ...rojWorkflowV1alpha1WorkflowTemplateList.ts | 61 + ...projWorkflowV1alpha1WorkflowTemplateRef.ts | 47 + ...owV1alpha1WorkflowTemplateUpdateRequest.ts | 48 + ...orkflowV1alpha1WorkflowTerminateRequest.ts | 38 + ...oprojWorkflowV1alpha1WorkflowWatchEvent.ts | 39 + ...iCoreV1AWSElasticBlockStoreVolumeSource.ts | 65 + .../generated/model/ioK8sApiCoreV1Affinity.ts | 50 + .../ioK8sApiCoreV1AzureDiskVolumeSource.ts | 83 + .../ioK8sApiCoreV1AzureFileVolumeSource.ts | 56 + .../model/ioK8sApiCoreV1CSIVolumeSource.ts | 72 + .../model/ioK8sApiCoreV1Capabilities.ts | 47 + .../model/ioK8sApiCoreV1CephFSVolumeSource.ts | 81 + .../model/ioK8sApiCoreV1CinderVolumeSource.ts | 63 + .../model/ioK8sApiCoreV1ConfigMapEnvSource.ts | 47 + .../ioK8sApiCoreV1ConfigMapKeySelector.ts | 56 + .../ioK8sApiCoreV1ConfigMapProjection.ts | 57 + .../ioK8sApiCoreV1ConfigMapVolumeSource.ts | 66 + .../model/ioK8sApiCoreV1Container.ts | 229 + .../model/ioK8sApiCoreV1ContainerPort.ts | 81 + .../ioK8sApiCoreV1DownwardAPIProjection.ts | 39 + .../ioK8sApiCoreV1DownwardAPIVolumeFile.ts | 61 + .../ioK8sApiCoreV1DownwardAPIVolumeSource.ts | 48 + .../ioK8sApiCoreV1EmptyDirVolumeSource.ts | 47 + .../model/ioK8sApiCoreV1EnvFromSource.ts | 52 + .../generated/model/ioK8sApiCoreV1EnvVar.ts | 54 + .../model/ioK8sApiCoreV1EnvVarSource.ts | 57 + .../ioK8sApiCoreV1EphemeralVolumeSource.ts | 36 + .../generated/model/ioK8sApiCoreV1Event.ts | 171 + .../model/ioK8sApiCoreV1EventSeries.ts | 47 + .../model/ioK8sApiCoreV1EventSource.ts | 47 + .../model/ioK8sApiCoreV1ExecAction.ts | 38 + .../model/ioK8sApiCoreV1FCVolumeSource.ts | 74 + .../model/ioK8sApiCoreV1FlexVolumeSource.ts | 72 + .../ioK8sApiCoreV1FlockerVolumeSource.ts | 47 + ...sApiCoreV1GCEPersistentDiskVolumeSource.ts | 65 + .../model/ioK8sApiCoreV1GRPCAction.ts | 44 + .../ioK8sApiCoreV1GitRepoVolumeSource.ts | 56 + .../ioK8sApiCoreV1GlusterfsVolumeSource.ts | 56 + .../model/ioK8sApiCoreV1HTTPGetAction.ts | 78 + .../model/ioK8sApiCoreV1HTTPHeader.ts | 47 + .../model/ioK8sApiCoreV1HostAlias.ts | 47 + .../ioK8sApiCoreV1HostPathVolumeSource.ts | 47 + .../model/ioK8sApiCoreV1ISCSIVolumeSource.ts | 126 + .../model/ioK8sApiCoreV1KeyToPath.ts | 56 + .../model/ioK8sApiCoreV1Lifecycle.ts | 42 + .../model/ioK8sApiCoreV1LifecycleHandler.ts | 50 + .../ioK8sApiCoreV1LocalObjectReference.ts | 38 + .../model/ioK8sApiCoreV1NFSVolumeSource.ts | 56 + .../model/ioK8sApiCoreV1NodeAffinity.ts | 46 + .../model/ioK8sApiCoreV1NodeSelector.ts | 39 + .../ioK8sApiCoreV1NodeSelectorRequirement.ts | 66 + .../model/ioK8sApiCoreV1NodeSelectorTerm.ts | 48 + .../ioK8sApiCoreV1ObjectFieldSelector.ts | 47 + .../model/ioK8sApiCoreV1ObjectReference.ts | 92 + .../ioK8sApiCoreV1PersistentVolumeClaim.ts | 68 + ...ApiCoreV1PersistentVolumeClaimCondition.ts | 86 + ...ioK8sApiCoreV1PersistentVolumeClaimSpec.ts | 92 + ...K8sApiCoreV1PersistentVolumeClaimStatus.ts | 91 + ...sApiCoreV1PersistentVolumeClaimTemplate.ts | 43 + ...CoreV1PersistentVolumeClaimVolumeSource.ts | 47 + ...iCoreV1PhotonPersistentDiskVolumeSource.ts | 47 + .../model/ioK8sApiCoreV1PodAffinity.ts | 49 + .../model/ioK8sApiCoreV1PodAffinityTerm.ts | 60 + .../model/ioK8sApiCoreV1PodAntiAffinity.ts | 49 + .../model/ioK8sApiCoreV1PodDNSConfig.ts | 57 + .../model/ioK8sApiCoreV1PodDNSConfigOption.ts | 44 + .../model/ioK8sApiCoreV1PodSecurityContext.ts | 114 + .../ioK8sApiCoreV1PortworxVolumeSource.ts | 56 + .../ioK8sApiCoreV1PreferredSchedulingTerm.ts | 45 + .../generated/model/ioK8sApiCoreV1Probe.ts | 111 + .../ioK8sApiCoreV1ProjectedVolumeSource.ts | 48 + .../ioK8sApiCoreV1QuobyteVolumeSource.ts | 83 + .../model/ioK8sApiCoreV1RBDVolumeSource.ts | 99 + .../ioK8sApiCoreV1ResourceFieldSelector.ts | 56 + .../ioK8sApiCoreV1ResourceRequirements.ts | 47 + .../model/ioK8sApiCoreV1SELinuxOptions.ts | 65 + .../ioK8sApiCoreV1ScaleIOVolumeSource.ts | 117 + .../model/ioK8sApiCoreV1SeccompProfile.ts | 54 + .../model/ioK8sApiCoreV1SecretEnvSource.ts | 47 + .../model/ioK8sApiCoreV1SecretKeySelector.ts | 56 + .../model/ioK8sApiCoreV1SecretProjection.ts | 57 + .../model/ioK8sApiCoreV1SecretVolumeSource.ts | 66 + .../model/ioK8sApiCoreV1SecurityContext.ts | 120 + ...sApiCoreV1ServiceAccountTokenProjection.ts | 56 + .../model/ioK8sApiCoreV1ServicePort.ts | 87 + .../ioK8sApiCoreV1StorageOSVolumeSource.ts | 72 + .../generated/model/ioK8sApiCoreV1Sysctl.ts | 47 + .../model/ioK8sApiCoreV1TCPSocketAction.ts | 44 + .../model/ioK8sApiCoreV1Toleration.ts | 85 + ...ioK8sApiCoreV1TypedLocalObjectReference.ts | 56 + .../generated/model/ioK8sApiCoreV1Volume.ts | 241 + .../model/ioK8sApiCoreV1VolumeDevice.ts | 47 + .../model/ioK8sApiCoreV1VolumeMount.ts | 83 + .../model/ioK8sApiCoreV1VolumeProjection.ts | 57 + ...ApiCoreV1VsphereVirtualDiskVolumeSource.ts | 65 + .../ioK8sApiCoreV1WeightedPodAffinityTerm.ts | 45 + ...sApiCoreV1WindowsSecurityContextOptions.ts | 65 + ...ioK8sApiPolicyV1PodDisruptionBudgetSpec.ts | 48 + ...sApimachineryPkgApisMetaV1CreateOptions.ts | 47 + ...hineryPkgApisMetaV1GroupVersionResource.ts | 47 + ...sApimachineryPkgApisMetaV1LabelSelector.ts | 48 + ...ryPkgApisMetaV1LabelSelectorRequirement.ts | 56 + .../ioK8sApimachineryPkgApisMetaV1ListMeta.ts | 65 + ...achineryPkgApisMetaV1ManagedFieldsEntry.ts | 92 + ...oK8sApimachineryPkgApisMetaV1ObjectMeta.ts | 175 + ...ApimachineryPkgApisMetaV1OwnerReference.ts | 83 + ...K8sApimachineryPkgApisMetaV1StatusCause.ts | 56 + .../src/api/generated/model/models.ts | 1374 ++ .../model/sensorCreateSensorRequest.ts | 46 + .../src/api/generated/model/sensorLogEntry.ts | 77 + .../generated/model/sensorSensorWatchEvent.ts | 39 + .../model/sensorUpdateSensorRequest.ts | 45 + ...esultOfEventsourceEventSourceWatchEvent.ts | 40 + .../streamResultOfEventsourceLogEntry.ts | 40 + ...ultOfIoArgoprojWorkflowV1alpha1LogEntry.ts | 40 + ...oprojWorkflowV1alpha1WorkflowWatchEvent.ts | 40 + .../streamResultOfIoK8sApiCoreV1Event.ts | 40 + .../model/streamResultOfSensorLogEntry.ts | 40 + .../streamResultOfSensorSensorWatchEvent.ts | 40 + .../src/api/generated/swagger.json | 14717 ++++++++++++++++ plugins/argo-workflows/src/api/index.ts | 24 + .../src/components/Overview/Overview.tsx | 58 + .../src/components/Overview/index.ts | 5 + .../WorkflowOverview.test.tsx | 127 + .../WorkflowOverview/WorkflowOverview.tsx | 125 + .../WorkflowTemplateOverview.test.tsx | 132 + .../WorkflowTemplateOverview.tsx | 85 + .../argo-workflows/src/components/utils.ts | 33 + plugins/argo-workflows/src/index.ts | 7 + plugins/argo-workflows/src/plugin.test.ts | 7 + plugins/argo-workflows/src/plugin.ts | 69 + plugins/argo-workflows/src/routes.ts | 5 + plugins/argo-workflows/src/setupTests.ts | 1 + .../src/test-data/testResponse.ts | 702 + .../testResponseWorkflowTemplates.ts | 92 + plugins/cnoe-ui/dev/index.tsx | 6 +- plugins/cnoe-ui/package.json | 10 +- plugins/cnoe-ui/src/plugin.test.ts | 14 +- yarn.lock | 587 +- 456 files changed, 52646 insertions(+), 270 deletions(-) create mode 100644 packages/backend/src/plugins/argocd.ts create mode 100644 plugins/apache-spark/.eslintrc.js create mode 100644 plugins/apache-spark/README.md create mode 100644 plugins/apache-spark/dev/index.tsx create mode 100644 plugins/apache-spark/package.json create mode 100644 plugins/apache-spark/src/api/index.test.ts create mode 100644 plugins/apache-spark/src/api/index.ts create mode 100644 plugins/apache-spark/src/api/model.ts create mode 100644 plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.test.tsx create mode 100644 plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.tsx create mode 100644 plugins/apache-spark/src/components/ApacheSparkOverviewTable/ApacheSparkOverviewTable.tsx create mode 100644 plugins/apache-spark/src/components/DetailedDrawer/DetailedDrawer.tsx create mode 100644 plugins/apache-spark/src/components/DetailedDrawer/DrawerOverview.tsx create mode 100644 plugins/apache-spark/src/components/Overview/Overview.tsx create mode 100644 plugins/apache-spark/src/components/Overview/index.ts create mode 100644 plugins/apache-spark/src/components/utils.ts create mode 100644 plugins/apache-spark/src/consts.ts create mode 100644 plugins/apache-spark/src/index.ts create mode 100644 plugins/apache-spark/src/plugin.test.ts create mode 100644 plugins/apache-spark/src/plugin.ts create mode 100644 plugins/apache-spark/src/routes.ts create mode 100644 plugins/apache-spark/src/setupTests.ts create mode 100644 plugins/argo-workflows/.eslintrc.js create mode 100644 plugins/argo-workflows/README.md create mode 100644 plugins/argo-workflows/config.d.ts create mode 100644 plugins/argo-workflows/dev/index.tsx create mode 100644 plugins/argo-workflows/package.json create mode 100644 plugins/argo-workflows/src/api/ArgoWorkflows.test.ts create mode 100644 plugins/argo-workflows/src/api/ArgoWorkflows.ts create mode 100644 plugins/argo-workflows/src/api/generated/.gitignore create mode 100644 plugins/argo-workflows/src/api/generated/.openapi-generator-ignore create mode 100644 plugins/argo-workflows/src/api/generated/.openapi-generator/FILES create mode 100644 plugins/argo-workflows/src/api/generated/.openapi-generator/VERSION create mode 100644 plugins/argo-workflows/src/api/generated/api.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/apis.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/archivedWorkflowServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/artifactServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/clusterWorkflowTemplateServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/cronWorkflowServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/eventServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/eventSourceServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/infoServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/sensorServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/workflowServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/api/workflowTemplateServiceApi.ts create mode 100644 plugins/argo-workflows/src/api/generated/git_push.sh create mode 100644 plugins/argo-workflows/src/api/generated/model/eventsourceCreateEventSourceRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/eventsourceEventSourceWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/eventsourceLogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/eventsourceUpdateEventSourceRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/googleProtobufAny.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/grpcGatewayRuntimeError.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/grpcGatewayRuntimeStreamError.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AMQPConsumeConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AMQPEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AMQPExchangeDeclareConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AMQPQueueBindConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AMQPQueueDeclareConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AWSLambdaTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Amount.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ArgoWorkflowTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ArtifactLocation.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AzureEventHubsTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1AzureEventsHubEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Backoff.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BasicAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketBasicAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketServerEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1BitbucketServerRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1CalendarEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1CatchupConfiguration.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Condition.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ConditionsResetByTime.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ConditionsResetCriteria.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ConfigMapPersistence.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1CustomTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1DataFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EmitterEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventContext.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventDependency.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventDependencyFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventDependencyTransformer.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventPersistence.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventSourceFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventSourceList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventSourceSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1EventSourceStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ExprFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1FileArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1FileEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GenericEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GitArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GitCreds.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GitRemoteConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GithubAppCreds.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GithubEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1GitlabEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1HDFSEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1HTTPTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Int64OrString.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1K8SResourcePolicy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1KafkaConsumerGroup.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1KafkaEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1KafkaTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1LogTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1MQTTEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Metadata.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1NATSAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1NATSEventsSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1NATSTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1NSQEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1OpenWhiskTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1OwnedRepositories.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1PayloadField.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1PubSubEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1PulsarEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1PulsarTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1RateLimit.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1RedisEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1RedisStreamEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Resource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ResourceEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ResourceFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1S3Artifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1S3Bucket.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1S3Filter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SASLConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SNSEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SQSEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SecureHeader.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Selector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Sensor.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SensorList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SensorSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SensorStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Service.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SlackEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1SlackTrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1StandardK8STrigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Status.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1StatusPolicy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1StorageGridEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1StorageGridFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1StripeEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TLSConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Template.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TimeFilter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1Trigger.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TriggerParameter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TriggerParameterSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TriggerPolicy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1TriggerTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1URLArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1ValueFromSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1WatchPathConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1WebhookContext.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojEventsV1alpha1WebhookEventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArchiveStrategy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Arguments.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtGCStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Artifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactGC.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactGCSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactGCStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactLocation.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactNodeSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactPaths.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactRepositoryRef.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactRepositoryRefStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactResult.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactResultNodeStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactoryArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ArtifactoryArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1AzureArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1AzureArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Backoff.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1BasicAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Cache.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClientCertAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClusterWorkflowTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClusterWorkflowTemplateCreateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClusterWorkflowTemplateLintRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClusterWorkflowTemplateList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ClusterWorkflowTemplateUpdateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CollectEventRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Column.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Condition.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ContainerNode.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ContainerSetRetryStrategy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ContainerSetTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ContinueOn.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Counter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CreateCronWorkflowRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CreateS3BucketOptions.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflow.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflowList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflowResumeRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflowSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflowStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1CronWorkflowSuspendRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1DAGTask.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1DAGTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Data.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1DataSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Event.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ExecutorConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1GCSArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1GCSArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Gauge.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1GetUserInfoResponse.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1GitArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HDFSArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HDFSArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTP.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTPArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTPAuth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTPBodySource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTPHeader.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1HTTPHeaderSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Header.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Histogram.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1InfoResponse.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Inputs.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LabelKeys.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LabelValueFrom.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LabelValues.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LifecycleHook.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Link.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LintCronWorkflowRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1LogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ManifestFrom.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1MemoizationStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Memoize.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Metadata.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1MetricLabel.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Metrics.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Mutex.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1MutexHolding.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1MutexStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1NodeResult.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1NodeStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1NodeSynchronizationStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1OAuth2Auth.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1OAuth2EndpointParam.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1OSSArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1OSSArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1OSSLifecycleRule.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Outputs.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Parameter.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1PodGC.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Prometheus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1RawArtifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ResourceTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ResubmitArchivedWorkflowRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1RetryAffinity.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1RetryArchivedWorkflowRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1RetryStrategy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1S3Artifact.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1S3ArtifactRepository.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1S3EncryptionOptions.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ScriptTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SemaphoreHolding.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SemaphoreRef.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SemaphoreStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Sequence.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Submit.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SubmitOpts.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SuspendTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Synchronization.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1SynchronizationStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1TTLStrategy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1TarStrategy.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Template.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1TemplateRef.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1TransformationStep.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1UpdateCronWorkflowRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1UserContainer.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1ValueFrom.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Version.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1VolumeClaimGC.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1Workflow.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowCreateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowEventBinding.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowEventBindingList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowEventBindingSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowLevelArtifactGC.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowLintRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowMetadata.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowResubmitRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowResumeRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowRetryRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowSetRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowStep.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowStopRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowSubmitRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowSuspendRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTaskSetSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTaskSetStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplateCreateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplateLintRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplateList.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplateRef.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTemplateUpdateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowTerminateRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioArgoprojWorkflowV1alpha1WorkflowWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1AWSElasticBlockStoreVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Affinity.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1AzureDiskVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1AzureFileVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1CSIVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Capabilities.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1CephFSVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1CinderVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ConfigMapEnvSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ConfigMapKeySelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ConfigMapProjection.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ConfigMapVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Container.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ContainerPort.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1DownwardAPIProjection.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1DownwardAPIVolumeFile.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1DownwardAPIVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EmptyDirVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EnvFromSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EnvVar.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EnvVarSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EphemeralVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Event.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EventSeries.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1EventSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ExecAction.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1FCVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1FlexVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1FlockerVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1GCEPersistentDiskVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1GRPCAction.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1GitRepoVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1GlusterfsVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1HTTPGetAction.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1HTTPHeader.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1HostAlias.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1HostPathVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ISCSIVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1KeyToPath.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Lifecycle.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1LifecycleHandler.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1LocalObjectReference.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1NFSVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1NodeAffinity.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1NodeSelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1NodeSelectorRequirement.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1NodeSelectorTerm.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ObjectFieldSelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ObjectReference.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaim.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaimCondition.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaimSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaimStatus.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaimTemplate.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PersistentVolumeClaimVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PhotonPersistentDiskVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodAffinity.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodAffinityTerm.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodAntiAffinity.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodDNSConfig.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodDNSConfigOption.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PodSecurityContext.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PortworxVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1PreferredSchedulingTerm.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Probe.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ProjectedVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1QuobyteVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1RBDVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ResourceFieldSelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ResourceRequirements.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SELinuxOptions.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ScaleIOVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SeccompProfile.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SecretEnvSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SecretKeySelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SecretProjection.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SecretVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1SecurityContext.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ServiceAccountTokenProjection.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1ServicePort.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1StorageOSVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Sysctl.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1TCPSocketAction.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Toleration.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1TypedLocalObjectReference.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1Volume.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1VolumeDevice.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1VolumeMount.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1VolumeProjection.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1VsphereVirtualDiskVolumeSource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1WeightedPodAffinityTerm.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiCoreV1WindowsSecurityContextOptions.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApiPolicyV1PodDisruptionBudgetSpec.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1CreateOptions.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1GroupVersionResource.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1LabelSelector.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1LabelSelectorRequirement.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1ListMeta.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1ManagedFieldsEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1ObjectMeta.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1OwnerReference.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/ioK8sApimachineryPkgApisMetaV1StatusCause.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/models.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/sensorCreateSensorRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/sensorLogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/sensorSensorWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/sensorUpdateSensorRequest.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfEventsourceEventSourceWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfEventsourceLogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfIoArgoprojWorkflowV1alpha1LogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfIoArgoprojWorkflowV1alpha1WorkflowWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfIoK8sApiCoreV1Event.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfSensorLogEntry.ts create mode 100644 plugins/argo-workflows/src/api/generated/model/streamResultOfSensorSensorWatchEvent.ts create mode 100644 plugins/argo-workflows/src/api/generated/swagger.json create mode 100644 plugins/argo-workflows/src/api/index.ts create mode 100644 plugins/argo-workflows/src/components/Overview/Overview.tsx create mode 100644 plugins/argo-workflows/src/components/Overview/index.ts create mode 100644 plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.test.tsx create mode 100644 plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.tsx create mode 100644 plugins/argo-workflows/src/components/WorkflowTemplateOverview/WorkflowTemplateOverview.test.tsx create mode 100644 plugins/argo-workflows/src/components/WorkflowTemplateOverview/WorkflowTemplateOverview.tsx create mode 100644 plugins/argo-workflows/src/components/utils.ts create mode 100644 plugins/argo-workflows/src/index.ts create mode 100644 plugins/argo-workflows/src/plugin.test.ts create mode 100644 plugins/argo-workflows/src/plugin.ts create mode 100644 plugins/argo-workflows/src/routes.ts create mode 100644 plugins/argo-workflows/src/setupTests.ts create mode 100644 plugins/argo-workflows/src/test-data/testResponse.ts create mode 100644 plugins/argo-workflows/src/test-data/testResponseWorkflowTemplates.ts diff --git a/app-config.yaml b/app-config.yaml index 08d2abf..e338155 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -1,9 +1,9 @@ app: - title: Scaffolded Backstage App + title: CNOE baseUrl: http://localhost:3000 organization: - name: My Company + name: CNOE backend: # Used for enabling authentication, secret is shared by all backend plugins @@ -33,15 +33,15 @@ backend: # workingDirectory: /tmp # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir integrations: - github: - - host: github.com - # This is a Personal Access Token or PAT from GitHub. You can find out how to generate this token, and more information - # about setting up the GitHub integration here: https://backstage.io/docs/getting-started/configuration#setting-up-a-github-integration - token: ${GITHUB_TOKEN} - ### Example for how to add your GitHub Enterprise instance using the API: - # - host: ghe.example.net - # apiBaseUrl: https://ghe.example.net/api/v3 - # token: ${GHE_TOKEN} + gitea: + - baseUrl: https://gitea.cnoe.localtest.me:8443 + host: gitea.cnoe.localtest.me:8443 + username: giteaAdmin + password: giteaPassword + - baseUrl: https://gitea.cnoe.localtest.me + host: gitea.cnoe.localtest.me:8443 + username: giteaAdmin + password: giteaPassword proxy: ### Example for how to add a proxy endpoint for the frontend. @@ -64,33 +64,45 @@ techdocs: auth: # see https://backstage.io/docs/auth/ to learn about auth providers - providers: {} + environment: local # set this to development to enable SSO + session: + secret: abcdfkjalskdfjkla + providers: + keycloak-oidc: + development: + metadataUrl: https://keycloak.cnoe.localtest.me:8443/realms/cnoe/.well-known/openid-configuration + clientId: backstage + clientSecret: ${KEYCLOAK_CLIENT_SECRET} + scope: 'openid profile email groups' + prompt: auto scaffolder: # see https://backstage.io/docs/features/software-templates/configuration for software template options - + defaultAuthor: + name: backstage-scaffolder + email: noreply + defaultCommitMessage: "backstage scaffolder" catalog: import: entityFilename: catalog-info.yaml pullRequestBranchName: backstage-integration rules: - - allow: [Component, System, API, Resource, Location] + - allow: [ Component, System, API, Resource, Location, Template ] locations: - # Local example data, file locations are relative to the backend process, typically `packages/backend` - - type: file - target: ../../examples/entities.yaml + - type: url + target: https://gitea.cnoe.localtest.me:8443/giteaAdmin/entities/src/branch/main/catalog-info.yaml - # Local example template - - type: file - target: ../../examples/template/template.yaml - rules: - - allow: [Template] - - # Local example organizational data - - type: file - target: ../../examples/org.yaml - rules: - - allow: [User, Group] +# # Local example template +# - type: file +# target: ../../examples/template/template.yaml +# rules: +# - allow: [Template] +# +# # Local example organizational data +# - type: file +# target: ../../examples/org.yaml +# rules: +# - allow: [User, Group] ## Uncomment these lines to add more example data # - type: url @@ -101,3 +113,26 @@ catalog: # target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/acme-corp.yaml # rules: # - allow: [User, Group] +kubernetes: + serviceLocatorMethod: + type: 'multiTenant' + clusterLocatorMethods: + - type: 'config' + clusters: + - url: https://127.0.0.1:33277 # you may need to change this + name: local + authProvider: 'serviceAccount' + skipTLSVerify: true + # replace with your own service account token value. e.g. kubectl -n backstage exec -it deploy/backstage -- cat /var/run/secrets/kubernetes.io/serviceaccount/token + serviceAccountToken: eyJhbG...... +argocd: + appLocatorMethods: + - type: 'config' + instances: + - name: in-cluster + url: https://argocd.cnoe.localtest.me:8443 + username: admin + # replace with your argocd password e.g. kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d + password: ${ARGOCD_ADMIN_PASSWORD} +argoWorkflows: + baseUrl: https://argo.cnoe.localtest.me:8443 diff --git a/packages/app/package.json b/packages/app/package.json index 1169820..37f5c9b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -14,36 +14,39 @@ "lint": "backstage-cli package lint" }, "dependencies": { - "@backstage/app-defaults": "^1.4.7", - "@backstage/catalog-model": "^1.4.3", - "@backstage/cli": "^0.25.1", - "@backstage/core-app-api": "^1.11.3", - "@backstage/core-components": "^0.13.10", - "@backstage/core-plugin-api": "^1.8.2", - "@backstage/integration-react": "^1.1.23", - "@backstage/plugin-api-docs": "^0.10.3", - "@backstage/plugin-catalog": "^1.16.1", - "@backstage/plugin-catalog-common": "^1.0.20", - "@backstage/plugin-catalog-graph": "^0.3.3", - "@backstage/plugin-catalog-import": "^0.10.5", - "@backstage/plugin-catalog-react": "^1.9.3", - "@backstage/plugin-github-actions": "^0.6.10", - "@backstage/plugin-home": "^0.6.1", - "@backstage/plugin-kubernetes": "^0.11.4", - "@backstage/plugin-org": "^0.6.19", - "@backstage/plugin-permission-react": "^0.4.19", - "@backstage/plugin-scaffolder": "^1.17.1", - "@backstage/plugin-search": "^1.4.5", - "@backstage/plugin-search-react": "^1.7.5", - "@backstage/plugin-tech-radar": "^0.6.12", - "@backstage/plugin-techdocs": "^1.9.3", - "@backstage/plugin-techdocs-module-addons-contrib": "^1.1.4", - "@backstage/plugin-techdocs-react": "^1.1.15", - "@backstage/plugin-user-settings": "^0.8.0", - "@backstage/theme": "^0.5.0", + "@backstage/app-defaults": "~1.4.7", + "@backstage/catalog-model": "~1.4.3", + "@backstage/cli": "~0.25.1", + "@backstage/core-app-api": "~1.11.3", + "@backstage/core-components": "~0.13.10", + "@backstage/core-plugin-api": "~1.8.2", + "@backstage/integration-react": "~1.1.23", + "@backstage/plugin-api-docs": "~0.10.3", + "@backstage/plugin-catalog": "~1.16.1", + "@backstage/plugin-catalog-common": "~1.0.20", + "@backstage/plugin-catalog-graph": "~0.3.3", + "@backstage/plugin-catalog-import": "~0.10.5", + "@backstage/plugin-catalog-react": "~1.9.3", + "@backstage/plugin-github-actions": "~0.6.10", + "@backstage/plugin-home": "~0.6.1", + "@backstage/plugin-kubernetes": "~0.11.4", + "@backstage/plugin-org": "~0.6.19", + "@backstage/plugin-permission-react": "~0.4.19", + "@backstage/plugin-scaffolder": "~1.17.1", + "@backstage/plugin-search": "~1.4.5", + "@backstage/plugin-search-react": "~1.7.5", + "@backstage/plugin-tech-radar": "~0.6.12", + "@backstage/plugin-techdocs": "~1.9.3", + "@backstage/plugin-techdocs-module-addons-contrib": "~1.1.4", + "@backstage/plugin-techdocs-react": "~1.1.15", + "@backstage/plugin-user-settings": "~0.8.0", + "@backstage/theme": "~0.5.0", + "@internal/plugin-apache-spark": "^0.1.0", + "@internal/plugin-argo-workflows": "^0.1.0", "@internal/plugin-cnoe-ui": "^0.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", + "@roadiehq/backstage-plugin-argo-cd": "^2.5.1", "history": "^5.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index b8c215b..87faf6d 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -42,6 +42,8 @@ import { cnoeDarkTheme, } from '@internal/plugin-cnoe-ui'; import {configApiRef, useApi} from "@backstage/core-plugin-api"; +import { ArgoWorkflowsPage } from '@internal/plugin-argo-workflows'; +import { ApacheSparkPage } from '@internal/plugin-apache-spark'; const app = createApp({ apis, @@ -147,6 +149,8 @@ const routes = ( } /> } /> + } /> + } /> ); diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 7c6a71e..30e5db9 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -58,6 +58,19 @@ import { import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; +import { EntityKubernetesContent } from '@backstage/plugin-kubernetes'; + +import { + EntityArgoCDOverviewCard, + isArgocdAvailable +} from '@roadiehq/backstage-plugin-argo-cd'; + +import { + EntityArgoWorkflowsOverviewCard, EntityArgoWorkflowsTemplateOverviewCard, + isArgoWorkflowsAvailable, +} from '@internal/plugin-argo-workflows'; +import {ApacheSparkPage, isApacheSparkAvailable} from "@internal/plugin-apache-spark"; + const techdocsContent = ( @@ -127,6 +140,23 @@ const overviewContent = ( + + Boolean(isArgocdAvailable(e))}> + + + + + + + isArgoWorkflowsAvailable(e)}> + + + + + + + + @@ -137,6 +167,7 @@ const overviewContent = ( + ); @@ -150,6 +181,14 @@ const serviceEntityPage = ( {cicdContent} + + + + + + + + diff --git a/packages/backend/package.json b/packages/backend/package.json index 2d8fff6..793c00c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -41,6 +41,8 @@ "@backstage/plugin-search-backend-node": "~1.2.13", "@backstage/plugin-techdocs-backend": "~1.9.2", "@backstage/types": "~1.1.1", + "@roadiehq/backstage-plugin-argo-cd-backend": "~2.14.0", + "@roadiehq/scaffolder-backend-module-utils": "~1.13.1", "app": "link:../app", "better-sqlite3": "^9.0.0", "dockerode": "^3.3.1", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index c4e585f..d81d859 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -33,7 +33,7 @@ import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; import kubernetes from './plugins/kubernetes'; - +import argocd from './plugins/argocd'; function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); @@ -89,6 +89,7 @@ async function main() { const appEnv = useHotMemoize(module, () => createEnv('app')); const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes')); + const argocdEnv = useHotMemoize(module, () => createEnv('argocd')); const apiRouter = Router(); apiRouter.use('/catalog', await catalog(catalogEnv)); @@ -99,6 +100,7 @@ async function main() { apiRouter.use('/search', await search(searchEnv)); apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv)); + apiRouter.use('/argocd', await argocd(argocdEnv)); // Add backends ABOVE this line; this 404 handler is the catch-all fallback apiRouter.use(notFoundHandler()); diff --git a/packages/backend/src/plugins/argocd.ts b/packages/backend/src/plugins/argocd.ts new file mode 100644 index 0000000..53fb00d --- /dev/null +++ b/packages/backend/src/plugins/argocd.ts @@ -0,0 +1,136 @@ +import {Config} from "@backstage/config"; +import {createTemplateAction} from "@backstage/plugin-scaffolder-node"; +import {examples} from "./gitea-actions"; +import {Logger} from "winston"; + +import { ArgoService } from '@roadiehq/backstage-plugin-argo-cd-backend'; + +import { createRouter } from '@roadiehq/backstage-plugin-argo-cd-backend'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin({ + logger, + config, + }: PluginEnvironment) { + return await createRouter({ logger, config }); +} + +export function createArgoCDApp(options: { + config: Config; + logger: Logger +}) { + const { config, logger } = options; + + return createTemplateAction<{ + repoUrl: string; + projectName?: string; + appName: string; + argoInstance: string; + path: string; + labelValue?: string; + appNamespace: string + }>({ + id: 'cnoe:create-argocd-app', + description: + 'creates argocd app', + examples, + schema: { + input: { + type: 'object', + required: ['repoUrl', 'projectName', 'appName', 'argoInstance', 'path', 'appNamespace'], + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + projectName: { + title: 'name of the project in argocd', + type: 'string', + }, + appName: { + title: 'application name in argocd', + type: 'string', + }, + appNamespace: { + title: 'application name in argocd', + type: 'string', + }, + argoInstance: { + title: 'backstage argocd instance name defined in app-config.yaml', + type: 'string', + }, + path: { + title: 'argocd spec path', + type: 'string', + }, + labelValue: { + title: 'for argocd plugin to locate this app', + type: 'string', + } + }, + }, + output: { + }, + }, + async handler(ctx) { + + const { + repoUrl, + projectName, + appName, + argoInstance, + path, + labelValue, + appNamespace + } = ctx.input; + + const argoUserName = + config.getOptionalString('argocd.username') ?? 'argocdUsername'; + const argoPassword = + config.getOptionalString('argocd.password') ?? 'argocdPassword'; + + const argoSvc = new ArgoService( + argoUserName, + argoPassword, + config, + logger, + ); + + const argocdConfig = config + .getConfigArray('argocd.appLocatorMethods') + .filter(element => element.getString('type') === 'config') + .reduce( + (acc: Config[], argoApp: Config) => + acc.concat(argoApp.getConfigArray('instances')), + [], + ) + .map(instance => ({ + name: instance.getString('name'), + url: instance.getString('url'), + token: instance.getOptionalString('token'), + username: instance.getOptionalString('username'), + password: instance.getOptionalString('password'), + })); + const matchedArgoInstance = argocdConfig.find( + argoHost => argoHost.name === argoInstance, + ); + if (!matchedArgoInstance) { + throw new Error(`Unable to find Argo instance named "${argoInstance}"`); + } + const token = + matchedArgoInstance.token || + (await argoSvc.getArgoToken(matchedArgoInstance)); + + await argoSvc.createArgoApplication({ + baseUrl: matchedArgoInstance.url, + argoToken: token, + appName: appName, + projectName: projectName ? projectName : appName, + namespace: appNamespace, + sourceRepo: repoUrl, + sourcePath: path, + labelValue: labelValue ? labelValue : appName, + }) + }, + }); +} diff --git a/packages/backend/src/plugins/gitea-actions.ts b/packages/backend/src/plugins/gitea-actions.ts index 8dd9ebc..81d7cbb 100644 --- a/packages/backend/src/plugins/gitea-actions.ts +++ b/packages/backend/src/plugins/gitea-actions.ts @@ -1,3 +1,4 @@ +// this is necessary until https://github.com/backstage/backstage/pull/21890/ is merged and released. import { InputError } from '@backstage/errors'; import { Config } from '@backstage/config'; import { @@ -6,7 +7,6 @@ import { ScmIntegrationRegistry, ScmIntegrations, } from '@backstage/integration'; import { - ActionContext, createTemplateAction, getRepoSourceDirectory, initRepoAndPush, @@ -232,32 +232,32 @@ function checkRequiredParams(repoUrl: URL, ...params: string[]) { } } } -const checkGiteaContentUrl = async ( - config: GiteaIntegrationConfig, - options: { - owner?: string; - repo: string; - defaultBranch?: string; - }, -): Promise => { - const { owner, repo, defaultBranch } = options; - let response: Response; - const getOptions: RequestInit = { - method: 'GET', - }; - - try { - response = await fetch( - `${config.baseUrl}/${owner}/${repo}/src/branch/${defaultBranch}`, - getOptions, - ); - } catch (e) { - throw new Error( - `Unable to get the repository: ${owner}/${repo} metadata , ${e}`, - ); - } - return response; -}; +// const checkGiteaContentUrl = async ( +// config: GiteaIntegrationConfig, +// options: { +// owner?: string; +// repo: string; +// defaultBranch?: string; +// }, +// ): Promise => { +// const { owner, repo, defaultBranch } = options; +// let response: Response; +// const getOptions: RequestInit = { +// method: 'GET', +// }; +// +// try { +// response = await fetch( +// `${config.baseUrl}/${owner}/${repo}/src/branch/${defaultBranch}`, +// getOptions, +// ); +// } catch (e) { +// throw new Error( +// `Unable to get the repository: ${owner}/${repo} metadata , ${e}`, +// ); +// } +// return response; +// }; const checkGiteaOrg = async ( config: GiteaIntegrationConfig, @@ -372,63 +372,58 @@ const generateCommitMessage = ( return msg; }; -/** - * Checks if the provided function can be executed within a specific period of time limit. - * @param fn - * @param timeLimit - */ -async function checkDurationLimit(fn: () => void, timeLimit: number): Promise { - - const startTime = process.hrtime(); - - // Call the function - await fn(); - - const endTime = process.hrtime(startTime); - const durationInMs = endTime[0] * 1000 + endTime[1] / 1e6; - - // Check if the duration exceeds the time limit - return durationInMs <= timeLimit; -} - -async function checkAvailabilityGiteaRepository( - integrationConfig: GiteaIntegrationConfig, - options: { - owner?: string; - repo: string; - defaultBranch: string; - ctx: ActionContext; - }, -) { - const { owner, repo, defaultBranch, ctx } = options; - const sleep = (ms: number | undefined) => new Promise(r => setTimeout(r, ms)); - let response: Response; - - const p = new Promise((resolve, reject) => { - setTimeout(async () => { - response = await checkGiteaContentUrl(integrationConfig, { - owner, - repo, - defaultBranch, - }); - - while (response.status !== 200) { - if (ctx.signal?.aborted) return; - await sleep(1000); - response = await checkGiteaContentUrl(integrationConfig, { - owner, - repo, - defaultBranch, - }); - } - resolve() - }, - 5000 - ) - }) - return p - -} +// async function checkDurationLimit(fn: () => void, timeLimit: number): Promise { +// +// const startTime = process.hrtime(); +// +// // Call the function +// await fn(); +// +// const endTime = process.hrtime(startTime); +// const durationInMs = endTime[0] * 1000 + endTime[1] / 1e6; +// +// // Check if the duration exceeds the time limit +// return durationInMs <= timeLimit; +// } +// +// async function checkAvailabilityGiteaRepository( +// integrationConfig: GiteaIntegrationConfig, +// options: { +// owner?: string; +// repo: string; +// defaultBranch: string; +// ctx: ActionContext; +// }, +// ) { +// const { owner, repo, defaultBranch, ctx } = options; +// const sleep = (ms: number | undefined) => new Promise(r => setTimeout(r, ms)); +// let response: Response; +// +// const p = new Promise((resolve, reject) => { +// setTimeout(async () => { +// response = await checkGiteaContentUrl(integrationConfig, { +// owner, +// repo, +// defaultBranch, +// }); +// +// while (response.status !== 200) { +// if (ctx.signal?.aborted) return; +// await sleep(1000); +// response = await checkGiteaContentUrl(integrationConfig, { +// owner, +// repo, +// defaultBranch, +// }); +// } +// resolve() +// }, +// 5000 +// ) +// }) +// return p +// +// } /** * Creates a new action that initializes a git repository using the content of the workspace. diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index ff49675..a577370 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -4,6 +4,23 @@ import { Router } from 'express'; import type { PluginEnvironment } from '../types'; import { ScmIntegrations } from '@backstage/integration'; import {createPublishGiteaAction} from "./gitea-actions"; +import {createArgoCDApp} from "./argocd"; + +import { + createZipAction, + createSleepAction, + createWriteFileAction, + createAppendFileAction, + createMergeJSONAction, + createMergeAction, + createParseFileAction, + createSerializeYamlAction, + createSerializeJsonAction, + createJSONataAction, + createYamlJSONataTransformAction, + createJsonJSONataTransformAction, + createReplaceInFileAction +} from '@roadiehq/scaffolder-backend-module-utils'; export default async function createPlugin( env: PluginEnvironment, @@ -24,12 +41,36 @@ export default async function createPlugin( integrations: integrations, config: env.config, } + const argocdOptions = { + config: env.config, + logger: env.logger + } - const cnoeActions = [createPublishGiteaAction(options)] + const cnoeActions = [ + createPublishGiteaAction(options), + createArgoCDApp(argocdOptions) + ] + + const roadieUtilActions = [ + createZipAction(), + createSleepAction(), + createWriteFileAction(), + createAppendFileAction(), + createMergeJSONAction({}), + createMergeAction(), + createParseFileAction(), + createSerializeYamlAction(), + createSerializeJsonAction(), + createJSONataAction(), + createYamlJSONataTransformAction(), + createJsonJSONataTransformAction(), + createReplaceInFileAction() + ] const actions = [ ...builtInActions, ...cnoeActions, + ...roadieUtilActions ]; return await createRouter({ diff --git a/plugins/apache-spark/.eslintrc.js b/plugins/apache-spark/.eslintrc.js new file mode 100644 index 0000000..e2a53a6 --- /dev/null +++ b/plugins/apache-spark/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/apache-spark/README.md b/plugins/apache-spark/README.md new file mode 100644 index 0000000..976aba2 --- /dev/null +++ b/plugins/apache-spark/README.md @@ -0,0 +1,13 @@ +# apache-spark + +Welcome to the apache-spark plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/apache-spark](http://localhost:3000/apache-spark). + +You can also serve the plugin in isolation by running `yarn start` in the plugin directory. +This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. +It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. diff --git a/plugins/apache-spark/dev/index.tsx b/plugins/apache-spark/dev/index.tsx new file mode 100644 index 0000000..5f2b474 --- /dev/null +++ b/plugins/apache-spark/dev/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { createDevApp } from '@backstage/dev-utils'; +import { apacheSparkPlugin, ApacheSparkPage } from '../src/plugin'; + +createDevApp() + .registerPlugin(apacheSparkPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/apache-spark' + }) + .render(); diff --git a/plugins/apache-spark/package.json b/plugins/apache-spark/package.json new file mode 100644 index 0000000..7553c7f --- /dev/null +++ b/plugins/apache-spark/package.json @@ -0,0 +1,51 @@ +{ + "name": "@internal/plugin-apache-spark", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "^0.13.8", + "@backstage/core-plugin-api": "^1.8.2", + "@backstage/theme": "^0.5.0", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.61", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.25.1", + "@backstage/core-app-api": "^1.11.3", + "@backstage/dev-utils": "^1.0.26", + "@backstage/test-utils": "^1.4.7", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/apache-spark/src/api/index.test.ts b/plugins/apache-spark/src/api/index.test.ts new file mode 100644 index 0000000..20f775b --- /dev/null +++ b/plugins/apache-spark/src/api/index.test.ts @@ -0,0 +1,113 @@ +// import { ApacheSparkClient } from './index'; +// import { ApacheSpark } from './model'; +// +// const mockKubernetesApi = { +// proxy: jest.fn(), +// getClusters: jest.fn(), +// getObjectsByEntity: jest.fn(), +// getWorkloadsByEntity: jest.fn(), +// getCustomObjectsByEntity: jest.fn(), +// }; +// +// describe('ApacheSparkClient', () => { +// let apacheSparkClient: ApacheSparkClient; +// +// beforeEach(() => { +// apacheSparkClient = new ApacheSparkClient(mockKubernetesApi); +// }); +// +// afterEach(() => { +// jest.clearAllMocks(); +// }); +// +// it('should fetch Spark application logs', async () => { +// mockKubernetesApi.proxy.mockResolvedValue({ +// ok: true, +// text: () => { +// return 'logs'; +// }, +// }); +// const logs = await apacheSparkClient.getLogs( +// 'cluster1', +// 'spark-namespace', +// 'spark-pod-name', +// 'abc', +// ); +// expect(logs).toEqual('logs'); +// expect(mockKubernetesApi.proxy).toHaveBeenCalledWith({ +// clusterName: 'cluster1', +// path: '/api/v1/namespaces/spark-namespace/pods/spark-pod-name/log?tailLines=1000&container=abc', +// }); +// }); +// +// it('should throw error if Spark application logs are not fetched', async () => { +// mockKubernetesApi.proxy.mockResolvedValueOnce({ +// status: 500, +// statusText: 'Internal Server Error', +// ok: false, +// text: () => { +// return 'oh noes'; +// }, +// }); +// +// await expect( +// apacheSparkClient.getLogs( +// 'spark-app-name', +// 'spark-namespace', +// 'spark-pod-name', +// 'abc', +// ), +// ).rejects.toEqual( +// 'failed to fetch logs: 500, Internal Server Error, oh noes', +// ); +// }); +// +// // test getSparkApp method +// it('should fetch Spark application', async () => { +// // @ts-ignore +// const mockResponse: ApacheSpark = { +// apiVersion: 'sparkoperator.k8s.io/v1beta2', +// kind: 'SparkApplication', +// metadata: { +// name: 'spark-app-name', +// namespace: 'spark-namespace', +// labels: { +// app: 'spark-app-name', +// }, +// creationTimestamp: '2021-01-01T00:00:00Z', +// }, +// spec: { +// image: 'abc', +// mainApplicationFile: 'main.py', +// mode: 'cluster', +// sparkVersion: 'v3.1.1.', +// type: 'Python', +// driver: { +// cores: 1, +// }, +// executor: { +// cores: 1, +// }, +// }, +// status: { +// applicationState: { +// state: 'RUNNING', +// }, +// }, +// }; +// +// mockKubernetesApi.proxy.mockResolvedValue({ +// ok: true, +// text: () => { +// return JSON.stringify(mockResponse); +// }, +// }); +// +// const application = await apacheSparkClient.getSparkApp( +// 'spark-app-name', +// 'spark-namespace', +// 'abc', +// ); +// expect(application).toEqual(mockResponse); +// }); +// }); diff --git a/plugins/apache-spark/src/api/index.ts b/plugins/apache-spark/src/api/index.ts new file mode 100644 index 0000000..cda9454 --- /dev/null +++ b/plugins/apache-spark/src/api/index.ts @@ -0,0 +1,176 @@ +import { createApiRef } from '@backstage/core-plugin-api'; +import { ApacheSpark, ApacheSparkList, Pod } from './model'; +import { KubernetesApi } from '@backstage/plugin-kubernetes'; + +export const apacheSparkApiRef = createApiRef({ + id: 'plugin.apachespark', +}); + +const API_VERSION = 'sparkoperator.k8s.io/v1beta2'; +const SPARK_APP_PLURAL = 'sparkapplications'; +const K8s_API_TIMEOUT = 'timeoutSeconds'; + +export interface ApacheSparkApi { + getSparkApps( + clusterName: string | undefined, + namespace: string | undefined, + labels: string | undefined, + ): Promise; + + getSparkApp( + clusterName: string | undefined, + namespace: string | undefined, + name: string, + ): Promise; + + getLogs( + clusterName: string | undefined, + namespace: string | undefined, + podName: string, + containerName?: string | undefined, + tailLine?: number, + ): Promise; + + getContainers( + clusterName: string | undefined, + namespace: string | undefined, + podName: string, + ): Promise; +} + +export class ApacheSparkClient implements ApacheSparkApi { + private kubernetesApi: KubernetesApi; + constructor(kubernetesApi: KubernetesApi) { + this.kubernetesApi = kubernetesApi; + } + async getSparkApps( + clusterName: string | undefined, + namespace: string | undefined, + labels: string | undefined, + ): Promise { + const ns = namespace !== undefined ? namespace : 'default'; + const path = `/apis/${API_VERSION}/namespaces/${ns}/${SPARK_APP_PLURAL}`; + const query = new URLSearchParams({ + [K8s_API_TIMEOUT]: '30', + }); + if (labels) { + query.set('labelSelector', labels); + } + const resp = await this.kubernetesApi.proxy({ + clusterName: + clusterName !== undefined ? clusterName : await this.getFirstCluster(), + path: `${path}?${query.toString()}`, + }); + + if (!resp.ok) { + return Promise.reject( + `failed to fetch resources: ${resp.status}, ${ + resp.statusText + }, ${await resp.text()}`, + ); + } + const out = JSON.parse(await resp.text()); + this.removeManagedField(out); + return out; + } + + async getSparkApp( + clusterName: string | undefined, + namespace: string | undefined, + name: string, + ): Promise { + const ns = namespace !== undefined ? namespace : 'default'; + const path = `/apis/${API_VERSION}/namespaces/${ns}/${SPARK_APP_PLURAL}/${name}`; + const resp = await this.kubernetesApi.proxy({ + clusterName: + clusterName !== undefined ? clusterName : await this.getFirstCluster(), + path: `${path}`, + }); + if (!resp.ok) { + return Promise.reject( + `failed to fetch resources: ${resp.status}, ${ + resp.statusText + }, ${await resp.text()}`, + ); + } + const out = JSON.parse(await resp.text()); + this.removeManagedField(out); + return out; + } + + async getLogs( + clusterName: string | undefined, + namespace: string | undefined, + podName: string, + containerName: string | undefined, + tailLine: number = 1000, + ): Promise { + const ns = namespace !== undefined ? namespace : 'default'; + const path = `/api/v1/namespaces/${ns}/pods/${podName}/log`; + const query = new URLSearchParams({ + tailLines: tailLine.toString(), + }); + if (containerName) { + query.set('container', containerName); + } + + const resp = await this.kubernetesApi.proxy({ + clusterName: + clusterName !== undefined ? clusterName : await this.getFirstCluster(), + path: `${path}?${query.toString()}`, + }); + if (!resp.ok) { + return Promise.reject( + `failed to fetch logs: ${resp.status}, ${ + resp.statusText + }, ${await resp.text()}`, + ); + } + return resp.text(); + } + + async getContainers( + clusterName: string | undefined, + namespace: string | undefined, + podName: string, + ): Promise { + const ns = namespace !== undefined ? namespace : 'default'; + const path = `/api/v1/namespaces/${ns}/pods/${podName}`; + const query = new URLSearchParams({ + [K8s_API_TIMEOUT]: '30', + }); + const resp = await this.kubernetesApi.proxy({ + clusterName: + clusterName !== undefined ? clusterName : await this.getFirstCluster(), + path: `${path}?${query.toString()}`, + }); + if (!resp.ok) { + throw new Error( + `failed to fetch logs: ${resp.status}, ${ + resp.statusText + }, ${await resp.text()}`, + ); + } + const pod = JSON.parse(await resp.text()) as Pod; + return pod.spec.containers.map(c => c.name); + } + + async getFirstCluster(): Promise { + const clusters = await this.kubernetesApi.getClusters(); + if (clusters.length > 0) { + return Promise.resolve(clusters[0].name); + } + return Promise.reject('no clusters found in configuration'); + } + + removeManagedField(spark: any) { + if (spark.metadata?.hasOwnProperty('managedFields')) { + delete spark.metadata.managedFields; + } + if (spark.items) { + for (const i of spark.items) { + this.removeManagedField(i); + } + } + } +} diff --git a/plugins/apache-spark/src/api/model.ts b/plugins/apache-spark/src/api/model.ts new file mode 100644 index 0000000..1d6455c --- /dev/null +++ b/plugins/apache-spark/src/api/model.ts @@ -0,0 +1,100 @@ +export type Metadata = { + name: string; + namespace?: string; + labels?: Record; + annotations?: Record; + creationTimestamp: string; + managedFields?: any; +}; + +export type Spec = { + arguments?: string[]; + batchScheduler?: string; + driver: { + coreLimit?: string; + coreRequest?: string; + cores?: number; + gpu?: { + name: string; + quantity: number; + }; + labels?: Record; + memory?: string; + memoryOverhead?: string; + podName?: string; + schedulerName?: string; + serviceAccount?: string; + }; + executor: { + coreLimit?: string; + coreRequest?: string; + cores?: number; + gpu?: { + name: string; + quantity: number; + }; + instances?: number; + labels?: Record; + memory?: string; + memoryOverhead?: string; + schedulerName?: string; + serviceAccount?: string; + }; + image: string; + mainClass?: string; + mainApplicationFile?: string; + mode: string; + pythonVersion?: string; + sparkVersion: string; + type: string; +}; + +export type Status = { + applicationState: { + errorMessage?: string; + state: string; + }; + driverInfo?: { + podName: string; + webUIAddress: string; + webUIIngressAddress: string; + webUIIngressName: string; + webUIPort: string; + webUIServiceName: string; + }; + executionAttempts?: number; + executorState?: { [key: string]: string }; + lastSubmissionAttemptTime?: string; + sparkApplicationId?: string; + submissionAttempts?: number; + submissionID?: string; + terminationTime?: string; +}; + +export type ApacheSpark = { + apiVersion: string; + kind: string; + metadata: Metadata; + spec: Spec; + status: Status; +}; + +export type ApacheSparkList = { + apiVersion: string; + kind: string; + items?: ApacheSpark[]; +}; + +export type Pod = { + apiVersion: string; + kind: string; + metadata: Metadata; + spec: PodSpec; +}; + +export type PodSpec = { + containers: { + image: string; + name: string; + }[]; +}; diff --git a/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.test.tsx b/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.test.tsx new file mode 100644 index 0000000..01d3ade --- /dev/null +++ b/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.test.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { useApi } from '@backstage/core-plugin-api'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import useAsync from 'react-use/lib/useAsync'; +import { ApacheSpark } from '../../api/model'; +import { ApacheSparkDriverLogs } from './ApacheSparkLogs'; +import { + APACHE_SPARK_LABEL_SELECTOR_ANNOTATION, + CLUSTER_NAME_ANNOTATION, + K8S_NAMESPACE_ANNOTATION, +} from '../../consts'; + +jest.mock('@backstage/core-plugin-api'); +jest.mock('react-use/lib/useAsync'); +jest.mock('@backstage/plugin-catalog-react'); + +jest.mock('@backstage/core-components', () => ({ + LogViewer: (props: { text: string }) => { + return
{props.text}
; + }, +})); + +describe('ApacheSparkDriverLogs', () => { + const mockUseApi = useApi as jest.MockedFunction; + const mockUseAsync = useAsync as jest.MockedFunction; + const mockUseEntity = useEntity as jest.MockedFunction; + const mockGetLogs = jest.fn(); + const mockSparkApp = { + status: { + driverInfo: { + podName: 'test-pod', + }, + }, + } as ApacheSpark; + + beforeEach(() => { + mockUseApi.mockReturnValue({ + getLogs: mockGetLogs, + }); + mockUseEntity.mockReturnValue({ + entity: { + apiVersion: 'version', + kind: 'kind', + metadata: { + name: 'name', + namespace: 'ns1', + annotations: { + [K8S_NAMESPACE_ANNOTATION]: 'k8s-ns', + [CLUSTER_NAME_ANNOTATION]: 'my-cluster', + [APACHE_SPARK_LABEL_SELECTOR_ANNOTATION]: 'env=test', + }, + }, + }, + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should render error message if there is an error', () => { + mockUseAsync.mockReturnValue({ + value: undefined, + loading: false, + error: new Error('Test error'), + }); + + render(); + expect(screen.getByText('Error: Test error')).toBeInTheDocument(); + expect(screen.getByRole('alert')).toBeInTheDocument(); + }); + + it('should render the log viewer with the fetched logs', async () => { + mockUseAsync.mockReturnValue({ + value: 'test logs', + loading: false, + error: undefined, + }); + render(); + expect(screen.getByText('test logs')).toBeInTheDocument(); + }); +}); diff --git a/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.tsx b/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.tsx new file mode 100644 index 0000000..e892856 --- /dev/null +++ b/plugins/apache-spark/src/components/ApacheSparkLogs/ApacheSparkLogs.tsx @@ -0,0 +1,100 @@ +import { useApi } from '@backstage/core-plugin-api'; +import { apacheSparkApiRef } from '../../api'; +import useAsync from 'react-use/lib/useAsync'; +import { ApacheSpark } from '../../api/model'; +import { + LogViewer, + Progress, + Select, + SelectedItems, + SelectItem, +} from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import React, { useEffect, useState } from 'react'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import { getAnnotationValues } from '../utils'; + +export const ApacheSparkDriverLogs = (props: { sparkApp: ApacheSpark }) => { + const apiClient = useApi(apacheSparkApiRef); + const { entity } = useEntity(); + const { ns, clusterName } = getAnnotationValues(entity); + + const { value, loading, error } = useAsync(async (): Promise => { + return await apiClient.getLogs( + clusterName, + ns, + props.sparkApp.status.driverInfo?.podName!, + 'spark-kubernetes-driver', + ); + }, [props]); + if (loading) { + return ; + } else if (error) { + return {`${error}`}; + } + return ; +}; + +const ExecutorLogs = (props: { name: string }) => { + const apiClient = useApi(apacheSparkApiRef); + const { entity } = useEntity(); + const [logs, setLogs] = useState(''); + const { ns, clusterName } = getAnnotationValues(entity); + + useEffect(() => { + async function getLogs() { + try { + const val = await apiClient.getLogs( + clusterName, + ns, + props.name, + 'spark-kubernetes-executor', + ); + setLogs(val); + } catch (e) { + if (typeof e === 'string') { + setLogs(e); + } + } + } + if (props.name !== '') { + getLogs(); + } + }, [apiClient, clusterName, ns, props]); + + return ; +}; + +export const ApacheSparkExecutorLogs = (props: { sparkApp: ApacheSpark }) => { + const [selected, setSelected] = useState(''); + if (props.sparkApp.status.applicationState.state !== 'RUNNING') { + return ( + + Executor logs are only available for Spark Applications in RUNNING state + + ); + } + const executors: SelectItem[] = [{ label: '', value: '' }]; + for (const key in props.sparkApp.status.executorState) { + if (props.sparkApp.status.executorState.hasOwnProperty(key)) { + executors.push({ label: key, value: key }); + } + } + + const handleChange = (item: SelectedItems) => { + if (typeof item === 'string' && item !== '') { + setSelected(item); + } + }; + return ( + <> +