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 "gogoproto/gogo.proto";
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
message ApplicationQuery {
	// the application's name
	optional string name = 1;
	// forces application reconciliation if set to true
	optional string refresh = 2;
	// the project names to restrict returned list applications
	repeated string project = 3 [(gogoproto.customname) = "Projects"];
	// when specified with a watch call, shows changes that occur after that particular version of a resource.
	optional string resourceVersion = 4 [(gogoproto.nullable) = false];
	// the selector to to restrict returned list to applications only with matched labels
	optional string selector = 5 [(gogoproto.nullable) = false];
	// the repoURL to restrict returned list applications
	optional string repo = 6 [(gogoproto.nullable) = false];
}

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

message RevisionMetadataQuery{
	// the application's name
	required string name = 1;
	// the revision of the app
	required string revision = 2;
}

// ApplicationEventsQuery is a query for application resource events
message ApplicationResourceEventsQuery {
	required string name = 1;
	required string resourceNamespace = 2 [(gogoproto.nullable) = false];
	required string resourceName = 3 [(gogoproto.nullable) = false];
	required string resourceUID = 4 [(gogoproto.nullable) = false];
}

// ManifestQuery is a query for manifest resources
message ApplicationManifestQuery {
	required string name = 1;
	optional string revision = 2 [(gogoproto.nullable) = false];
}

message ApplicationResponse {}

message ApplicationCreateRequest {
	required github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Application application = 1 [(gogoproto.nullable) = false];
	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;
}

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

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 [(gogoproto.nullable) = false];
	optional bool dryRun = 3 [(gogoproto.nullable) = false];
	optional bool prune = 4 [(gogoproto.nullable) = false];
	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 [(gogoproto.nullable) = false];
	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;
}

// 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 [(gogoproto.nullable) = false];
	optional bool validate = 3;
}

// ApplicationPatchRequest is a request to patch an application
message ApplicationPatchRequest {
	required string name = 1;
	required string patch = 2 [(gogoproto.nullable) = false];
	required string patchType = 3 [(gogoproto.nullable) = false];
}

message ApplicationRollbackRequest {
	required string name = 1;
	required int64 id = 2 [(gogoproto.customname) = "ID", (gogoproto.nullable) = false];
	optional bool dryRun = 3 [(gogoproto.nullable) = false];
	optional bool prune = 4 [(gogoproto.nullable) = false];
}

message ApplicationResourceRequest {
	required string name = 1;
	required string namespace = 2 [(gogoproto.nullable) = false];
	required string resourceName = 3 [(gogoproto.nullable) = false];
	required string version = 4 [(gogoproto.nullable) = false];
	required string group = 5 [(gogoproto.nullable) = false];
	required string kind = 6 [(gogoproto.nullable) = false];
}

message ApplicationResourcePatchRequest {
	required string name = 1;
	required string namespace = 2 [(gogoproto.nullable) = false];
	required string resourceName = 3 [(gogoproto.nullable) = false];
	required string version = 4 [(gogoproto.nullable) = false];
	required string group = 5 [(gogoproto.nullable) = false];
	required string kind = 6 [(gogoproto.nullable) = false];
	required string patch = 7 [(gogoproto.nullable) = false];
	required string patchType = 8 [(gogoproto.nullable) = false];
}

message ApplicationResourceDeleteRequest {
	required string name = 1;
	required string namespace = 2 [(gogoproto.nullable) = false];
	required string resourceName = 3 [(gogoproto.nullable) = false];
	required string version = 4 [(gogoproto.nullable) = false];
	required string group = 5 [(gogoproto.nullable) = false];
	required string kind = 6 [(gogoproto.nullable) = false];
	optional bool force = 7 [(gogoproto.nullable) = true];
	optional bool orphan = 8 [(gogoproto.nullable) = true];
}

message ResourceActionRunRequest {
	required string name = 1;
	required string namespace = 2 [(gogoproto.nullable) = false];
	required string resourceName = 3 [(gogoproto.nullable) = false];
	required string version = 4 [(gogoproto.nullable) = false];
	required string group = 5 [(gogoproto.nullable) = false];
	required string kind = 6 [(gogoproto.nullable) = false];
	required string action = 7 [(gogoproto.nullable) = false];
}

message ResourceActionsListResponse {
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ResourceAction actions = 1 [(gogoproto.nullable) = false];
}

message ApplicationResourceResponse {
	required string manifest = 1 [(gogoproto.nullable) = false];
}

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

message LogEntry {
	required string content = 1 [(gogoproto.nullable) = false];
	// 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 [(gogoproto.nullable) = false, deprecated=true];
	required bool last = 3 [(gogoproto.nullable) = false];
	required string timeStampStr = 4 [(gogoproto.nullable) = false];
	required string podName = 5 [(gogoproto.nullable) = false];
}

message OperationTerminateRequest {
	required string name = 1;
}

message ApplicationSyncWindowsQuery {
	required string name = 1;
}

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 [(gogoproto.nullable) = true];

	optional string namespace = 2 [(gogoproto.nullable) = false];
	optional string name = 3 [(gogoproto.nullable) = false];
	optional string version = 4 [(gogoproto.nullable) = false];
	optional string group = 5 [(gogoproto.nullable) = false];
	optional string kind = 6 [(gogoproto.nullable) = false];
}

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

// 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";
	}

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

	// 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"
			}
		};
	}
}
