syntax = "proto2";
option go_package = "github.com/argoproj/argo-cd/v2/pkg/apiclient/application";

// Application Service
//
// Application Service API performs CRUD actions against application resources
package application;

import "google/api/annotations.proto";
import "k8s.io/api/core/v1/generated.proto";
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto";
import "github.com/argoproj/argo-cd/v2/reposerver/repository/repository.proto";


// ApplicationQuery is a query for application resources. When getting multiple applications, the "projects" field acts
// as a filter. When getting a single application, you may specify either zero or one project. If you specify zero
// projects, the application will be returned regardless of which project it belongs to (assuming you have access). If
// you specify one project, the application will only be returned if it exists and belongs to the specified project.
// Otherwise you will receive a 404.
message ApplicationQuery {
	// the application's name
	optional string name = 1;
	// forces application reconciliation if set to 'hard'
	optional string refresh = 2;
	// the project names to restrict returned list applications
	repeated string projects = 3;
	// when specified with a watch call, shows changes that occur after that particular version of a resource.
	optional string resourceVersion = 4;
	// the selector to restrict returned list to applications only with matched labels
	optional string selector = 5;
	// the repoURL to restrict returned list applications
	optional string repo = 6;
	// the application's namespace
	optional string appNamespace = 7;
	// the project names to restrict returned list applications (legacy name for backwards-compatibility)
	repeated string project = 8;
}

message NodeQuery {
	// the application's name
	optional string name = 1;
	optional string appNamespace = 2;
}

message RevisionMetadataQuery{
	// the application's name
	required string name = 1;
	// the revision of the app
	required string revision = 2;
	// the application's namespace
	optional string appNamespace = 3;
	optional string project = 4;
	// source index (for multi source apps)
	optional int32 sourceIndex = 5;
	// versionId from historical data (for multi source apps)
	optional int32 versionId = 6;
}

// ApplicationEventsQuery is a query for application resource events
message ApplicationResourceEventsQuery {
	required string name = 1;
	optional string resourceNamespace = 2;
	optional string resourceName = 3;
	optional string resourceUID = 4;
	optional string appNamespace = 5;
	optional string project = 6;
}

// ManifestQuery is a query for manifest resources
message ApplicationManifestQuery {
	required string name = 1;
	optional string revision = 2;
	optional string appNamespace = 3;
	optional string project = 4;
	repeated int64 sourcePositions = 5;
	repeated string revisions = 6;
}

message FileChunk {
	required bytes chunk = 1;
}

message ApplicationManifestQueryWithFiles {
	required string name = 1;
	required string checksum = 2;
	optional string appNamespace = 3;
	optional string project = 4;
}

message ApplicationManifestQueryWithFilesWrapper {
	oneof part {
		ApplicationManifestQueryWithFiles query = 1;
		FileChunk chunk = 2;
	}
}

message ApplicationResponse {}

message ApplicationCreateRequest {
	required github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application application = 1;
	optional bool upsert = 2;
	optional bool validate = 3;
}

message ApplicationUpdateRequest {
	required github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application application = 1;
	optional bool validate = 2;
	optional string project = 3;
}

message ApplicationDeleteRequest {
	required string name = 1;
	optional bool cascade = 2;
	optional string propagationPolicy = 3;
	optional string appNamespace = 4;
	optional string project = 5;
}

message SyncOptions {
	repeated string items = 1;
}

// ApplicationSyncRequest is a request to apply the config state to live state
message ApplicationSyncRequest {
	required string name = 1;
	optional string revision = 2;
	optional bool dryRun = 3;
	optional bool prune = 4;
	optional github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.SyncStrategy strategy = 5;
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.SyncOperationResource resources = 7;
	repeated string manifests = 8;
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Info infos = 9;
	optional github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RetryStrategy retryStrategy = 10;
	optional SyncOptions syncOptions = 11;
	optional string appNamespace = 12;
	optional string project = 13;
	repeated int64 sourcePositions = 14;
	repeated string revisions = 15;
}

// ApplicationUpdateSpecRequest is a request to update application spec
message ApplicationUpdateSpecRequest {
	required string name = 1;
	required github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSpec spec = 2;
	optional bool validate = 3;
	optional string appNamespace = 4;
	optional string project = 5;
}

// ApplicationPatchRequest is a request to patch an application
message ApplicationPatchRequest {
	required string name = 1;
	required string patch = 2;
	required string patchType = 3;
	optional string appNamespace = 5;
	optional string project = 6;
}

message ApplicationRollbackRequest {
	required string name = 1;
	required int64 id = 2;
	optional bool dryRun = 3;
	optional bool prune = 4;
	optional string appNamespace = 6;
	optional string project = 7;
}

message ApplicationResourceRequest {
	required string name = 1;
	optional string namespace = 2;
	required string resourceName = 3;
	required string version = 4;
	optional string group = 5;
	required string kind = 6;
	optional string appNamespace = 7;
	optional string project = 8;
}

message ApplicationResourcePatchRequest {
	required string name = 1;
	optional string namespace = 2;
	required string resourceName = 3;
	required string version = 4;
	optional string group = 5;
	required string kind = 6;
	required string patch = 7;
	required string patchType = 8;
	optional string appNamespace = 9;
	optional string project = 10;
}

message ApplicationResourceDeleteRequest {
	required string name = 1;
	optional string namespace = 2;
	required string resourceName = 3;
	required string version = 4;
	optional string group = 5;
	required string kind = 6;
	optional bool force = 7;
	optional bool orphan = 8;
	optional string appNamespace = 9;
	optional string project = 10;
}

message ResourceActionRunRequest {
	required string name = 1;
	optional string namespace = 2;
	required string resourceName = 3;
	required string version = 4;
	optional string group = 5;
	required string kind = 6;
	required string action = 7;
	optional string appNamespace = 8;
	optional string project = 9;
}

message ResourceActionsListResponse {
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ResourceAction actions = 1;
}

message ApplicationResourceResponse {
	required string manifest = 1;
}

message ApplicationPodLogsQuery {
	required string name = 1;
	optional string namespace = 2;
	optional string podName = 3;
	optional string container = 4;
	optional int64 sinceSeconds = 5;
	optional k8s.io.apimachinery.pkg.apis.meta.v1.Time sinceTime = 6;
	optional int64 tailLines = 7;
	optional bool follow = 8;
	optional string untilTime = 9;
	optional string filter = 10;
	optional string kind = 11;
	optional string group = 12;
	optional string resourceName = 13 ;
	optional bool previous = 14;
	optional string appNamespace = 15;
	optional string project = 16;
}

message LogEntry {
	required string content = 1;
	// deprecated in favor of timeStampStr since meta.v1.Time don't support nano time
	required k8s.io.apimachinery.pkg.apis.meta.v1.Time timeStamp = 2;
	required bool last = 3;
	required string timeStampStr = 4;
	required string podName = 5;
}

message OperationTerminateRequest {
	required string name = 1;
	optional string appNamespace = 2;
	optional string project = 3;
}

message ApplicationSyncWindowsQuery {
	required string name = 1;
	optional string appNamespace = 2;
	optional string project = 3;
}

message ApplicationSyncWindowsResponse {
	repeated ApplicationSyncWindow activeWindows = 1;
	repeated ApplicationSyncWindow assignedWindows = 2;
	required bool canSync = 3;
}

message ApplicationSyncWindow {
	required string kind = 1;
	required string schedule = 2;
	required string duration = 3;
	required bool manualSync = 4;
}

message OperationTerminateResponse {
}


message ResourcesQuery {
	required string applicationName = 1;

	optional string namespace = 2;
	optional string name = 3;
	optional string version = 4;
	optional string group = 5;
	optional string kind = 6;
	optional string appNamespace = 7;
	optional string project = 8;
}

message ManagedResourcesResponse {
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ResourceDiff items = 1;
}

message LinkInfo {
	required string title = 1;
	required string url = 2;
	optional string description = 3;
	optional string iconClass = 4;
}

message LinksResponse {
	repeated LinkInfo items = 1;
}

message ListAppLinksRequest {
	required string name = 1;
	optional string namespace = 3;
	optional string project = 4;
}


// ApplicationService
service ApplicationService {

	// List returns list of applications
	rpc List(ApplicationQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationList) {
		option (google.api.http).get = "/api/v1/applications";
	}

	// ListResourceEvents returns a list of event resources
	rpc ListResourceEvents(ApplicationResourceEventsQuery) returns (k8s.io.api.core.v1.EventList) {
		option (google.api.http).get = "/api/v1/applications/{name}/events";
	}

	// Watch returns stream of application change events
	rpc Watch(ApplicationQuery) returns (stream github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationWatchEvent) {
		option (google.api.http).get = "/api/v1/stream/applications";
	}

	// Create creates an application
	rpc Create (ApplicationCreateRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http) = {
			post: "/api/v1/applications"
			body: "application"
		};
	}

	// Get returns an application by name
	rpc Get (ApplicationQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http).get = "/api/v1/applications/{name}";
	}

	// Get returns sync windows of the application
	rpc GetApplicationSyncWindows (ApplicationSyncWindowsQuery) returns (ApplicationSyncWindowsResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/syncwindows";
	}

	// Get the meta-data (author, date, tags, message) for a specific revision of the application
	rpc RevisionMetadata (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RevisionMetadata) {
		option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/metadata";
	}

	// Get the chart metadata (description, maintainers, home) for a specific revision of the application
	rpc RevisionChartDetails (RevisionMetadataQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ChartDetails) {
		option (google.api.http).get = "/api/v1/applications/{name}/revisions/{revision}/chartdetails";
	}

	// GetManifests returns application manifests
	rpc GetManifests (ApplicationManifestQuery) returns (repository.ManifestResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/manifests";
	}

	// GetManifestsWithFiles returns application manifests using provided files to generate them
	rpc GetManifestsWithFiles (stream ApplicationManifestQueryWithFilesWrapper) returns (repository.ManifestResponse) {
		option (google.api.http) = {
			post: "/api/v1/applications/manifestsWithFiles"
			body: "*"
		};
	}

	// Update updates an application
	rpc Update(ApplicationUpdateRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http) = {
			put: "/api/v1/applications/{application.metadata.name}"
			body: "application"
		};
	}

	// UpdateSpec updates an application spec
	rpc UpdateSpec(ApplicationUpdateSpecRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSpec) {
		option (google.api.http) = {
			put: "/api/v1/applications/{name}/spec"
			body: "spec"
		};
	}

	// Patch patch an application
	rpc Patch(ApplicationPatchRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http) = {
			patch: "/api/v1/applications/{name}"
			body: "*"
		};
	}

	// Delete deletes an application
	rpc Delete(ApplicationDeleteRequest) returns (ApplicationResponse) {
		option (google.api.http).delete = "/api/v1/applications/{name}";
	}

	// Sync syncs an application to its target state
	rpc Sync(ApplicationSyncRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http) = {
			post: "/api/v1/applications/{name}/sync"
			body: "*"
		};
	}

	// ManagedResources returns list of managed resources
	rpc ManagedResources(ResourcesQuery) returns (ManagedResourcesResponse) {
		option (google.api.http).get = "/api/v1/applications/{applicationName}/managed-resources";
	}

	// ResourceTree returns resource tree
	rpc ResourceTree(ResourcesQuery) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationTree) {
		option (google.api.http).get = "/api/v1/applications/{applicationName}/resource-tree";
	}

	// Watch returns stream of application resource tree
	rpc WatchResourceTree(ResourcesQuery) returns (stream github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationTree) {
		option (google.api.http).get = "/api/v1/stream/applications/{applicationName}/resource-tree";
	}

	// Rollback syncs an application to its target state
	rpc Rollback(ApplicationRollbackRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application) {
		option (google.api.http) = {
			post: "/api/v1/applications/{name}/rollback"
			body: "*"
		};
	}

	// TerminateOperation terminates the currently running operation
	rpc TerminateOperation(OperationTerminateRequest) returns (OperationTerminateResponse) {
		option (google.api.http) = {
			delete: "/api/v1/applications/{name}/operation";
		};
	}

	// GetResource returns single application resource
	rpc GetResource(ApplicationResourceRequest) returns (ApplicationResourceResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/resource";
	}

	// PatchResource patch single application resource
	rpc PatchResource(ApplicationResourcePatchRequest) returns (ApplicationResourceResponse) {
		option (google.api.http) = {
			post: "/api/v1/applications/{name}/resource"
			body: "patch"
		};
	}

	// ListResourceActions returns list of resource actions
	rpc ListResourceActions(ApplicationResourceRequest) returns (ResourceActionsListResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/resource/actions";
	}

	// RunResourceAction run resource action
	rpc RunResourceAction(ResourceActionRunRequest) returns (ApplicationResponse) {
		option (google.api.http) = {
			post: "/api/v1/applications/{name}/resource/actions"
			body: "action"
		};
	}

	// DeleteResource deletes a single application resource
	rpc DeleteResource(ApplicationResourceDeleteRequest) returns (ApplicationResponse) {
		option (google.api.http).delete = "/api/v1/applications/{name}/resource";
	}

	// PodLogs returns stream of log entries for the specified pod. Pod
	rpc PodLogs(ApplicationPodLogsQuery) returns (stream LogEntry) {
		option (google.api.http) = {
			get: "/api/v1/applications/{name}/pods/{podName}/logs"
			additional_bindings {
				get: "/api/v1/applications/{name}/logs"
			}
		};
	}

	// ListLinks returns the list of all application deep links
	rpc ListLinks(ListAppLinksRequest) returns (LinksResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/links";
	}

	// ListResourceLinks returns the list of all resource deep links
	rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) {
		option (google.api.http).get = "/api/v1/applications/{name}/resource/links";
	}
}
