diff --git a/CLAUDE.md b/CLAUDE.md index f8c8b27..e0d9c40 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -52,7 +52,7 @@ integration_test/ Integration tests against Loghub-2.0 datasets ### DiscoveryRun (discover) `add-log` is a pure copy into `logs/` and never triggers discovery. `workspace import gcp` pulls a snapshot from GCP Cloud Logging through ADC credentials, lands it as enveloped NDJSON in `logs/`, and records provenance under `import-runs//record.json`; it never triggers discovery either. Each `workspace discover` starts a DiscoveryRun: reads ALL files in `logs/`, runs fresh Drain + semantic labeling, and writes run-scoped `patterns/` and `notes/`. -When `lapp web` starts, it marks any previous `QUEUED` or `RUNNING` DiscoveryRuns as failed because those local workers no longer exist. +When `lapp web` starts, it marks any previous `QUEUED` or `RUNNING` DiscoveryRuns and ImportRuns as failed because those local workers no longer exist. DiscoveryRun records persist structured `progress` and `error` fields; frontend code renders those facts into user-facing text. ``` diff --git a/frontend/src/gen/lapp/event/v1/event_pb.ts b/frontend/src/gen/lapp/event/v1/event_pb.ts index dbeee81..3ebf6ea 100644 --- a/frontend/src/gen/lapp/event/v1/event_pb.ts +++ b/frontend/src/gen/lapp/event/v1/event_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated by protoc-gen-es v2.12.1 with parameter "target=ts" // @generated from file lapp/event/v1/event.proto (package lapp.event.v1, syntax proto3) /* eslint-disable */ diff --git a/frontend/src/gen/lapp/web/v1/web_pb.ts b/frontend/src/gen/lapp/web/v1/web_pb.ts index 20e1c15..6b04e20 100644 --- a/frontend/src/gen/lapp/web/v1/web_pb.ts +++ b/frontend/src/gen/lapp/web/v1/web_pb.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts" +// @generated by protoc-gen-es v2.12.1 with parameter "target=ts" // @generated from file lapp/web/v1/web.proto (package lapp.web.v1, syntax proto3) /* eslint-disable */ @@ -12,7 +12,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file lapp/web/v1/web.proto. */ export const file_lapp_web_v1_web: GenFile = /*@__PURE__*/ - fileDesc("ChVsYXBwL3dlYi92MS93ZWIucHJvdG8SC2xhcHAud2ViLnYxIokCCglXb3Jrc3BhY2USDAoEbmFtZRgBIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAiABKAkSLAoGc3RhdHVzGAMgASgOMhwubGFwcC53ZWIudjEuV29ya3NwYWNlU3RhdHVzEhYKDmxvZ19maWxlX2NvdW50GAQgASgFEhUKDXBhdHRlcm5fY291bnQYBSABKAUSNwoUbGF0ZXN0X2Rpc2NvdmVyeV9ydW4YBiABKAsyGS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW4SQgofbGF0ZXN0X3N1Y2Nlc3NmdWxfZGlzY292ZXJ5X3J1bhgHIAEoCzIZLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1biJuCgdMb2dGaWxlEgwKBG5hbWUYASABKAkSEQoJZmlsZV9uYW1lGAIgASgJEhIKCnNpemVfYnl0ZXMYAyABKAMSLgoKdXBkYXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi3QMKDERpc2NvdmVyeVJ1bhIMCgRuYW1lGAEgASgJEhgKEGRpc2NvdmVyeV9ydW5faWQYAiABKAkSLQoFc3RhdGUYAyABKA4yHi5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW5TdGF0ZRIwCgxjdXJyZW50X3N0ZXAYBCABKA4yGi5sYXBwLndlYi52MS5EaXNjb3ZlcnlTdGVwEhwKEHByb2dyZXNzX21lc3NhZ2UYBSABKAlCAhgBEhkKDWVycm9yX21lc3NhZ2UYBiABKAlCAhgBEi4KCnN0YXJ0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2ZpbmlzaGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIWCg5sb2dfZmlsZV9jb3VudBgJIAEoBRIVCg1wYXR0ZXJuX2NvdW50GAogASgFEhcKD3VubWF0Y2hlZF9jb3VudBgLIAEoBRIzCghwcm9ncmVzcxgMIAEoCzIhLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1blByb2dyZXNzEi0KBWVycm9yGA0gASgLMh4ubGFwcC53ZWIudjEuRGlzY292ZXJ5UnVuRXJyb3IifwoURGlzY292ZXJ5UnVuUHJvZ3Jlc3MSKAoEc3RlcBgBIAEoDjIaLmxhcHAud2ViLnYxLkRpc2NvdmVyeVN0ZXASPQoLbGFiZWxfYmF0Y2gYAiABKAsyKC5sYXBwLndlYi52MS5EaXNjb3ZlcnlMYWJlbEJhdGNoUHJvZ3Jlc3MiqwEKG0Rpc2NvdmVyeUxhYmVsQmF0Y2hQcm9ncmVzcxINCgVldmVudBgBIAEoCRIUCgxiYXRjaF9udW1iZXIYAiABKAUSEwoLYmF0Y2hfY291bnQYAyABKAUSEgoKYmF0Y2hfc2l6ZRgEIAEoBRIPCgdhdHRlbXB0GAUgASgFEhQKDG1heF9hdHRlbXB0cxgGIAEoBRIXCg9jb21wbGV0ZWRfY291bnQYByABKAUiXAoRRGlzY292ZXJ5UnVuRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEigKBHN0ZXAYAyABKA4yGi5sYXBwLndlYi52MS5EaXNjb3ZlcnlTdGVwIoMCCgdQYXR0ZXJuEgwKBG5hbWUYASABKAkSEgoKcGF0dGVybl9pZBgCIAEoCRITCgtzZW1hbnRpY19pZBgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRIQCgh0ZW1wbGF0ZRgFIAEoCRINCgVjb3VudBgGIAEoBRIoCgpmaXJzdF9zZWVuGAcgASgLMhQubGFwcC53ZWIudjEuTGluZVJlZhInCglsYXN0X3NlZW4YCCABKAsyFC5sYXBwLndlYi52MS5MaW5lUmVmEicKCWxpbmVfcmVmcxgJIAMoCzIULmxhcHAud2ViLnYxLkxpbmVSZWYSDwoHc2FtcGxlcxgKIAMoCSIxCgdMaW5lUmVmEhEKCWZpbGVfbmFtZRgBIAEoCRITCgtsaW5lX251bWJlchgCIAEoBSI1CgxFcnJvclBhdHRlcm4SJQoHcGF0dGVybhgBIAEoCzIULmxhcHAud2ViLnYxLlBhdHRlcm4iTQoSVW5tYXRjaGVkRXJyb3JMaW5lEhEKCWZpbGVfbmFtZRgBIAEoCRITCgtsaW5lX251bWJlchgCIAEoBRIPCgdjb250ZW50GAMgASgJIhcKFUxpc3RXb3Jrc3BhY2VzUmVxdWVzdCJEChZMaXN0V29ya3NwYWNlc1Jlc3BvbnNlEioKCndvcmtzcGFjZXMYASADKAsyFi5sYXBwLndlYi52MS5Xb3Jrc3BhY2UiIwoTR2V0V29ya3NwYWNlUmVxdWVzdBIMCgRuYW1lGAEgASgJIkEKFEdldFdvcmtzcGFjZVJlc3BvbnNlEikKCXdvcmtzcGFjZRgBIAEoCzIWLmxhcHAud2ViLnYxLldvcmtzcGFjZSIuChZDcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0EhQKDHdvcmtzcGFjZV9pZBgBIAEoCSJEChdDcmVhdGVXb3Jrc3BhY2VSZXNwb25zZRIpCgl3b3Jrc3BhY2UYASABKAsyFi5sYXBwLndlYi52MS5Xb3Jrc3BhY2UiJgoWRGVsZXRlV29ya3NwYWNlUmVxdWVzdBIMCgRuYW1lGAEgASgJIhkKF0RlbGV0ZVdvcmtzcGFjZVJlc3BvbnNlIiUKE0xpc3RMb2dGaWxlc1JlcXVlc3QSDgoGcGFyZW50GAEgASgJIj8KFExpc3RMb2dGaWxlc1Jlc3BvbnNlEicKCWxvZ19maWxlcxgBIAMoCzIULmxhcHAud2ViLnYxLkxvZ0ZpbGUiSgoUVXBsb2FkTG9nRmlsZVJlcXVlc3QSDgoGcGFyZW50GAEgASgJEhEKCWZpbGVfbmFtZRgCIAEoCRIPCgdjb250ZW50GAMgASgMIj8KFVVwbG9hZExvZ0ZpbGVSZXNwb25zZRImCghsb2dfZmlsZRgBIAEoCzIULmxhcHAud2ViLnYxLkxvZ0ZpbGUiJAoURGVsZXRlTG9nRmlsZVJlcXVlc3QSDAoEbmFtZRgBIAEoCSIXChVEZWxldGVMb2dGaWxlUmVzcG9uc2UiOgoZQ3JlYXRlRGlzY292ZXJ5UnVuUmVxdWVzdBIOCgZwYXJlbnQYASABKAkSDQoFbW9kZWwYAiABKAkiTgoaQ3JlYXRlRGlzY292ZXJ5UnVuUmVzcG9uc2USMAoNZGlzY292ZXJ5X3J1bhgBIAEoCzIZLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1biImChZHZXREaXNjb3ZlcnlSdW5SZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXR2V0RGlzY292ZXJ5UnVuUmVzcG9uc2USMAoNZGlzY292ZXJ5X3J1bhgBIAEoCzIZLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1biIqChhMaXN0RGlzY292ZXJ5UnVuc1JlcXVlc3QSDgoGcGFyZW50GAEgASgJIk4KGUxpc3REaXNjb3ZlcnlSdW5zUmVzcG9uc2USMQoOZGlzY292ZXJ5X3J1bnMYASADKAsyGS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW4iJQoTTGlzdFBhdHRlcm5zUmVxdWVzdBIOCgZwYXJlbnQYASABKAkiPgoUTGlzdFBhdHRlcm5zUmVzcG9uc2USJgoIcGF0dGVybnMYASADKAsyFC5sYXBwLndlYi52MS5QYXR0ZXJuIiEKEUdldFBhdHRlcm5SZXF1ZXN0EgwKBG5hbWUYASABKAkiOwoSR2V0UGF0dGVyblJlc3BvbnNlEiUKB3BhdHRlcm4YASABKAsyFC5sYXBwLndlYi52MS5QYXR0ZXJuIiYKFEdldEVycm9yc1ZpZXdSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCSKKAQoVR2V0RXJyb3JzVmlld1Jlc3BvbnNlEjEKDmVycm9yX3BhdHRlcm5zGAEgAygLMhkubGFwcC53ZWIudjEuRXJyb3JQYXR0ZXJuEj4KFXVubWF0Y2hlZF9lcnJvcl9saW5lcxgCIAMoCzIfLmxhcHAud2ViLnYxLlVubWF0Y2hlZEVycm9yTGluZSqqAQoPV29ya3NwYWNlU3RhdHVzEiAKHFdPUktTUEFDRV9TVEFUVVNfVU5TUEVDSUZJRUQQABIaChZXT1JLU1BBQ0VfU1RBVFVTX0VNUFRZEAESIAocV09SS1NQQUNFX1NUQVRVU19ESVNDT1ZFUklORxACEhoKFldPUktTUEFDRV9TVEFUVVNfUkVBRFkQAxIbChdXT1JLU1BBQ0VfU1RBVFVTX0ZBSUxFRBAEKrwBChFEaXNjb3ZlcnlSdW5TdGF0ZRIjCh9ESVNDT1ZFUllfUlVOX1NUQVRFX1VOU1BFQ0lGSUVEEAASHgoaRElTQ09WRVJZX1JVTl9TVEFURV9RVUVVRUQQARIfChtESVNDT1ZFUllfUlVOX1NUQVRFX1JVTk5JTkcQAhIhCh1ESVNDT1ZFUllfUlVOX1NUQVRFX1NVQ0NFRURFRBADEh4KGkRJU0NPVkVSWV9SVU5fU1RBVEVfRkFJTEVEEAQq5wEKDURpc2NvdmVyeVN0ZXASHgoaRElTQ09WRVJZX1NURVBfVU5TUEVDSUZJRUQQABIfChtESVNDT1ZFUllfU1RFUF9SRUFESU5HX0xPR1MQARIiCh5ESVNDT1ZFUllfU1RFUF9NRVJHSU5HX0VOVFJJRVMQAhInCiNESVNDT1ZFUllfU1RFUF9ESVNDT1ZFUklOR19QQVRURVJOUxADEiQKIERJU0NPVkVSWV9TVEVQX0xBQkVMSU5HX1BBVFRFUk5TEAQSIgoeRElTQ09WRVJZX1NURVBfV1JJVElOR19SRVNVTFRTEAUyqAkKEFdvcmtzcGFjZVNlcnZpY2USWQoOTGlzdFdvcmtzcGFjZXMSIi5sYXBwLndlYi52MS5MaXN0V29ya3NwYWNlc1JlcXVlc3QaIy5sYXBwLndlYi52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlElMKDEdldFdvcmtzcGFjZRIgLmxhcHAud2ViLnYxLkdldFdvcmtzcGFjZVJlcXVlc3QaIS5sYXBwLndlYi52MS5HZXRXb3Jrc3BhY2VSZXNwb25zZRJcCg9DcmVhdGVXb3Jrc3BhY2USIy5sYXBwLndlYi52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiQubGFwcC53ZWIudjEuQ3JlYXRlV29ya3NwYWNlUmVzcG9uc2USXAoPRGVsZXRlV29ya3NwYWNlEiMubGFwcC53ZWIudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBokLmxhcHAud2ViLnYxLkRlbGV0ZVdvcmtzcGFjZVJlc3BvbnNlElMKDExpc3RMb2dGaWxlcxIgLmxhcHAud2ViLnYxLkxpc3RMb2dGaWxlc1JlcXVlc3QaIS5sYXBwLndlYi52MS5MaXN0TG9nRmlsZXNSZXNwb25zZRJWCg1VcGxvYWRMb2dGaWxlEiEubGFwcC53ZWIudjEuVXBsb2FkTG9nRmlsZVJlcXVlc3QaIi5sYXBwLndlYi52MS5VcGxvYWRMb2dGaWxlUmVzcG9uc2USVgoNRGVsZXRlTG9nRmlsZRIhLmxhcHAud2ViLnYxLkRlbGV0ZUxvZ0ZpbGVSZXF1ZXN0GiIubGFwcC53ZWIudjEuRGVsZXRlTG9nRmlsZVJlc3BvbnNlEmUKEkNyZWF0ZURpc2NvdmVyeVJ1bhImLmxhcHAud2ViLnYxLkNyZWF0ZURpc2NvdmVyeVJ1blJlcXVlc3QaJy5sYXBwLndlYi52MS5DcmVhdGVEaXNjb3ZlcnlSdW5SZXNwb25zZRJcCg9HZXREaXNjb3ZlcnlSdW4SIy5sYXBwLndlYi52MS5HZXREaXNjb3ZlcnlSdW5SZXF1ZXN0GiQubGFwcC53ZWIudjEuR2V0RGlzY292ZXJ5UnVuUmVzcG9uc2USYgoRTGlzdERpc2NvdmVyeVJ1bnMSJS5sYXBwLndlYi52MS5MaXN0RGlzY292ZXJ5UnVuc1JlcXVlc3QaJi5sYXBwLndlYi52MS5MaXN0RGlzY292ZXJ5UnVuc1Jlc3BvbnNlElMKDExpc3RQYXR0ZXJucxIgLmxhcHAud2ViLnYxLkxpc3RQYXR0ZXJuc1JlcXVlc3QaIS5sYXBwLndlYi52MS5MaXN0UGF0dGVybnNSZXNwb25zZRJNCgpHZXRQYXR0ZXJuEh4ubGFwcC53ZWIudjEuR2V0UGF0dGVyblJlcXVlc3QaHy5sYXBwLndlYi52MS5HZXRQYXR0ZXJuUmVzcG9uc2USVgoNR2V0RXJyb3JzVmlldxIhLmxhcHAud2ViLnYxLkdldEVycm9yc1ZpZXdSZXF1ZXN0GiIubGFwcC53ZWIudjEuR2V0RXJyb3JzVmlld1Jlc3BvbnNlQjBaLmdpdGh1Yi5jb20vc3RycmwvbGFwcC9nZW4vZ28vbGFwcC93ZWIvdjE7d2VidjFiBnByb3RvMw", [file_google_protobuf_timestamp]); + fileDesc("ChVsYXBwL3dlYi92MS93ZWIucHJvdG8SC2xhcHAud2ViLnYxIokCCglXb3Jrc3BhY2USDAoEbmFtZRgBIAEoCRIUCgx3b3Jrc3BhY2VfaWQYAiABKAkSLAoGc3RhdHVzGAMgASgOMhwubGFwcC53ZWIudjEuV29ya3NwYWNlU3RhdHVzEhYKDmxvZ19maWxlX2NvdW50GAQgASgFEhUKDXBhdHRlcm5fY291bnQYBSABKAUSNwoUbGF0ZXN0X2Rpc2NvdmVyeV9ydW4YBiABKAsyGS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW4SQgofbGF0ZXN0X3N1Y2Nlc3NmdWxfZGlzY292ZXJ5X3J1bhgHIAEoCzIZLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1biJuCgdMb2dGaWxlEgwKBG5hbWUYASABKAkSEQoJZmlsZV9uYW1lGAIgASgJEhIKCnNpemVfYnl0ZXMYAyABKAMSLgoKdXBkYXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAivAMKCUltcG9ydFJ1bhIMCgRuYW1lGAEgASgJEhUKDWltcG9ydF9ydW5faWQYAiABKAkSEAoIcHJvdmlkZXIYAyABKAkSDwoHcHJvamVjdBgEIAEoCRIOCgZmaWx0ZXIYBSABKAkSKAoEZnJvbRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJgoCdG8YByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg0KBWxpbWl0GAggASgFEioKBXN0YXRlGAkgASgOMhsubGFwcC53ZWIudjEuSW1wb3J0UnVuU3RhdGUSEwoLZW50cnlfY291bnQYCiABKAUSEQoJdHJ1bmNhdGVkGAsgASgIEhUKDWxvZ19maWxlX25hbWUYDCABKAkSLgoKc3RhcnRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLZmluaXNoZWRfYXQYDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEioKBWVycm9yGA8gASgLMhsubGFwcC53ZWIudjEuSW1wb3J0UnVuRXJyb3IiLwoOSW1wb3J0UnVuRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIt0DCgxEaXNjb3ZlcnlSdW4SDAoEbmFtZRgBIAEoCRIYChBkaXNjb3ZlcnlfcnVuX2lkGAIgASgJEi0KBXN0YXRlGAMgASgOMh4ubGFwcC53ZWIudjEuRGlzY292ZXJ5UnVuU3RhdGUSMAoMY3VycmVudF9zdGVwGAQgASgOMhoubGFwcC53ZWIudjEuRGlzY292ZXJ5U3RlcBIcChBwcm9ncmVzc19tZXNzYWdlGAUgASgJQgIYARIZCg1lcnJvcl9tZXNzYWdlGAYgASgJQgIYARIuCgpzdGFydGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtmaW5pc2hlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFgoObG9nX2ZpbGVfY291bnQYCSABKAUSFQoNcGF0dGVybl9jb3VudBgKIAEoBRIXCg91bm1hdGNoZWRfY291bnQYCyABKAUSMwoIcHJvZ3Jlc3MYDCABKAsyIS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW5Qcm9ncmVzcxItCgVlcnJvchgNIAEoCzIeLmxhcHAud2ViLnYxLkRpc2NvdmVyeVJ1bkVycm9yIn8KFERpc2NvdmVyeVJ1blByb2dyZXNzEigKBHN0ZXAYASABKA4yGi5sYXBwLndlYi52MS5EaXNjb3ZlcnlTdGVwEj0KC2xhYmVsX2JhdGNoGAIgASgLMigubGFwcC53ZWIudjEuRGlzY292ZXJ5TGFiZWxCYXRjaFByb2dyZXNzIqsBChtEaXNjb3ZlcnlMYWJlbEJhdGNoUHJvZ3Jlc3MSDQoFZXZlbnQYASABKAkSFAoMYmF0Y2hfbnVtYmVyGAIgASgFEhMKC2JhdGNoX2NvdW50GAMgASgFEhIKCmJhdGNoX3NpemUYBCABKAUSDwoHYXR0ZW1wdBgFIAEoBRIUCgxtYXhfYXR0ZW1wdHMYBiABKAUSFwoPY29tcGxldGVkX2NvdW50GAcgASgFIlwKEURpc2NvdmVyeVJ1bkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIoCgRzdGVwGAMgASgOMhoubGFwcC53ZWIudjEuRGlzY292ZXJ5U3RlcCKDAgoHUGF0dGVybhIMCgRuYW1lGAEgASgJEhIKCnBhdHRlcm5faWQYAiABKAkSEwoLc2VtYW50aWNfaWQYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSEAoIdGVtcGxhdGUYBSABKAkSDQoFY291bnQYBiABKAUSKAoKZmlyc3Rfc2VlbhgHIAEoCzIULmxhcHAud2ViLnYxLkxpbmVSZWYSJwoJbGFzdF9zZWVuGAggASgLMhQubGFwcC53ZWIudjEuTGluZVJlZhInCglsaW5lX3JlZnMYCSADKAsyFC5sYXBwLndlYi52MS5MaW5lUmVmEg8KB3NhbXBsZXMYCiADKAkiMQoHTGluZVJlZhIRCglmaWxlX25hbWUYASABKAkSEwoLbGluZV9udW1iZXIYAiABKAUiNQoMRXJyb3JQYXR0ZXJuEiUKB3BhdHRlcm4YASABKAsyFC5sYXBwLndlYi52MS5QYXR0ZXJuIk0KElVubWF0Y2hlZEVycm9yTGluZRIRCglmaWxlX25hbWUYASABKAkSEwoLbGluZV9udW1iZXIYAiABKAUSDwoHY29udGVudBgDIAEoCSIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QiRAoWTGlzdFdvcmtzcGFjZXNSZXNwb25zZRIqCgp3b3Jrc3BhY2VzGAEgAygLMhYubGFwcC53ZWIudjEuV29ya3NwYWNlIiMKE0dldFdvcmtzcGFjZVJlcXVlc3QSDAoEbmFtZRgBIAEoCSJBChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIpCgl3b3Jrc3BhY2UYASABKAsyFi5sYXBwLndlYi52MS5Xb3Jrc3BhY2UiLgoWQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBIUCgx3b3Jrc3BhY2VfaWQYASABKAkiRAoXQ3JlYXRlV29ya3NwYWNlUmVzcG9uc2USKQoJd29ya3NwYWNlGAEgASgLMhYubGFwcC53ZWIudjEuV29ya3NwYWNlIiYKFkRlbGV0ZVdvcmtzcGFjZVJlcXVlc3QSDAoEbmFtZRgBIAEoCSIZChdEZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIlChNMaXN0TG9nRmlsZXNSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCSI/ChRMaXN0TG9nRmlsZXNSZXNwb25zZRInCglsb2dfZmlsZXMYASADKAsyFC5sYXBwLndlYi52MS5Mb2dGaWxlIkoKFFVwbG9hZExvZ0ZpbGVSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCRIRCglmaWxlX25hbWUYAiABKAkSDwoHY29udGVudBgDIAEoDCI/ChVVcGxvYWRMb2dGaWxlUmVzcG9uc2USJgoIbG9nX2ZpbGUYASABKAsyFC5sYXBwLndlYi52MS5Mb2dGaWxlIiQKFERlbGV0ZUxvZ0ZpbGVSZXF1ZXN0EgwKBG5hbWUYASABKAkiFwoVRGVsZXRlTG9nRmlsZVJlc3BvbnNlIqoBChZDcmVhdGVJbXBvcnRSdW5SZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCRIPCgdwcm9qZWN0GAIgASgJEg4KBmZpbHRlchgDIAEoCRIoCgRmcm9tGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBImCgJ0bxgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFbGltaXQYBiABKAUiRQoXQ3JlYXRlSW1wb3J0UnVuUmVzcG9uc2USKgoKaW1wb3J0X3J1bhgBIAEoCzIWLmxhcHAud2ViLnYxLkltcG9ydFJ1biIjChNHZXRJbXBvcnRSdW5SZXF1ZXN0EgwKBG5hbWUYASABKAkiQgoUR2V0SW1wb3J0UnVuUmVzcG9uc2USKgoKaW1wb3J0X3J1bhgBIAEoCzIWLmxhcHAud2ViLnYxLkltcG9ydFJ1biInChVMaXN0SW1wb3J0UnVuc1JlcXVlc3QSDgoGcGFyZW50GAEgASgJIkUKFkxpc3RJbXBvcnRSdW5zUmVzcG9uc2USKwoLaW1wb3J0X3J1bnMYASADKAsyFi5sYXBwLndlYi52MS5JbXBvcnRSdW4iIAoeTGlzdFJlY2VudEltcG9ydFF1ZXJpZXNSZXF1ZXN0ImYKEVJlY2VudEltcG9ydFF1ZXJ5Eg8KB3Byb2plY3QYASABKAkSDgoGZmlsdGVyGAIgASgJEjAKDGxhc3RfdXNlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiWQofTGlzdFJlY2VudEltcG9ydFF1ZXJpZXNSZXNwb25zZRI2Cg5yZWNlbnRfcXVlcmllcxgBIAMoCzIeLmxhcHAud2ViLnYxLlJlY2VudEltcG9ydFF1ZXJ5IjoKGUNyZWF0ZURpc2NvdmVyeVJ1blJlcXVlc3QSDgoGcGFyZW50GAEgASgJEg0KBW1vZGVsGAIgASgJIk4KGkNyZWF0ZURpc2NvdmVyeVJ1blJlc3BvbnNlEjAKDWRpc2NvdmVyeV9ydW4YASABKAsyGS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW4iJgoWR2V0RGlzY292ZXJ5UnVuUmVxdWVzdBIMCgRuYW1lGAEgASgJIksKF0dldERpc2NvdmVyeVJ1blJlc3BvbnNlEjAKDWRpc2NvdmVyeV9ydW4YASABKAsyGS5sYXBwLndlYi52MS5EaXNjb3ZlcnlSdW4iKgoYTGlzdERpc2NvdmVyeVJ1bnNSZXF1ZXN0Eg4KBnBhcmVudBgBIAEoCSJOChlMaXN0RGlzY292ZXJ5UnVuc1Jlc3BvbnNlEjEKDmRpc2NvdmVyeV9ydW5zGAEgAygLMhkubGFwcC53ZWIudjEuRGlzY292ZXJ5UnVuIiUKE0xpc3RQYXR0ZXJuc1JlcXVlc3QSDgoGcGFyZW50GAEgASgJIj4KFExpc3RQYXR0ZXJuc1Jlc3BvbnNlEiYKCHBhdHRlcm5zGAEgAygLMhQubGFwcC53ZWIudjEuUGF0dGVybiIhChFHZXRQYXR0ZXJuUmVxdWVzdBIMCgRuYW1lGAEgASgJIjsKEkdldFBhdHRlcm5SZXNwb25zZRIlCgdwYXR0ZXJuGAEgASgLMhQubGFwcC53ZWIudjEuUGF0dGVybiImChRHZXRFcnJvcnNWaWV3UmVxdWVzdBIOCgZwYXJlbnQYASABKAkiigEKFUdldEVycm9yc1ZpZXdSZXNwb25zZRIxCg5lcnJvcl9wYXR0ZXJucxgBIAMoCzIZLmxhcHAud2ViLnYxLkVycm9yUGF0dGVybhI+ChV1bm1hdGNoZWRfZXJyb3JfbGluZXMYAiADKAsyHy5sYXBwLndlYi52MS5Vbm1hdGNoZWRFcnJvckxpbmUqqgEKD1dvcmtzcGFjZVN0YXR1cxIgChxXT1JLU1BBQ0VfU1RBVFVTX1VOU1BFQ0lGSUVEEAASGgoWV09SS1NQQUNFX1NUQVRVU19FTVBUWRABEiAKHFdPUktTUEFDRV9TVEFUVVNfRElTQ09WRVJJTkcQAhIaChZXT1JLU1BBQ0VfU1RBVFVTX1JFQURZEAMSGwoXV09SS1NQQUNFX1NUQVRVU19GQUlMRUQQBCqqAQoOSW1wb3J0UnVuU3RhdGUSIAocSU1QT1JUX1JVTl9TVEFURV9VTlNQRUNJRklFRBAAEhsKF0lNUE9SVF9SVU5fU1RBVEVfUVVFVUVEEAESHAoYSU1QT1JUX1JVTl9TVEFURV9SVU5OSU5HEAISHgoaSU1QT1JUX1JVTl9TVEFURV9TVUNDRUVERUQQAxIbChdJTVBPUlRfUlVOX1NUQVRFX0ZBSUxFRBAEKrwBChFEaXNjb3ZlcnlSdW5TdGF0ZRIjCh9ESVNDT1ZFUllfUlVOX1NUQVRFX1VOU1BFQ0lGSUVEEAASHgoaRElTQ09WRVJZX1JVTl9TVEFURV9RVUVVRUQQARIfChtESVNDT1ZFUllfUlVOX1NUQVRFX1JVTk5JTkcQAhIhCh1ESVNDT1ZFUllfUlVOX1NUQVRFX1NVQ0NFRURFRBADEh4KGkRJU0NPVkVSWV9SVU5fU1RBVEVfRkFJTEVEEAQq5wEKDURpc2NvdmVyeVN0ZXASHgoaRElTQ09WRVJZX1NURVBfVU5TUEVDSUZJRUQQABIfChtESVNDT1ZFUllfU1RFUF9SRUFESU5HX0xPR1MQARIiCh5ESVNDT1ZFUllfU1RFUF9NRVJHSU5HX0VOVFJJRVMQAhInCiNESVNDT1ZFUllfU1RFUF9ESVNDT1ZFUklOR19QQVRURVJOUxADEiQKIERJU0NPVkVSWV9TVEVQX0xBQkVMSU5HX1BBVFRFUk5TEAQSIgoeRElTQ09WRVJZX1NURVBfV1JJVElOR19SRVNVTFRTEAUyrAwKEFdvcmtzcGFjZVNlcnZpY2USWQoOTGlzdFdvcmtzcGFjZXMSIi5sYXBwLndlYi52MS5MaXN0V29ya3NwYWNlc1JlcXVlc3QaIy5sYXBwLndlYi52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlElMKDEdldFdvcmtzcGFjZRIgLmxhcHAud2ViLnYxLkdldFdvcmtzcGFjZVJlcXVlc3QaIS5sYXBwLndlYi52MS5HZXRXb3Jrc3BhY2VSZXNwb25zZRJcCg9DcmVhdGVXb3Jrc3BhY2USIy5sYXBwLndlYi52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiQubGFwcC53ZWIudjEuQ3JlYXRlV29ya3NwYWNlUmVzcG9uc2USXAoPRGVsZXRlV29ya3NwYWNlEiMubGFwcC53ZWIudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBokLmxhcHAud2ViLnYxLkRlbGV0ZVdvcmtzcGFjZVJlc3BvbnNlElMKDExpc3RMb2dGaWxlcxIgLmxhcHAud2ViLnYxLkxpc3RMb2dGaWxlc1JlcXVlc3QaIS5sYXBwLndlYi52MS5MaXN0TG9nRmlsZXNSZXNwb25zZRJWCg1VcGxvYWRMb2dGaWxlEiEubGFwcC53ZWIudjEuVXBsb2FkTG9nRmlsZVJlcXVlc3QaIi5sYXBwLndlYi52MS5VcGxvYWRMb2dGaWxlUmVzcG9uc2USVgoNRGVsZXRlTG9nRmlsZRIhLmxhcHAud2ViLnYxLkRlbGV0ZUxvZ0ZpbGVSZXF1ZXN0GiIubGFwcC53ZWIudjEuRGVsZXRlTG9nRmlsZVJlc3BvbnNlElwKD0NyZWF0ZUltcG9ydFJ1bhIjLmxhcHAud2ViLnYxLkNyZWF0ZUltcG9ydFJ1blJlcXVlc3QaJC5sYXBwLndlYi52MS5DcmVhdGVJbXBvcnRSdW5SZXNwb25zZRJTCgxHZXRJbXBvcnRSdW4SIC5sYXBwLndlYi52MS5HZXRJbXBvcnRSdW5SZXF1ZXN0GiEubGFwcC53ZWIudjEuR2V0SW1wb3J0UnVuUmVzcG9uc2USWQoOTGlzdEltcG9ydFJ1bnMSIi5sYXBwLndlYi52MS5MaXN0SW1wb3J0UnVuc1JlcXVlc3QaIy5sYXBwLndlYi52MS5MaXN0SW1wb3J0UnVuc1Jlc3BvbnNlEnQKF0xpc3RSZWNlbnRJbXBvcnRRdWVyaWVzEisubGFwcC53ZWIudjEuTGlzdFJlY2VudEltcG9ydFF1ZXJpZXNSZXF1ZXN0GiwubGFwcC53ZWIudjEuTGlzdFJlY2VudEltcG9ydFF1ZXJpZXNSZXNwb25zZRJlChJDcmVhdGVEaXNjb3ZlcnlSdW4SJi5sYXBwLndlYi52MS5DcmVhdGVEaXNjb3ZlcnlSdW5SZXF1ZXN0GicubGFwcC53ZWIudjEuQ3JlYXRlRGlzY292ZXJ5UnVuUmVzcG9uc2USXAoPR2V0RGlzY292ZXJ5UnVuEiMubGFwcC53ZWIudjEuR2V0RGlzY292ZXJ5UnVuUmVxdWVzdBokLmxhcHAud2ViLnYxLkdldERpc2NvdmVyeVJ1blJlc3BvbnNlEmIKEUxpc3REaXNjb3ZlcnlSdW5zEiUubGFwcC53ZWIudjEuTGlzdERpc2NvdmVyeVJ1bnNSZXF1ZXN0GiYubGFwcC53ZWIudjEuTGlzdERpc2NvdmVyeVJ1bnNSZXNwb25zZRJTCgxMaXN0UGF0dGVybnMSIC5sYXBwLndlYi52MS5MaXN0UGF0dGVybnNSZXF1ZXN0GiEubGFwcC53ZWIudjEuTGlzdFBhdHRlcm5zUmVzcG9uc2USTQoKR2V0UGF0dGVybhIeLmxhcHAud2ViLnYxLkdldFBhdHRlcm5SZXF1ZXN0Gh8ubGFwcC53ZWIudjEuR2V0UGF0dGVyblJlc3BvbnNlElYKDUdldEVycm9yc1ZpZXcSIS5sYXBwLndlYi52MS5HZXRFcnJvcnNWaWV3UmVxdWVzdBoiLmxhcHAud2ViLnYxLkdldEVycm9yc1ZpZXdSZXNwb25zZUIwWi5naXRodWIuY29tL3N0cnJsL2xhcHAvZ2VuL2dvL2xhcHAvd2ViL3YxO3dlYnYxYgZwcm90bzM", [file_google_protobuf_timestamp]); /** * @generated from message lapp.web.v1.Workspace @@ -93,6 +93,115 @@ export type LogFile = Message<"lapp.web.v1.LogFile"> & { export const LogFileSchema: GenMessage = /*@__PURE__*/ messageDesc(file_lapp_web_v1_web, 1); +/** + * @generated from message lapp.web.v1.ImportRun + */ +export type ImportRun = Message<"lapp.web.v1.ImportRun"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string import_run_id = 2; + */ + importRunId: string; + + /** + * @generated from field: string provider = 3; + */ + provider: string; + + /** + * @generated from field: string project = 4; + */ + project: string; + + /** + * @generated from field: string filter = 5; + */ + filter: string; + + /** + * @generated from field: google.protobuf.Timestamp from = 6; + */ + from?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp to = 7; + */ + to?: Timestamp | undefined; + + /** + * @generated from field: int32 limit = 8; + */ + limit: number; + + /** + * @generated from field: lapp.web.v1.ImportRunState state = 9; + */ + state: ImportRunState; + + /** + * @generated from field: int32 entry_count = 10; + */ + entryCount: number; + + /** + * @generated from field: bool truncated = 11; + */ + truncated: boolean; + + /** + * @generated from field: string log_file_name = 12; + */ + logFileName: string; + + /** + * @generated from field: google.protobuf.Timestamp started_at = 13; + */ + startedAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp finished_at = 14; + */ + finishedAt?: Timestamp | undefined; + + /** + * @generated from field: lapp.web.v1.ImportRunError error = 15; + */ + error?: ImportRunError | undefined; +}; + +/** + * Describes the message lapp.web.v1.ImportRun. + * Use `create(ImportRunSchema)` to create a new message. + */ +export const ImportRunSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 2); + +/** + * @generated from message lapp.web.v1.ImportRunError + */ +export type ImportRunError = Message<"lapp.web.v1.ImportRunError"> & { + /** + * @generated from field: string code = 1; + */ + code: string; + + /** + * @generated from field: string message = 2; + */ + message: string; +}; + +/** + * Describes the message lapp.web.v1.ImportRunError. + * Use `create(ImportRunErrorSchema)` to create a new message. + */ +export const ImportRunErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 3); + /** * @generated from message lapp.web.v1.DiscoveryRun */ @@ -170,7 +279,7 @@ export type DiscoveryRun = Message<"lapp.web.v1.DiscoveryRun"> & { * Use `create(DiscoveryRunSchema)` to create a new message. */ export const DiscoveryRunSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 2); + messageDesc(file_lapp_web_v1_web, 4); /** * @generated from message lapp.web.v1.DiscoveryRunProgress @@ -192,7 +301,7 @@ export type DiscoveryRunProgress = Message<"lapp.web.v1.DiscoveryRunProgress"> & * Use `create(DiscoveryRunProgressSchema)` to create a new message. */ export const DiscoveryRunProgressSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 3); + messageDesc(file_lapp_web_v1_web, 5); /** * @generated from message lapp.web.v1.DiscoveryLabelBatchProgress @@ -239,7 +348,7 @@ export type DiscoveryLabelBatchProgress = Message<"lapp.web.v1.DiscoveryLabelBat * Use `create(DiscoveryLabelBatchProgressSchema)` to create a new message. */ export const DiscoveryLabelBatchProgressSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 4); + messageDesc(file_lapp_web_v1_web, 6); /** * @generated from message lapp.web.v1.DiscoveryRunError @@ -266,7 +375,7 @@ export type DiscoveryRunError = Message<"lapp.web.v1.DiscoveryRunError"> & { * Use `create(DiscoveryRunErrorSchema)` to create a new message. */ export const DiscoveryRunErrorSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 5); + messageDesc(file_lapp_web_v1_web, 7); /** * @generated from message lapp.web.v1.Pattern @@ -328,7 +437,7 @@ export type Pattern = Message<"lapp.web.v1.Pattern"> & { * Use `create(PatternSchema)` to create a new message. */ export const PatternSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 6); + messageDesc(file_lapp_web_v1_web, 8); /** * @generated from message lapp.web.v1.LineRef @@ -350,7 +459,7 @@ export type LineRef = Message<"lapp.web.v1.LineRef"> & { * Use `create(LineRefSchema)` to create a new message. */ export const LineRefSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 7); + messageDesc(file_lapp_web_v1_web, 9); /** * @generated from message lapp.web.v1.ErrorPattern @@ -367,7 +476,7 @@ export type ErrorPattern = Message<"lapp.web.v1.ErrorPattern"> & { * Use `create(ErrorPatternSchema)` to create a new message. */ export const ErrorPatternSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 8); + messageDesc(file_lapp_web_v1_web, 10); /** * @generated from message lapp.web.v1.UnmatchedErrorLine @@ -394,7 +503,7 @@ export type UnmatchedErrorLine = Message<"lapp.web.v1.UnmatchedErrorLine"> & { * Use `create(UnmatchedErrorLineSchema)` to create a new message. */ export const UnmatchedErrorLineSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 9); + messageDesc(file_lapp_web_v1_web, 11); /** * @generated from message lapp.web.v1.ListWorkspacesRequest @@ -407,7 +516,7 @@ export type ListWorkspacesRequest = Message<"lapp.web.v1.ListWorkspacesRequest"> * Use `create(ListWorkspacesRequestSchema)` to create a new message. */ export const ListWorkspacesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 10); + messageDesc(file_lapp_web_v1_web, 12); /** * @generated from message lapp.web.v1.ListWorkspacesResponse @@ -424,7 +533,7 @@ export type ListWorkspacesResponse = Message<"lapp.web.v1.ListWorkspacesResponse * Use `create(ListWorkspacesResponseSchema)` to create a new message. */ export const ListWorkspacesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 11); + messageDesc(file_lapp_web_v1_web, 13); /** * @generated from message lapp.web.v1.GetWorkspaceRequest @@ -441,7 +550,7 @@ export type GetWorkspaceRequest = Message<"lapp.web.v1.GetWorkspaceRequest"> & { * Use `create(GetWorkspaceRequestSchema)` to create a new message. */ export const GetWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 12); + messageDesc(file_lapp_web_v1_web, 14); /** * @generated from message lapp.web.v1.GetWorkspaceResponse @@ -458,7 +567,7 @@ export type GetWorkspaceResponse = Message<"lapp.web.v1.GetWorkspaceResponse"> & * Use `create(GetWorkspaceResponseSchema)` to create a new message. */ export const GetWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 13); + messageDesc(file_lapp_web_v1_web, 15); /** * @generated from message lapp.web.v1.CreateWorkspaceRequest @@ -475,7 +584,7 @@ export type CreateWorkspaceRequest = Message<"lapp.web.v1.CreateWorkspaceRequest * Use `create(CreateWorkspaceRequestSchema)` to create a new message. */ export const CreateWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 14); + messageDesc(file_lapp_web_v1_web, 16); /** * @generated from message lapp.web.v1.CreateWorkspaceResponse @@ -492,7 +601,7 @@ export type CreateWorkspaceResponse = Message<"lapp.web.v1.CreateWorkspaceRespon * Use `create(CreateWorkspaceResponseSchema)` to create a new message. */ export const CreateWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 15); + messageDesc(file_lapp_web_v1_web, 17); /** * @generated from message lapp.web.v1.DeleteWorkspaceRequest @@ -509,7 +618,7 @@ export type DeleteWorkspaceRequest = Message<"lapp.web.v1.DeleteWorkspaceRequest * Use `create(DeleteWorkspaceRequestSchema)` to create a new message. */ export const DeleteWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 16); + messageDesc(file_lapp_web_v1_web, 18); /** * @generated from message lapp.web.v1.DeleteWorkspaceResponse @@ -522,7 +631,7 @@ export type DeleteWorkspaceResponse = Message<"lapp.web.v1.DeleteWorkspaceRespon * Use `create(DeleteWorkspaceResponseSchema)` to create a new message. */ export const DeleteWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 17); + messageDesc(file_lapp_web_v1_web, 19); /** * @generated from message lapp.web.v1.ListLogFilesRequest @@ -539,7 +648,7 @@ export type ListLogFilesRequest = Message<"lapp.web.v1.ListLogFilesRequest"> & { * Use `create(ListLogFilesRequestSchema)` to create a new message. */ export const ListLogFilesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 18); + messageDesc(file_lapp_web_v1_web, 20); /** * @generated from message lapp.web.v1.ListLogFilesResponse @@ -556,7 +665,7 @@ export type ListLogFilesResponse = Message<"lapp.web.v1.ListLogFilesResponse"> & * Use `create(ListLogFilesResponseSchema)` to create a new message. */ export const ListLogFilesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 19); + messageDesc(file_lapp_web_v1_web, 21); /** * @generated from message lapp.web.v1.UploadLogFileRequest @@ -583,7 +692,7 @@ export type UploadLogFileRequest = Message<"lapp.web.v1.UploadLogFileRequest"> & * Use `create(UploadLogFileRequestSchema)` to create a new message. */ export const UploadLogFileRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 20); + messageDesc(file_lapp_web_v1_web, 22); /** * @generated from message lapp.web.v1.UploadLogFileResponse @@ -600,7 +709,7 @@ export type UploadLogFileResponse = Message<"lapp.web.v1.UploadLogFileResponse"> * Use `create(UploadLogFileResponseSchema)` to create a new message. */ export const UploadLogFileResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 21); + messageDesc(file_lapp_web_v1_web, 23); /** * @generated from message lapp.web.v1.DeleteLogFileRequest @@ -617,7 +726,7 @@ export type DeleteLogFileRequest = Message<"lapp.web.v1.DeleteLogFileRequest"> & * Use `create(DeleteLogFileRequestSchema)` to create a new message. */ export const DeleteLogFileRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 22); + messageDesc(file_lapp_web_v1_web, 24); /** * @generated from message lapp.web.v1.DeleteLogFileResponse @@ -630,7 +739,191 @@ export type DeleteLogFileResponse = Message<"lapp.web.v1.DeleteLogFileResponse"> * Use `create(DeleteLogFileResponseSchema)` to create a new message. */ export const DeleteLogFileResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 23); + messageDesc(file_lapp_web_v1_web, 25); + +/** + * @generated from message lapp.web.v1.CreateImportRunRequest + */ +export type CreateImportRunRequest = Message<"lapp.web.v1.CreateImportRunRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; + + /** + * @generated from field: string project = 2; + */ + project: string; + + /** + * @generated from field: string filter = 3; + */ + filter: string; + + /** + * @generated from field: google.protobuf.Timestamp from = 4; + */ + from?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp to = 5; + */ + to?: Timestamp | undefined; + + /** + * @generated from field: int32 limit = 6; + */ + limit: number; +}; + +/** + * Describes the message lapp.web.v1.CreateImportRunRequest. + * Use `create(CreateImportRunRequestSchema)` to create a new message. + */ +export const CreateImportRunRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 26); + +/** + * @generated from message lapp.web.v1.CreateImportRunResponse + */ +export type CreateImportRunResponse = Message<"lapp.web.v1.CreateImportRunResponse"> & { + /** + * @generated from field: lapp.web.v1.ImportRun import_run = 1; + */ + importRun?: ImportRun | undefined; +}; + +/** + * Describes the message lapp.web.v1.CreateImportRunResponse. + * Use `create(CreateImportRunResponseSchema)` to create a new message. + */ +export const CreateImportRunResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 27); + +/** + * @generated from message lapp.web.v1.GetImportRunRequest + */ +export type GetImportRunRequest = Message<"lapp.web.v1.GetImportRunRequest"> & { + /** + * @generated from field: string name = 1; + */ + name: string; +}; + +/** + * Describes the message lapp.web.v1.GetImportRunRequest. + * Use `create(GetImportRunRequestSchema)` to create a new message. + */ +export const GetImportRunRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 28); + +/** + * @generated from message lapp.web.v1.GetImportRunResponse + */ +export type GetImportRunResponse = Message<"lapp.web.v1.GetImportRunResponse"> & { + /** + * @generated from field: lapp.web.v1.ImportRun import_run = 1; + */ + importRun?: ImportRun | undefined; +}; + +/** + * Describes the message lapp.web.v1.GetImportRunResponse. + * Use `create(GetImportRunResponseSchema)` to create a new message. + */ +export const GetImportRunResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 29); + +/** + * @generated from message lapp.web.v1.ListImportRunsRequest + */ +export type ListImportRunsRequest = Message<"lapp.web.v1.ListImportRunsRequest"> & { + /** + * @generated from field: string parent = 1; + */ + parent: string; +}; + +/** + * Describes the message lapp.web.v1.ListImportRunsRequest. + * Use `create(ListImportRunsRequestSchema)` to create a new message. + */ +export const ListImportRunsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 30); + +/** + * @generated from message lapp.web.v1.ListImportRunsResponse + */ +export type ListImportRunsResponse = Message<"lapp.web.v1.ListImportRunsResponse"> & { + /** + * @generated from field: repeated lapp.web.v1.ImportRun import_runs = 1; + */ + importRuns: ImportRun[]; +}; + +/** + * Describes the message lapp.web.v1.ListImportRunsResponse. + * Use `create(ListImportRunsResponseSchema)` to create a new message. + */ +export const ListImportRunsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 31); + +/** + * @generated from message lapp.web.v1.ListRecentImportQueriesRequest + */ +export type ListRecentImportQueriesRequest = Message<"lapp.web.v1.ListRecentImportQueriesRequest"> & { +}; + +/** + * Describes the message lapp.web.v1.ListRecentImportQueriesRequest. + * Use `create(ListRecentImportQueriesRequestSchema)` to create a new message. + */ +export const ListRecentImportQueriesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 32); + +/** + * @generated from message lapp.web.v1.RecentImportQuery + */ +export type RecentImportQuery = Message<"lapp.web.v1.RecentImportQuery"> & { + /** + * @generated from field: string project = 1; + */ + project: string; + + /** + * @generated from field: string filter = 2; + */ + filter: string; + + /** + * @generated from field: google.protobuf.Timestamp last_used_at = 3; + */ + lastUsedAt?: Timestamp | undefined; +}; + +/** + * Describes the message lapp.web.v1.RecentImportQuery. + * Use `create(RecentImportQuerySchema)` to create a new message. + */ +export const RecentImportQuerySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 33); + +/** + * @generated from message lapp.web.v1.ListRecentImportQueriesResponse + */ +export type ListRecentImportQueriesResponse = Message<"lapp.web.v1.ListRecentImportQueriesResponse"> & { + /** + * @generated from field: repeated lapp.web.v1.RecentImportQuery recent_queries = 1; + */ + recentQueries: RecentImportQuery[]; +}; + +/** + * Describes the message lapp.web.v1.ListRecentImportQueriesResponse. + * Use `create(ListRecentImportQueriesResponseSchema)` to create a new message. + */ +export const ListRecentImportQueriesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_lapp_web_v1_web, 34); /** * @generated from message lapp.web.v1.CreateDiscoveryRunRequest @@ -652,7 +945,7 @@ export type CreateDiscoveryRunRequest = Message<"lapp.web.v1.CreateDiscoveryRunR * Use `create(CreateDiscoveryRunRequestSchema)` to create a new message. */ export const CreateDiscoveryRunRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 24); + messageDesc(file_lapp_web_v1_web, 35); /** * @generated from message lapp.web.v1.CreateDiscoveryRunResponse @@ -669,7 +962,7 @@ export type CreateDiscoveryRunResponse = Message<"lapp.web.v1.CreateDiscoveryRun * Use `create(CreateDiscoveryRunResponseSchema)` to create a new message. */ export const CreateDiscoveryRunResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 25); + messageDesc(file_lapp_web_v1_web, 36); /** * @generated from message lapp.web.v1.GetDiscoveryRunRequest @@ -686,7 +979,7 @@ export type GetDiscoveryRunRequest = Message<"lapp.web.v1.GetDiscoveryRunRequest * Use `create(GetDiscoveryRunRequestSchema)` to create a new message. */ export const GetDiscoveryRunRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 26); + messageDesc(file_lapp_web_v1_web, 37); /** * @generated from message lapp.web.v1.GetDiscoveryRunResponse @@ -703,7 +996,7 @@ export type GetDiscoveryRunResponse = Message<"lapp.web.v1.GetDiscoveryRunRespon * Use `create(GetDiscoveryRunResponseSchema)` to create a new message. */ export const GetDiscoveryRunResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 27); + messageDesc(file_lapp_web_v1_web, 38); /** * @generated from message lapp.web.v1.ListDiscoveryRunsRequest @@ -720,7 +1013,7 @@ export type ListDiscoveryRunsRequest = Message<"lapp.web.v1.ListDiscoveryRunsReq * Use `create(ListDiscoveryRunsRequestSchema)` to create a new message. */ export const ListDiscoveryRunsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 28); + messageDesc(file_lapp_web_v1_web, 39); /** * @generated from message lapp.web.v1.ListDiscoveryRunsResponse @@ -737,7 +1030,7 @@ export type ListDiscoveryRunsResponse = Message<"lapp.web.v1.ListDiscoveryRunsRe * Use `create(ListDiscoveryRunsResponseSchema)` to create a new message. */ export const ListDiscoveryRunsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 29); + messageDesc(file_lapp_web_v1_web, 40); /** * @generated from message lapp.web.v1.ListPatternsRequest @@ -754,7 +1047,7 @@ export type ListPatternsRequest = Message<"lapp.web.v1.ListPatternsRequest"> & { * Use `create(ListPatternsRequestSchema)` to create a new message. */ export const ListPatternsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 30); + messageDesc(file_lapp_web_v1_web, 41); /** * @generated from message lapp.web.v1.ListPatternsResponse @@ -771,7 +1064,7 @@ export type ListPatternsResponse = Message<"lapp.web.v1.ListPatternsResponse"> & * Use `create(ListPatternsResponseSchema)` to create a new message. */ export const ListPatternsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 31); + messageDesc(file_lapp_web_v1_web, 42); /** * @generated from message lapp.web.v1.GetPatternRequest @@ -788,7 +1081,7 @@ export type GetPatternRequest = Message<"lapp.web.v1.GetPatternRequest"> & { * Use `create(GetPatternRequestSchema)` to create a new message. */ export const GetPatternRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 32); + messageDesc(file_lapp_web_v1_web, 43); /** * @generated from message lapp.web.v1.GetPatternResponse @@ -805,7 +1098,7 @@ export type GetPatternResponse = Message<"lapp.web.v1.GetPatternResponse"> & { * Use `create(GetPatternResponseSchema)` to create a new message. */ export const GetPatternResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 33); + messageDesc(file_lapp_web_v1_web, 44); /** * @generated from message lapp.web.v1.GetErrorsViewRequest @@ -822,7 +1115,7 @@ export type GetErrorsViewRequest = Message<"lapp.web.v1.GetErrorsViewRequest"> & * Use `create(GetErrorsViewRequestSchema)` to create a new message. */ export const GetErrorsViewRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 34); + messageDesc(file_lapp_web_v1_web, 45); /** * @generated from message lapp.web.v1.GetErrorsViewResponse @@ -844,7 +1137,7 @@ export type GetErrorsViewResponse = Message<"lapp.web.v1.GetErrorsViewResponse"> * Use `create(GetErrorsViewResponseSchema)` to create a new message. */ export const GetErrorsViewResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_lapp_web_v1_web, 35); + messageDesc(file_lapp_web_v1_web, 46); /** * @generated from enum lapp.web.v1.WorkspaceStatus @@ -882,6 +1175,42 @@ export enum WorkspaceStatus { export const WorkspaceStatusSchema: GenEnum = /*@__PURE__*/ enumDesc(file_lapp_web_v1_web, 0); +/** + * @generated from enum lapp.web.v1.ImportRunState + */ +export enum ImportRunState { + /** + * @generated from enum value: IMPORT_RUN_STATE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: IMPORT_RUN_STATE_QUEUED = 1; + */ + QUEUED = 1, + + /** + * @generated from enum value: IMPORT_RUN_STATE_RUNNING = 2; + */ + RUNNING = 2, + + /** + * @generated from enum value: IMPORT_RUN_STATE_SUCCEEDED = 3; + */ + SUCCEEDED = 3, + + /** + * @generated from enum value: IMPORT_RUN_STATE_FAILED = 4; + */ + FAILED = 4, +} + +/** + * Describes the enum lapp.web.v1.ImportRunState. + */ +export const ImportRunStateSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_lapp_web_v1_web, 1); + /** * @generated from enum lapp.web.v1.DiscoveryRunState */ @@ -916,7 +1245,7 @@ export enum DiscoveryRunState { * Describes the enum lapp.web.v1.DiscoveryRunState. */ export const DiscoveryRunStateSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_lapp_web_v1_web, 1); + enumDesc(file_lapp_web_v1_web, 2); /** * @generated from enum lapp.web.v1.DiscoveryStep @@ -957,7 +1286,7 @@ export enum DiscoveryStep { * Describes the enum lapp.web.v1.DiscoveryStep. */ export const DiscoveryStepSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_lapp_web_v1_web, 2); + enumDesc(file_lapp_web_v1_web, 3); /** * @generated from service lapp.web.v1.WorkspaceService @@ -1019,6 +1348,38 @@ export const WorkspaceService: GenService<{ input: typeof DeleteLogFileRequestSchema; output: typeof DeleteLogFileResponseSchema; }, + /** + * @generated from rpc lapp.web.v1.WorkspaceService.CreateImportRun + */ + createImportRun: { + methodKind: "unary"; + input: typeof CreateImportRunRequestSchema; + output: typeof CreateImportRunResponseSchema; + }, + /** + * @generated from rpc lapp.web.v1.WorkspaceService.GetImportRun + */ + getImportRun: { + methodKind: "unary"; + input: typeof GetImportRunRequestSchema; + output: typeof GetImportRunResponseSchema; + }, + /** + * @generated from rpc lapp.web.v1.WorkspaceService.ListImportRuns + */ + listImportRuns: { + methodKind: "unary"; + input: typeof ListImportRunsRequestSchema; + output: typeof ListImportRunsResponseSchema; + }, + /** + * @generated from rpc lapp.web.v1.WorkspaceService.ListRecentImportQueries + */ + listRecentImportQueries: { + methodKind: "unary"; + input: typeof ListRecentImportQueriesRequestSchema; + output: typeof ListRecentImportQueriesResponseSchema; + }, /** * @generated from rpc lapp.web.v1.WorkspaceService.CreateDiscoveryRun */ diff --git a/gen/go/lapp/web/v1/web.pb.go b/gen/go/lapp/web/v1/web.pb.go index 1e461b1..98349a8 100644 --- a/gen/go/lapp/web/v1/web.pb.go +++ b/gen/go/lapp/web/v1/web.pb.go @@ -77,6 +77,61 @@ func (WorkspaceStatus) EnumDescriptor() ([]byte, []int) { return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{0} } +type ImportRunState int32 + +const ( + ImportRunState_IMPORT_RUN_STATE_UNSPECIFIED ImportRunState = 0 + ImportRunState_IMPORT_RUN_STATE_QUEUED ImportRunState = 1 + ImportRunState_IMPORT_RUN_STATE_RUNNING ImportRunState = 2 + ImportRunState_IMPORT_RUN_STATE_SUCCEEDED ImportRunState = 3 + ImportRunState_IMPORT_RUN_STATE_FAILED ImportRunState = 4 +) + +// Enum value maps for ImportRunState. +var ( + ImportRunState_name = map[int32]string{ + 0: "IMPORT_RUN_STATE_UNSPECIFIED", + 1: "IMPORT_RUN_STATE_QUEUED", + 2: "IMPORT_RUN_STATE_RUNNING", + 3: "IMPORT_RUN_STATE_SUCCEEDED", + 4: "IMPORT_RUN_STATE_FAILED", + } + ImportRunState_value = map[string]int32{ + "IMPORT_RUN_STATE_UNSPECIFIED": 0, + "IMPORT_RUN_STATE_QUEUED": 1, + "IMPORT_RUN_STATE_RUNNING": 2, + "IMPORT_RUN_STATE_SUCCEEDED": 3, + "IMPORT_RUN_STATE_FAILED": 4, + } +) + +func (x ImportRunState) Enum() *ImportRunState { + p := new(ImportRunState) + *p = x + return p +} + +func (x ImportRunState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ImportRunState) Descriptor() protoreflect.EnumDescriptor { + return file_lapp_web_v1_web_proto_enumTypes[1].Descriptor() +} + +func (ImportRunState) Type() protoreflect.EnumType { + return &file_lapp_web_v1_web_proto_enumTypes[1] +} + +func (x ImportRunState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ImportRunState.Descriptor instead. +func (ImportRunState) EnumDescriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{1} +} + type DiscoveryRunState int32 const ( @@ -116,11 +171,11 @@ func (x DiscoveryRunState) String() string { } func (DiscoveryRunState) Descriptor() protoreflect.EnumDescriptor { - return file_lapp_web_v1_web_proto_enumTypes[1].Descriptor() + return file_lapp_web_v1_web_proto_enumTypes[2].Descriptor() } func (DiscoveryRunState) Type() protoreflect.EnumType { - return &file_lapp_web_v1_web_proto_enumTypes[1] + return &file_lapp_web_v1_web_proto_enumTypes[2] } func (x DiscoveryRunState) Number() protoreflect.EnumNumber { @@ -129,7 +184,7 @@ func (x DiscoveryRunState) Number() protoreflect.EnumNumber { // Deprecated: Use DiscoveryRunState.Descriptor instead. func (DiscoveryRunState) EnumDescriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{1} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{2} } type DiscoveryStep int32 @@ -174,11 +229,11 @@ func (x DiscoveryStep) String() string { } func (DiscoveryStep) Descriptor() protoreflect.EnumDescriptor { - return file_lapp_web_v1_web_proto_enumTypes[2].Descriptor() + return file_lapp_web_v1_web_proto_enumTypes[3].Descriptor() } func (DiscoveryStep) Type() protoreflect.EnumType { - return &file_lapp_web_v1_web_proto_enumTypes[2] + return &file_lapp_web_v1_web_proto_enumTypes[3] } func (x DiscoveryStep) Number() protoreflect.EnumNumber { @@ -187,7 +242,7 @@ func (x DiscoveryStep) Number() protoreflect.EnumNumber { // Deprecated: Use DiscoveryStep.Descriptor instead. func (DiscoveryStep) EnumDescriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{2} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{3} } type Workspace struct { @@ -350,6 +405,214 @@ func (x *LogFile) GetUpdatedAt() *timestamppb.Timestamp { return nil } +type ImportRun struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ImportRunId string `protobuf:"bytes,2,opt,name=import_run_id,json=importRunId,proto3" json:"import_run_id,omitempty"` + Provider string `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"` + Project string `protobuf:"bytes,4,opt,name=project,proto3" json:"project,omitempty"` + Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` + From *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=from,proto3" json:"from,omitempty"` + To *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=to,proto3" json:"to,omitempty"` + Limit int32 `protobuf:"varint,8,opt,name=limit,proto3" json:"limit,omitempty"` + State ImportRunState `protobuf:"varint,9,opt,name=state,proto3,enum=lapp.web.v1.ImportRunState" json:"state,omitempty"` + EntryCount int32 `protobuf:"varint,10,opt,name=entry_count,json=entryCount,proto3" json:"entry_count,omitempty"` + Truncated bool `protobuf:"varint,11,opt,name=truncated,proto3" json:"truncated,omitempty"` + LogFileName string `protobuf:"bytes,12,opt,name=log_file_name,json=logFileName,proto3" json:"log_file_name,omitempty"` + StartedAt *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + FinishedAt *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=finished_at,json=finishedAt,proto3" json:"finished_at,omitempty"` + Error *ImportRunError `protobuf:"bytes,15,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ImportRun) Reset() { + *x = ImportRun{} + mi := &file_lapp_web_v1_web_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ImportRun) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportRun) ProtoMessage() {} + +func (x *ImportRun) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportRun.ProtoReflect.Descriptor instead. +func (*ImportRun) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{2} +} + +func (x *ImportRun) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ImportRun) GetImportRunId() string { + if x != nil { + return x.ImportRunId + } + return "" +} + +func (x *ImportRun) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *ImportRun) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *ImportRun) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *ImportRun) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *ImportRun) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +func (x *ImportRun) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ImportRun) GetState() ImportRunState { + if x != nil { + return x.State + } + return ImportRunState_IMPORT_RUN_STATE_UNSPECIFIED +} + +func (x *ImportRun) GetEntryCount() int32 { + if x != nil { + return x.EntryCount + } + return 0 +} + +func (x *ImportRun) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +func (x *ImportRun) GetLogFileName() string { + if x != nil { + return x.LogFileName + } + return "" +} + +func (x *ImportRun) GetStartedAt() *timestamppb.Timestamp { + if x != nil { + return x.StartedAt + } + return nil +} + +func (x *ImportRun) GetFinishedAt() *timestamppb.Timestamp { + if x != nil { + return x.FinishedAt + } + return nil +} + +func (x *ImportRun) GetError() *ImportRunError { + if x != nil { + return x.Error + } + return nil +} + +type ImportRunError struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ImportRunError) Reset() { + *x = ImportRunError{} + mi := &file_lapp_web_v1_web_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ImportRunError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportRunError) ProtoMessage() {} + +func (x *ImportRunError) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportRunError.ProtoReflect.Descriptor instead. +func (*ImportRunError) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{3} +} + +func (x *ImportRunError) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *ImportRunError) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + type DiscoveryRun struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -373,7 +636,7 @@ type DiscoveryRun struct { func (x *DiscoveryRun) Reset() { *x = DiscoveryRun{} - mi := &file_lapp_web_v1_web_proto_msgTypes[2] + mi := &file_lapp_web_v1_web_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -385,7 +648,7 @@ func (x *DiscoveryRun) String() string { func (*DiscoveryRun) ProtoMessage() {} func (x *DiscoveryRun) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[2] + mi := &file_lapp_web_v1_web_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -398,7 +661,7 @@ func (x *DiscoveryRun) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoveryRun.ProtoReflect.Descriptor instead. func (*DiscoveryRun) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{2} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{4} } func (x *DiscoveryRun) GetName() string { @@ -504,7 +767,7 @@ type DiscoveryRunProgress struct { func (x *DiscoveryRunProgress) Reset() { *x = DiscoveryRunProgress{} - mi := &file_lapp_web_v1_web_proto_msgTypes[3] + mi := &file_lapp_web_v1_web_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -516,7 +779,7 @@ func (x *DiscoveryRunProgress) String() string { func (*DiscoveryRunProgress) ProtoMessage() {} func (x *DiscoveryRunProgress) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[3] + mi := &file_lapp_web_v1_web_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -529,7 +792,7 @@ func (x *DiscoveryRunProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoveryRunProgress.ProtoReflect.Descriptor instead. func (*DiscoveryRunProgress) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{3} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{5} } func (x *DiscoveryRunProgress) GetStep() DiscoveryStep { @@ -561,7 +824,7 @@ type DiscoveryLabelBatchProgress struct { func (x *DiscoveryLabelBatchProgress) Reset() { *x = DiscoveryLabelBatchProgress{} - mi := &file_lapp_web_v1_web_proto_msgTypes[4] + mi := &file_lapp_web_v1_web_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +836,7 @@ func (x *DiscoveryLabelBatchProgress) String() string { func (*DiscoveryLabelBatchProgress) ProtoMessage() {} func (x *DiscoveryLabelBatchProgress) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[4] + mi := &file_lapp_web_v1_web_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +849,7 @@ func (x *DiscoveryLabelBatchProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoveryLabelBatchProgress.ProtoReflect.Descriptor instead. func (*DiscoveryLabelBatchProgress) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{4} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{6} } func (x *DiscoveryLabelBatchProgress) GetEvent() string { @@ -649,7 +912,7 @@ type DiscoveryRunError struct { func (x *DiscoveryRunError) Reset() { *x = DiscoveryRunError{} - mi := &file_lapp_web_v1_web_proto_msgTypes[5] + mi := &file_lapp_web_v1_web_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -661,7 +924,7 @@ func (x *DiscoveryRunError) String() string { func (*DiscoveryRunError) ProtoMessage() {} func (x *DiscoveryRunError) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[5] + mi := &file_lapp_web_v1_web_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -674,7 +937,7 @@ func (x *DiscoveryRunError) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoveryRunError.ProtoReflect.Descriptor instead. func (*DiscoveryRunError) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{5} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{7} } func (x *DiscoveryRunError) GetCode() string { @@ -716,7 +979,7 @@ type Pattern struct { func (x *Pattern) Reset() { *x = Pattern{} - mi := &file_lapp_web_v1_web_proto_msgTypes[6] + mi := &file_lapp_web_v1_web_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -728,7 +991,7 @@ func (x *Pattern) String() string { func (*Pattern) ProtoMessage() {} func (x *Pattern) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[6] + mi := &file_lapp_web_v1_web_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -741,7 +1004,7 @@ func (x *Pattern) ProtoReflect() protoreflect.Message { // Deprecated: Use Pattern.ProtoReflect.Descriptor instead. func (*Pattern) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{6} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{8} } func (x *Pattern) GetName() string { @@ -824,7 +1087,7 @@ type LineRef struct { func (x *LineRef) Reset() { *x = LineRef{} - mi := &file_lapp_web_v1_web_proto_msgTypes[7] + mi := &file_lapp_web_v1_web_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -836,7 +1099,7 @@ func (x *LineRef) String() string { func (*LineRef) ProtoMessage() {} func (x *LineRef) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[7] + mi := &file_lapp_web_v1_web_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -849,7 +1112,7 @@ func (x *LineRef) ProtoReflect() protoreflect.Message { // Deprecated: Use LineRef.ProtoReflect.Descriptor instead. func (*LineRef) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{7} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{9} } func (x *LineRef) GetFileName() string { @@ -875,7 +1138,7 @@ type ErrorPattern struct { func (x *ErrorPattern) Reset() { *x = ErrorPattern{} - mi := &file_lapp_web_v1_web_proto_msgTypes[8] + mi := &file_lapp_web_v1_web_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -887,7 +1150,7 @@ func (x *ErrorPattern) String() string { func (*ErrorPattern) ProtoMessage() {} func (x *ErrorPattern) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[8] + mi := &file_lapp_web_v1_web_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -900,7 +1163,7 @@ func (x *ErrorPattern) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorPattern.ProtoReflect.Descriptor instead. func (*ErrorPattern) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{8} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{10} } func (x *ErrorPattern) GetPattern() *Pattern { @@ -921,7 +1184,7 @@ type UnmatchedErrorLine struct { func (x *UnmatchedErrorLine) Reset() { *x = UnmatchedErrorLine{} - mi := &file_lapp_web_v1_web_proto_msgTypes[9] + mi := &file_lapp_web_v1_web_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -933,7 +1196,7 @@ func (x *UnmatchedErrorLine) String() string { func (*UnmatchedErrorLine) ProtoMessage() {} func (x *UnmatchedErrorLine) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[9] + mi := &file_lapp_web_v1_web_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -946,7 +1209,7 @@ func (x *UnmatchedErrorLine) ProtoReflect() protoreflect.Message { // Deprecated: Use UnmatchedErrorLine.ProtoReflect.Descriptor instead. func (*UnmatchedErrorLine) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{9} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{11} } func (x *UnmatchedErrorLine) GetFileName() string { @@ -978,7 +1241,7 @@ type ListWorkspacesRequest struct { func (x *ListWorkspacesRequest) Reset() { *x = ListWorkspacesRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[10] + mi := &file_lapp_web_v1_web_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -990,7 +1253,7 @@ func (x *ListWorkspacesRequest) String() string { func (*ListWorkspacesRequest) ProtoMessage() {} func (x *ListWorkspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[10] + mi := &file_lapp_web_v1_web_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1003,7 +1266,7 @@ func (x *ListWorkspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkspacesRequest.ProtoReflect.Descriptor instead. func (*ListWorkspacesRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{10} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{12} } type ListWorkspacesResponse struct { @@ -1015,7 +1278,7 @@ type ListWorkspacesResponse struct { func (x *ListWorkspacesResponse) Reset() { *x = ListWorkspacesResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[11] + mi := &file_lapp_web_v1_web_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1027,7 +1290,7 @@ func (x *ListWorkspacesResponse) String() string { func (*ListWorkspacesResponse) ProtoMessage() {} func (x *ListWorkspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[11] + mi := &file_lapp_web_v1_web_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1040,7 +1303,7 @@ func (x *ListWorkspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkspacesResponse.ProtoReflect.Descriptor instead. func (*ListWorkspacesResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{11} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{13} } func (x *ListWorkspacesResponse) GetWorkspaces() []*Workspace { @@ -1059,7 +1322,7 @@ type GetWorkspaceRequest struct { func (x *GetWorkspaceRequest) Reset() { *x = GetWorkspaceRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[12] + mi := &file_lapp_web_v1_web_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1071,7 +1334,7 @@ func (x *GetWorkspaceRequest) String() string { func (*GetWorkspaceRequest) ProtoMessage() {} func (x *GetWorkspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[12] + mi := &file_lapp_web_v1_web_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1084,7 +1347,7 @@ func (x *GetWorkspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkspaceRequest.ProtoReflect.Descriptor instead. func (*GetWorkspaceRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{12} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{14} } func (x *GetWorkspaceRequest) GetName() string { @@ -1103,7 +1366,7 @@ type GetWorkspaceResponse struct { func (x *GetWorkspaceResponse) Reset() { *x = GetWorkspaceResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[13] + mi := &file_lapp_web_v1_web_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1115,7 +1378,7 @@ func (x *GetWorkspaceResponse) String() string { func (*GetWorkspaceResponse) ProtoMessage() {} func (x *GetWorkspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[13] + mi := &file_lapp_web_v1_web_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1128,7 +1391,7 @@ func (x *GetWorkspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkspaceResponse.ProtoReflect.Descriptor instead. func (*GetWorkspaceResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{13} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{15} } func (x *GetWorkspaceResponse) GetWorkspace() *Workspace { @@ -1147,7 +1410,7 @@ type CreateWorkspaceRequest struct { func (x *CreateWorkspaceRequest) Reset() { *x = CreateWorkspaceRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[14] + mi := &file_lapp_web_v1_web_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1159,7 +1422,7 @@ func (x *CreateWorkspaceRequest) String() string { func (*CreateWorkspaceRequest) ProtoMessage() {} func (x *CreateWorkspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[14] + mi := &file_lapp_web_v1_web_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1172,7 +1435,7 @@ func (x *CreateWorkspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkspaceRequest.ProtoReflect.Descriptor instead. func (*CreateWorkspaceRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{14} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{16} } func (x *CreateWorkspaceRequest) GetWorkspaceId() string { @@ -1191,7 +1454,7 @@ type CreateWorkspaceResponse struct { func (x *CreateWorkspaceResponse) Reset() { *x = CreateWorkspaceResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[15] + mi := &file_lapp_web_v1_web_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1203,7 +1466,7 @@ func (x *CreateWorkspaceResponse) String() string { func (*CreateWorkspaceResponse) ProtoMessage() {} func (x *CreateWorkspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[15] + mi := &file_lapp_web_v1_web_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1216,7 +1479,7 @@ func (x *CreateWorkspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkspaceResponse.ProtoReflect.Descriptor instead. func (*CreateWorkspaceResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{15} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{17} } func (x *CreateWorkspaceResponse) GetWorkspace() *Workspace { @@ -1235,7 +1498,7 @@ type DeleteWorkspaceRequest struct { func (x *DeleteWorkspaceRequest) Reset() { *x = DeleteWorkspaceRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[16] + mi := &file_lapp_web_v1_web_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1247,7 +1510,7 @@ func (x *DeleteWorkspaceRequest) String() string { func (*DeleteWorkspaceRequest) ProtoMessage() {} func (x *DeleteWorkspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[16] + mi := &file_lapp_web_v1_web_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1260,7 +1523,7 @@ func (x *DeleteWorkspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteWorkspaceRequest.ProtoReflect.Descriptor instead. func (*DeleteWorkspaceRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{16} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{18} } func (x *DeleteWorkspaceRequest) GetName() string { @@ -1278,7 +1541,7 @@ type DeleteWorkspaceResponse struct { func (x *DeleteWorkspaceResponse) Reset() { *x = DeleteWorkspaceResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[17] + mi := &file_lapp_web_v1_web_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1290,7 +1553,7 @@ func (x *DeleteWorkspaceResponse) String() string { func (*DeleteWorkspaceResponse) ProtoMessage() {} func (x *DeleteWorkspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[17] + mi := &file_lapp_web_v1_web_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1303,7 +1566,7 @@ func (x *DeleteWorkspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteWorkspaceResponse.ProtoReflect.Descriptor instead. func (*DeleteWorkspaceResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{17} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{19} } type ListLogFilesRequest struct { @@ -1315,7 +1578,7 @@ type ListLogFilesRequest struct { func (x *ListLogFilesRequest) Reset() { *x = ListLogFilesRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[18] + mi := &file_lapp_web_v1_web_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1327,7 +1590,7 @@ func (x *ListLogFilesRequest) String() string { func (*ListLogFilesRequest) ProtoMessage() {} func (x *ListLogFilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[18] + mi := &file_lapp_web_v1_web_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1340,7 +1603,7 @@ func (x *ListLogFilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLogFilesRequest.ProtoReflect.Descriptor instead. func (*ListLogFilesRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{18} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{20} } func (x *ListLogFilesRequest) GetParent() string { @@ -1359,7 +1622,7 @@ type ListLogFilesResponse struct { func (x *ListLogFilesResponse) Reset() { *x = ListLogFilesResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[19] + mi := &file_lapp_web_v1_web_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1371,7 +1634,7 @@ func (x *ListLogFilesResponse) String() string { func (*ListLogFilesResponse) ProtoMessage() {} func (x *ListLogFilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[19] + mi := &file_lapp_web_v1_web_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1384,7 +1647,7 @@ func (x *ListLogFilesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLogFilesResponse.ProtoReflect.Descriptor instead. func (*ListLogFilesResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{19} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{21} } func (x *ListLogFilesResponse) GetLogFiles() []*LogFile { @@ -1405,7 +1668,7 @@ type UploadLogFileRequest struct { func (x *UploadLogFileRequest) Reset() { *x = UploadLogFileRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[20] + mi := &file_lapp_web_v1_web_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1417,7 +1680,7 @@ func (x *UploadLogFileRequest) String() string { func (*UploadLogFileRequest) ProtoMessage() {} func (x *UploadLogFileRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[20] + mi := &file_lapp_web_v1_web_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1430,7 +1693,7 @@ func (x *UploadLogFileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadLogFileRequest.ProtoReflect.Descriptor instead. func (*UploadLogFileRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{20} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{22} } func (x *UploadLogFileRequest) GetParent() string { @@ -1463,7 +1726,7 @@ type UploadLogFileResponse struct { func (x *UploadLogFileResponse) Reset() { *x = UploadLogFileResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[21] + mi := &file_lapp_web_v1_web_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1475,7 +1738,7 @@ func (x *UploadLogFileResponse) String() string { func (*UploadLogFileResponse) ProtoMessage() {} func (x *UploadLogFileResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[21] + mi := &file_lapp_web_v1_web_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1488,7 +1751,7 @@ func (x *UploadLogFileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadLogFileResponse.ProtoReflect.Descriptor instead. func (*UploadLogFileResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{21} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{23} } func (x *UploadLogFileResponse) GetLogFile() *LogFile { @@ -1507,7 +1770,7 @@ type DeleteLogFileRequest struct { func (x *DeleteLogFileRequest) Reset() { *x = DeleteLogFileRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[22] + mi := &file_lapp_web_v1_web_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1519,7 +1782,7 @@ func (x *DeleteLogFileRequest) String() string { func (*DeleteLogFileRequest) ProtoMessage() {} func (x *DeleteLogFileRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[22] + mi := &file_lapp_web_v1_web_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1532,7 +1795,7 @@ func (x *DeleteLogFileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteLogFileRequest.ProtoReflect.Descriptor instead. func (*DeleteLogFileRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{22} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{24} } func (x *DeleteLogFileRequest) GetName() string { @@ -1550,7 +1813,7 @@ type DeleteLogFileResponse struct { func (x *DeleteLogFileResponse) Reset() { *x = DeleteLogFileResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[23] + mi := &file_lapp_web_v1_web_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1562,7 +1825,7 @@ func (x *DeleteLogFileResponse) String() string { func (*DeleteLogFileResponse) ProtoMessage() {} func (x *DeleteLogFileResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[23] + mi := &file_lapp_web_v1_web_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1575,7 +1838,451 @@ func (x *DeleteLogFileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteLogFileResponse.ProtoReflect.Descriptor instead. func (*DeleteLogFileResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{23} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{25} +} + +type CreateImportRunRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` + To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3" json:"to,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateImportRunRequest) Reset() { + *x = CreateImportRunRequest{} + mi := &file_lapp_web_v1_web_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateImportRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateImportRunRequest) ProtoMessage() {} + +func (x *CreateImportRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateImportRunRequest.ProtoReflect.Descriptor instead. +func (*CreateImportRunRequest) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{26} +} + +func (x *CreateImportRunRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +func (x *CreateImportRunRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *CreateImportRunRequest) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *CreateImportRunRequest) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *CreateImportRunRequest) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +func (x *CreateImportRunRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type CreateImportRunResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ImportRun *ImportRun `protobuf:"bytes,1,opt,name=import_run,json=importRun,proto3" json:"import_run,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateImportRunResponse) Reset() { + *x = CreateImportRunResponse{} + mi := &file_lapp_web_v1_web_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateImportRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateImportRunResponse) ProtoMessage() {} + +func (x *CreateImportRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateImportRunResponse.ProtoReflect.Descriptor instead. +func (*CreateImportRunResponse) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{27} +} + +func (x *CreateImportRunResponse) GetImportRun() *ImportRun { + if x != nil { + return x.ImportRun + } + return nil +} + +type GetImportRunRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetImportRunRequest) Reset() { + *x = GetImportRunRequest{} + mi := &file_lapp_web_v1_web_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetImportRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetImportRunRequest) ProtoMessage() {} + +func (x *GetImportRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetImportRunRequest.ProtoReflect.Descriptor instead. +func (*GetImportRunRequest) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{28} +} + +func (x *GetImportRunRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetImportRunResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ImportRun *ImportRun `protobuf:"bytes,1,opt,name=import_run,json=importRun,proto3" json:"import_run,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetImportRunResponse) Reset() { + *x = GetImportRunResponse{} + mi := &file_lapp_web_v1_web_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetImportRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetImportRunResponse) ProtoMessage() {} + +func (x *GetImportRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetImportRunResponse.ProtoReflect.Descriptor instead. +func (*GetImportRunResponse) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{29} +} + +func (x *GetImportRunResponse) GetImportRun() *ImportRun { + if x != nil { + return x.ImportRun + } + return nil +} + +type ListImportRunsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListImportRunsRequest) Reset() { + *x = ListImportRunsRequest{} + mi := &file_lapp_web_v1_web_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListImportRunsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListImportRunsRequest) ProtoMessage() {} + +func (x *ListImportRunsRequest) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListImportRunsRequest.ProtoReflect.Descriptor instead. +func (*ListImportRunsRequest) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{30} +} + +func (x *ListImportRunsRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +type ListImportRunsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ImportRuns []*ImportRun `protobuf:"bytes,1,rep,name=import_runs,json=importRuns,proto3" json:"import_runs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListImportRunsResponse) Reset() { + *x = ListImportRunsResponse{} + mi := &file_lapp_web_v1_web_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListImportRunsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListImportRunsResponse) ProtoMessage() {} + +func (x *ListImportRunsResponse) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListImportRunsResponse.ProtoReflect.Descriptor instead. +func (*ListImportRunsResponse) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{31} +} + +func (x *ListImportRunsResponse) GetImportRuns() []*ImportRun { + if x != nil { + return x.ImportRuns + } + return nil +} + +type ListRecentImportQueriesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRecentImportQueriesRequest) Reset() { + *x = ListRecentImportQueriesRequest{} + mi := &file_lapp_web_v1_web_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRecentImportQueriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRecentImportQueriesRequest) ProtoMessage() {} + +func (x *ListRecentImportQueriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRecentImportQueriesRequest.ProtoReflect.Descriptor instead. +func (*ListRecentImportQueriesRequest) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{32} +} + +type RecentImportQuery struct { + state protoimpl.MessageState `protogen:"open.v1"` + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` + LastUsedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_used_at,json=lastUsedAt,proto3" json:"last_used_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RecentImportQuery) Reset() { + *x = RecentImportQuery{} + mi := &file_lapp_web_v1_web_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RecentImportQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecentImportQuery) ProtoMessage() {} + +func (x *RecentImportQuery) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecentImportQuery.ProtoReflect.Descriptor instead. +func (*RecentImportQuery) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{33} +} + +func (x *RecentImportQuery) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *RecentImportQuery) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *RecentImportQuery) GetLastUsedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastUsedAt + } + return nil +} + +type ListRecentImportQueriesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + RecentQueries []*RecentImportQuery `protobuf:"bytes,1,rep,name=recent_queries,json=recentQueries,proto3" json:"recent_queries,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRecentImportQueriesResponse) Reset() { + *x = ListRecentImportQueriesResponse{} + mi := &file_lapp_web_v1_web_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRecentImportQueriesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRecentImportQueriesResponse) ProtoMessage() {} + +func (x *ListRecentImportQueriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_lapp_web_v1_web_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRecentImportQueriesResponse.ProtoReflect.Descriptor instead. +func (*ListRecentImportQueriesResponse) Descriptor() ([]byte, []int) { + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{34} +} + +func (x *ListRecentImportQueriesResponse) GetRecentQueries() []*RecentImportQuery { + if x != nil { + return x.RecentQueries + } + return nil } type CreateDiscoveryRunRequest struct { @@ -1588,7 +2295,7 @@ type CreateDiscoveryRunRequest struct { func (x *CreateDiscoveryRunRequest) Reset() { *x = CreateDiscoveryRunRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[24] + mi := &file_lapp_web_v1_web_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1600,7 +2307,7 @@ func (x *CreateDiscoveryRunRequest) String() string { func (*CreateDiscoveryRunRequest) ProtoMessage() {} func (x *CreateDiscoveryRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[24] + mi := &file_lapp_web_v1_web_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1613,7 +2320,7 @@ func (x *CreateDiscoveryRunRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDiscoveryRunRequest.ProtoReflect.Descriptor instead. func (*CreateDiscoveryRunRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{24} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{35} } func (x *CreateDiscoveryRunRequest) GetParent() string { @@ -1639,7 +2346,7 @@ type CreateDiscoveryRunResponse struct { func (x *CreateDiscoveryRunResponse) Reset() { *x = CreateDiscoveryRunResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[25] + mi := &file_lapp_web_v1_web_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1651,7 +2358,7 @@ func (x *CreateDiscoveryRunResponse) String() string { func (*CreateDiscoveryRunResponse) ProtoMessage() {} func (x *CreateDiscoveryRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[25] + mi := &file_lapp_web_v1_web_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1664,7 +2371,7 @@ func (x *CreateDiscoveryRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDiscoveryRunResponse.ProtoReflect.Descriptor instead. func (*CreateDiscoveryRunResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{25} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{36} } func (x *CreateDiscoveryRunResponse) GetDiscoveryRun() *DiscoveryRun { @@ -1683,7 +2390,7 @@ type GetDiscoveryRunRequest struct { func (x *GetDiscoveryRunRequest) Reset() { *x = GetDiscoveryRunRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[26] + mi := &file_lapp_web_v1_web_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1695,7 +2402,7 @@ func (x *GetDiscoveryRunRequest) String() string { func (*GetDiscoveryRunRequest) ProtoMessage() {} func (x *GetDiscoveryRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[26] + mi := &file_lapp_web_v1_web_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1708,7 +2415,7 @@ func (x *GetDiscoveryRunRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDiscoveryRunRequest.ProtoReflect.Descriptor instead. func (*GetDiscoveryRunRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{26} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{37} } func (x *GetDiscoveryRunRequest) GetName() string { @@ -1727,7 +2434,7 @@ type GetDiscoveryRunResponse struct { func (x *GetDiscoveryRunResponse) Reset() { *x = GetDiscoveryRunResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[27] + mi := &file_lapp_web_v1_web_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1739,7 +2446,7 @@ func (x *GetDiscoveryRunResponse) String() string { func (*GetDiscoveryRunResponse) ProtoMessage() {} func (x *GetDiscoveryRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[27] + mi := &file_lapp_web_v1_web_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1752,7 +2459,7 @@ func (x *GetDiscoveryRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDiscoveryRunResponse.ProtoReflect.Descriptor instead. func (*GetDiscoveryRunResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{27} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{38} } func (x *GetDiscoveryRunResponse) GetDiscoveryRun() *DiscoveryRun { @@ -1771,7 +2478,7 @@ type ListDiscoveryRunsRequest struct { func (x *ListDiscoveryRunsRequest) Reset() { *x = ListDiscoveryRunsRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[28] + mi := &file_lapp_web_v1_web_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1783,7 +2490,7 @@ func (x *ListDiscoveryRunsRequest) String() string { func (*ListDiscoveryRunsRequest) ProtoMessage() {} func (x *ListDiscoveryRunsRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[28] + mi := &file_lapp_web_v1_web_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1796,7 +2503,7 @@ func (x *ListDiscoveryRunsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDiscoveryRunsRequest.ProtoReflect.Descriptor instead. func (*ListDiscoveryRunsRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{28} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{39} } func (x *ListDiscoveryRunsRequest) GetParent() string { @@ -1815,7 +2522,7 @@ type ListDiscoveryRunsResponse struct { func (x *ListDiscoveryRunsResponse) Reset() { *x = ListDiscoveryRunsResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[29] + mi := &file_lapp_web_v1_web_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1827,7 +2534,7 @@ func (x *ListDiscoveryRunsResponse) String() string { func (*ListDiscoveryRunsResponse) ProtoMessage() {} func (x *ListDiscoveryRunsResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[29] + mi := &file_lapp_web_v1_web_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1840,7 +2547,7 @@ func (x *ListDiscoveryRunsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDiscoveryRunsResponse.ProtoReflect.Descriptor instead. func (*ListDiscoveryRunsResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{29} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{40} } func (x *ListDiscoveryRunsResponse) GetDiscoveryRuns() []*DiscoveryRun { @@ -1859,7 +2566,7 @@ type ListPatternsRequest struct { func (x *ListPatternsRequest) Reset() { *x = ListPatternsRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[30] + mi := &file_lapp_web_v1_web_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1871,7 +2578,7 @@ func (x *ListPatternsRequest) String() string { func (*ListPatternsRequest) ProtoMessage() {} func (x *ListPatternsRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[30] + mi := &file_lapp_web_v1_web_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1884,7 +2591,7 @@ func (x *ListPatternsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPatternsRequest.ProtoReflect.Descriptor instead. func (*ListPatternsRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{30} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{41} } func (x *ListPatternsRequest) GetParent() string { @@ -1903,7 +2610,7 @@ type ListPatternsResponse struct { func (x *ListPatternsResponse) Reset() { *x = ListPatternsResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[31] + mi := &file_lapp_web_v1_web_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1915,7 +2622,7 @@ func (x *ListPatternsResponse) String() string { func (*ListPatternsResponse) ProtoMessage() {} func (x *ListPatternsResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[31] + mi := &file_lapp_web_v1_web_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1928,7 +2635,7 @@ func (x *ListPatternsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPatternsResponse.ProtoReflect.Descriptor instead. func (*ListPatternsResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{31} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{42} } func (x *ListPatternsResponse) GetPatterns() []*Pattern { @@ -1947,7 +2654,7 @@ type GetPatternRequest struct { func (x *GetPatternRequest) Reset() { *x = GetPatternRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[32] + mi := &file_lapp_web_v1_web_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1959,7 +2666,7 @@ func (x *GetPatternRequest) String() string { func (*GetPatternRequest) ProtoMessage() {} func (x *GetPatternRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[32] + mi := &file_lapp_web_v1_web_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1972,7 +2679,7 @@ func (x *GetPatternRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPatternRequest.ProtoReflect.Descriptor instead. func (*GetPatternRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{32} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{43} } func (x *GetPatternRequest) GetName() string { @@ -1991,7 +2698,7 @@ type GetPatternResponse struct { func (x *GetPatternResponse) Reset() { *x = GetPatternResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[33] + mi := &file_lapp_web_v1_web_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2003,7 +2710,7 @@ func (x *GetPatternResponse) String() string { func (*GetPatternResponse) ProtoMessage() {} func (x *GetPatternResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[33] + mi := &file_lapp_web_v1_web_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2016,7 +2723,7 @@ func (x *GetPatternResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPatternResponse.ProtoReflect.Descriptor instead. func (*GetPatternResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{33} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{44} } func (x *GetPatternResponse) GetPattern() *Pattern { @@ -2035,7 +2742,7 @@ type GetErrorsViewRequest struct { func (x *GetErrorsViewRequest) Reset() { *x = GetErrorsViewRequest{} - mi := &file_lapp_web_v1_web_proto_msgTypes[34] + mi := &file_lapp_web_v1_web_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2047,7 +2754,7 @@ func (x *GetErrorsViewRequest) String() string { func (*GetErrorsViewRequest) ProtoMessage() {} func (x *GetErrorsViewRequest) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[34] + mi := &file_lapp_web_v1_web_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2060,7 +2767,7 @@ func (x *GetErrorsViewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetErrorsViewRequest.ProtoReflect.Descriptor instead. func (*GetErrorsViewRequest) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{34} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{45} } func (x *GetErrorsViewRequest) GetParent() string { @@ -2080,7 +2787,7 @@ type GetErrorsViewResponse struct { func (x *GetErrorsViewResponse) Reset() { *x = GetErrorsViewResponse{} - mi := &file_lapp_web_v1_web_proto_msgTypes[35] + mi := &file_lapp_web_v1_web_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2092,7 +2799,7 @@ func (x *GetErrorsViewResponse) String() string { func (*GetErrorsViewResponse) ProtoMessage() {} func (x *GetErrorsViewResponse) ProtoReflect() protoreflect.Message { - mi := &file_lapp_web_v1_web_proto_msgTypes[35] + mi := &file_lapp_web_v1_web_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2105,7 +2812,7 @@ func (x *GetErrorsViewResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetErrorsViewResponse.ProtoReflect.Descriptor instead. func (*GetErrorsViewResponse) Descriptor() ([]byte, []int) { - return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{35} + return file_lapp_web_v1_web_proto_rawDescGZIP(), []int{46} } func (x *GetErrorsViewResponse) GetErrorPatterns() []*ErrorPattern { @@ -2141,7 +2848,30 @@ const file_lapp_web_v1_web_proto_rawDesc = "" + "\n" + "size_bytes\x18\x03 \x01(\x03R\tsizeBytes\x129\n" + "\n" + - "updated_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"\xfa\x04\n" + + "updated_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"\xc4\x04\n" + + "\tImportRun\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\"\n" + + "\rimport_run_id\x18\x02 \x01(\tR\vimportRunId\x12\x1a\n" + + "\bprovider\x18\x03 \x01(\tR\bprovider\x12\x18\n" + + "\aproject\x18\x04 \x01(\tR\aproject\x12\x16\n" + + "\x06filter\x18\x05 \x01(\tR\x06filter\x12.\n" + + "\x04from\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\x04from\x12*\n" + + "\x02to\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\x02to\x12\x14\n" + + "\x05limit\x18\b \x01(\x05R\x05limit\x121\n" + + "\x05state\x18\t \x01(\x0e2\x1b.lapp.web.v1.ImportRunStateR\x05state\x12\x1f\n" + + "\ventry_count\x18\n" + + " \x01(\x05R\n" + + "entryCount\x12\x1c\n" + + "\ttruncated\x18\v \x01(\bR\ttruncated\x12\"\n" + + "\rlog_file_name\x18\f \x01(\tR\vlogFileName\x129\n" + + "\n" + + "started_at\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x12;\n" + + "\vfinished_at\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "finishedAt\x121\n" + + "\x05error\x18\x0f \x01(\v2\x1b.lapp.web.v1.ImportRunErrorR\x05error\">\n" + + "\x0eImportRunError\x12\x12\n" + + "\x04code\x18\x01 \x01(\tR\x04code\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"\xfa\x04\n" + "\fDiscoveryRun\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12(\n" + "\x10discovery_run_id\x18\x02 \x01(\tR\x0ediscoveryRunId\x124\n" + @@ -2231,7 +2961,35 @@ const file_lapp_web_v1_web_proto_rawDesc = "" + "\blog_file\x18\x01 \x01(\v2\x14.lapp.web.v1.LogFileR\alogFile\"*\n" + "\x14DeleteLogFileRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"\x17\n" + - "\x15DeleteLogFileResponse\"I\n" + + "\x15DeleteLogFileResponse\"\xd4\x01\n" + + "\x16CreateImportRunRequest\x12\x16\n" + + "\x06parent\x18\x01 \x01(\tR\x06parent\x12\x18\n" + + "\aproject\x18\x02 \x01(\tR\aproject\x12\x16\n" + + "\x06filter\x18\x03 \x01(\tR\x06filter\x12.\n" + + "\x04from\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x04from\x12*\n" + + "\x02to\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\x02to\x12\x14\n" + + "\x05limit\x18\x06 \x01(\x05R\x05limit\"P\n" + + "\x17CreateImportRunResponse\x125\n" + + "\n" + + "import_run\x18\x01 \x01(\v2\x16.lapp.web.v1.ImportRunR\timportRun\")\n" + + "\x13GetImportRunRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"M\n" + + "\x14GetImportRunResponse\x125\n" + + "\n" + + "import_run\x18\x01 \x01(\v2\x16.lapp.web.v1.ImportRunR\timportRun\"/\n" + + "\x15ListImportRunsRequest\x12\x16\n" + + "\x06parent\x18\x01 \x01(\tR\x06parent\"Q\n" + + "\x16ListImportRunsResponse\x127\n" + + "\vimport_runs\x18\x01 \x03(\v2\x16.lapp.web.v1.ImportRunR\n" + + "importRuns\" \n" + + "\x1eListRecentImportQueriesRequest\"\x83\x01\n" + + "\x11RecentImportQuery\x12\x18\n" + + "\aproject\x18\x01 \x01(\tR\aproject\x12\x16\n" + + "\x06filter\x18\x02 \x01(\tR\x06filter\x12<\n" + + "\flast_used_at\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastUsedAt\"h\n" + + "\x1fListRecentImportQueriesResponse\x12E\n" + + "\x0erecent_queries\x18\x01 \x03(\v2\x1e.lapp.web.v1.RecentImportQueryR\rrecentQueries\"I\n" + "\x19CreateDiscoveryRunRequest\x12\x16\n" + "\x06parent\x18\x01 \x01(\tR\x06parent\x12\x14\n" + "\x05model\x18\x02 \x01(\tR\x05model\"\\\n" + @@ -2263,7 +3021,13 @@ const file_lapp_web_v1_web_proto_rawDesc = "" + "\x16WORKSPACE_STATUS_EMPTY\x10\x01\x12 \n" + "\x1cWORKSPACE_STATUS_DISCOVERING\x10\x02\x12\x1a\n" + "\x16WORKSPACE_STATUS_READY\x10\x03\x12\x1b\n" + - "\x17WORKSPACE_STATUS_FAILED\x10\x04*\xbc\x01\n" + + "\x17WORKSPACE_STATUS_FAILED\x10\x04*\xaa\x01\n" + + "\x0eImportRunState\x12 \n" + + "\x1cIMPORT_RUN_STATE_UNSPECIFIED\x10\x00\x12\x1b\n" + + "\x17IMPORT_RUN_STATE_QUEUED\x10\x01\x12\x1c\n" + + "\x18IMPORT_RUN_STATE_RUNNING\x10\x02\x12\x1e\n" + + "\x1aIMPORT_RUN_STATE_SUCCEEDED\x10\x03\x12\x1b\n" + + "\x17IMPORT_RUN_STATE_FAILED\x10\x04*\xbc\x01\n" + "\x11DiscoveryRunState\x12#\n" + "\x1fDISCOVERY_RUN_STATE_UNSPECIFIED\x10\x00\x12\x1e\n" + "\x1aDISCOVERY_RUN_STATE_QUEUED\x10\x01\x12\x1f\n" + @@ -2276,7 +3040,7 @@ const file_lapp_web_v1_web_proto_rawDesc = "" + "\x1eDISCOVERY_STEP_MERGING_ENTRIES\x10\x02\x12'\n" + "#DISCOVERY_STEP_DISCOVERING_PATTERNS\x10\x03\x12$\n" + " DISCOVERY_STEP_LABELING_PATTERNS\x10\x04\x12\"\n" + - "\x1eDISCOVERY_STEP_WRITING_RESULTS\x10\x052\xa8\t\n" + + "\x1eDISCOVERY_STEP_WRITING_RESULTS\x10\x052\xac\f\n" + "\x10WorkspaceService\x12Y\n" + "\x0eListWorkspaces\x12\".lapp.web.v1.ListWorkspacesRequest\x1a#.lapp.web.v1.ListWorkspacesResponse\x12S\n" + "\fGetWorkspace\x12 .lapp.web.v1.GetWorkspaceRequest\x1a!.lapp.web.v1.GetWorkspaceResponse\x12\\\n" + @@ -2284,7 +3048,11 @@ const file_lapp_web_v1_web_proto_rawDesc = "" + "\x0fDeleteWorkspace\x12#.lapp.web.v1.DeleteWorkspaceRequest\x1a$.lapp.web.v1.DeleteWorkspaceResponse\x12S\n" + "\fListLogFiles\x12 .lapp.web.v1.ListLogFilesRequest\x1a!.lapp.web.v1.ListLogFilesResponse\x12V\n" + "\rUploadLogFile\x12!.lapp.web.v1.UploadLogFileRequest\x1a\".lapp.web.v1.UploadLogFileResponse\x12V\n" + - "\rDeleteLogFile\x12!.lapp.web.v1.DeleteLogFileRequest\x1a\".lapp.web.v1.DeleteLogFileResponse\x12e\n" + + "\rDeleteLogFile\x12!.lapp.web.v1.DeleteLogFileRequest\x1a\".lapp.web.v1.DeleteLogFileResponse\x12\\\n" + + "\x0fCreateImportRun\x12#.lapp.web.v1.CreateImportRunRequest\x1a$.lapp.web.v1.CreateImportRunResponse\x12S\n" + + "\fGetImportRun\x12 .lapp.web.v1.GetImportRunRequest\x1a!.lapp.web.v1.GetImportRunResponse\x12Y\n" + + "\x0eListImportRuns\x12\".lapp.web.v1.ListImportRunsRequest\x1a#.lapp.web.v1.ListImportRunsResponse\x12t\n" + + "\x17ListRecentImportQueries\x12+.lapp.web.v1.ListRecentImportQueriesRequest\x1a,.lapp.web.v1.ListRecentImportQueriesResponse\x12e\n" + "\x12CreateDiscoveryRun\x12&.lapp.web.v1.CreateDiscoveryRunRequest\x1a'.lapp.web.v1.CreateDiscoveryRunResponse\x12\\\n" + "\x0fGetDiscoveryRun\x12#.lapp.web.v1.GetDiscoveryRunRequest\x1a$.lapp.web.v1.GetDiscoveryRunResponse\x12b\n" + "\x11ListDiscoveryRuns\x12%.lapp.web.v1.ListDiscoveryRunsRequest\x1a&.lapp.web.v1.ListDiscoveryRunsResponse\x12S\n" + @@ -2305,111 +3073,144 @@ func file_lapp_web_v1_web_proto_rawDescGZIP() []byte { return file_lapp_web_v1_web_proto_rawDescData } -var file_lapp_web_v1_web_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_lapp_web_v1_web_proto_msgTypes = make([]protoimpl.MessageInfo, 36) +var file_lapp_web_v1_web_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_lapp_web_v1_web_proto_msgTypes = make([]protoimpl.MessageInfo, 47) var file_lapp_web_v1_web_proto_goTypes = []any{ - (WorkspaceStatus)(0), // 0: lapp.web.v1.WorkspaceStatus - (DiscoveryRunState)(0), // 1: lapp.web.v1.DiscoveryRunState - (DiscoveryStep)(0), // 2: lapp.web.v1.DiscoveryStep - (*Workspace)(nil), // 3: lapp.web.v1.Workspace - (*LogFile)(nil), // 4: lapp.web.v1.LogFile - (*DiscoveryRun)(nil), // 5: lapp.web.v1.DiscoveryRun - (*DiscoveryRunProgress)(nil), // 6: lapp.web.v1.DiscoveryRunProgress - (*DiscoveryLabelBatchProgress)(nil), // 7: lapp.web.v1.DiscoveryLabelBatchProgress - (*DiscoveryRunError)(nil), // 8: lapp.web.v1.DiscoveryRunError - (*Pattern)(nil), // 9: lapp.web.v1.Pattern - (*LineRef)(nil), // 10: lapp.web.v1.LineRef - (*ErrorPattern)(nil), // 11: lapp.web.v1.ErrorPattern - (*UnmatchedErrorLine)(nil), // 12: lapp.web.v1.UnmatchedErrorLine - (*ListWorkspacesRequest)(nil), // 13: lapp.web.v1.ListWorkspacesRequest - (*ListWorkspacesResponse)(nil), // 14: lapp.web.v1.ListWorkspacesResponse - (*GetWorkspaceRequest)(nil), // 15: lapp.web.v1.GetWorkspaceRequest - (*GetWorkspaceResponse)(nil), // 16: lapp.web.v1.GetWorkspaceResponse - (*CreateWorkspaceRequest)(nil), // 17: lapp.web.v1.CreateWorkspaceRequest - (*CreateWorkspaceResponse)(nil), // 18: lapp.web.v1.CreateWorkspaceResponse - (*DeleteWorkspaceRequest)(nil), // 19: lapp.web.v1.DeleteWorkspaceRequest - (*DeleteWorkspaceResponse)(nil), // 20: lapp.web.v1.DeleteWorkspaceResponse - (*ListLogFilesRequest)(nil), // 21: lapp.web.v1.ListLogFilesRequest - (*ListLogFilesResponse)(nil), // 22: lapp.web.v1.ListLogFilesResponse - (*UploadLogFileRequest)(nil), // 23: lapp.web.v1.UploadLogFileRequest - (*UploadLogFileResponse)(nil), // 24: lapp.web.v1.UploadLogFileResponse - (*DeleteLogFileRequest)(nil), // 25: lapp.web.v1.DeleteLogFileRequest - (*DeleteLogFileResponse)(nil), // 26: lapp.web.v1.DeleteLogFileResponse - (*CreateDiscoveryRunRequest)(nil), // 27: lapp.web.v1.CreateDiscoveryRunRequest - (*CreateDiscoveryRunResponse)(nil), // 28: lapp.web.v1.CreateDiscoveryRunResponse - (*GetDiscoveryRunRequest)(nil), // 29: lapp.web.v1.GetDiscoveryRunRequest - (*GetDiscoveryRunResponse)(nil), // 30: lapp.web.v1.GetDiscoveryRunResponse - (*ListDiscoveryRunsRequest)(nil), // 31: lapp.web.v1.ListDiscoveryRunsRequest - (*ListDiscoveryRunsResponse)(nil), // 32: lapp.web.v1.ListDiscoveryRunsResponse - (*ListPatternsRequest)(nil), // 33: lapp.web.v1.ListPatternsRequest - (*ListPatternsResponse)(nil), // 34: lapp.web.v1.ListPatternsResponse - (*GetPatternRequest)(nil), // 35: lapp.web.v1.GetPatternRequest - (*GetPatternResponse)(nil), // 36: lapp.web.v1.GetPatternResponse - (*GetErrorsViewRequest)(nil), // 37: lapp.web.v1.GetErrorsViewRequest - (*GetErrorsViewResponse)(nil), // 38: lapp.web.v1.GetErrorsViewResponse - (*timestamppb.Timestamp)(nil), // 39: google.protobuf.Timestamp + (WorkspaceStatus)(0), // 0: lapp.web.v1.WorkspaceStatus + (ImportRunState)(0), // 1: lapp.web.v1.ImportRunState + (DiscoveryRunState)(0), // 2: lapp.web.v1.DiscoveryRunState + (DiscoveryStep)(0), // 3: lapp.web.v1.DiscoveryStep + (*Workspace)(nil), // 4: lapp.web.v1.Workspace + (*LogFile)(nil), // 5: lapp.web.v1.LogFile + (*ImportRun)(nil), // 6: lapp.web.v1.ImportRun + (*ImportRunError)(nil), // 7: lapp.web.v1.ImportRunError + (*DiscoveryRun)(nil), // 8: lapp.web.v1.DiscoveryRun + (*DiscoveryRunProgress)(nil), // 9: lapp.web.v1.DiscoveryRunProgress + (*DiscoveryLabelBatchProgress)(nil), // 10: lapp.web.v1.DiscoveryLabelBatchProgress + (*DiscoveryRunError)(nil), // 11: lapp.web.v1.DiscoveryRunError + (*Pattern)(nil), // 12: lapp.web.v1.Pattern + (*LineRef)(nil), // 13: lapp.web.v1.LineRef + (*ErrorPattern)(nil), // 14: lapp.web.v1.ErrorPattern + (*UnmatchedErrorLine)(nil), // 15: lapp.web.v1.UnmatchedErrorLine + (*ListWorkspacesRequest)(nil), // 16: lapp.web.v1.ListWorkspacesRequest + (*ListWorkspacesResponse)(nil), // 17: lapp.web.v1.ListWorkspacesResponse + (*GetWorkspaceRequest)(nil), // 18: lapp.web.v1.GetWorkspaceRequest + (*GetWorkspaceResponse)(nil), // 19: lapp.web.v1.GetWorkspaceResponse + (*CreateWorkspaceRequest)(nil), // 20: lapp.web.v1.CreateWorkspaceRequest + (*CreateWorkspaceResponse)(nil), // 21: lapp.web.v1.CreateWorkspaceResponse + (*DeleteWorkspaceRequest)(nil), // 22: lapp.web.v1.DeleteWorkspaceRequest + (*DeleteWorkspaceResponse)(nil), // 23: lapp.web.v1.DeleteWorkspaceResponse + (*ListLogFilesRequest)(nil), // 24: lapp.web.v1.ListLogFilesRequest + (*ListLogFilesResponse)(nil), // 25: lapp.web.v1.ListLogFilesResponse + (*UploadLogFileRequest)(nil), // 26: lapp.web.v1.UploadLogFileRequest + (*UploadLogFileResponse)(nil), // 27: lapp.web.v1.UploadLogFileResponse + (*DeleteLogFileRequest)(nil), // 28: lapp.web.v1.DeleteLogFileRequest + (*DeleteLogFileResponse)(nil), // 29: lapp.web.v1.DeleteLogFileResponse + (*CreateImportRunRequest)(nil), // 30: lapp.web.v1.CreateImportRunRequest + (*CreateImportRunResponse)(nil), // 31: lapp.web.v1.CreateImportRunResponse + (*GetImportRunRequest)(nil), // 32: lapp.web.v1.GetImportRunRequest + (*GetImportRunResponse)(nil), // 33: lapp.web.v1.GetImportRunResponse + (*ListImportRunsRequest)(nil), // 34: lapp.web.v1.ListImportRunsRequest + (*ListImportRunsResponse)(nil), // 35: lapp.web.v1.ListImportRunsResponse + (*ListRecentImportQueriesRequest)(nil), // 36: lapp.web.v1.ListRecentImportQueriesRequest + (*RecentImportQuery)(nil), // 37: lapp.web.v1.RecentImportQuery + (*ListRecentImportQueriesResponse)(nil), // 38: lapp.web.v1.ListRecentImportQueriesResponse + (*CreateDiscoveryRunRequest)(nil), // 39: lapp.web.v1.CreateDiscoveryRunRequest + (*CreateDiscoveryRunResponse)(nil), // 40: lapp.web.v1.CreateDiscoveryRunResponse + (*GetDiscoveryRunRequest)(nil), // 41: lapp.web.v1.GetDiscoveryRunRequest + (*GetDiscoveryRunResponse)(nil), // 42: lapp.web.v1.GetDiscoveryRunResponse + (*ListDiscoveryRunsRequest)(nil), // 43: lapp.web.v1.ListDiscoveryRunsRequest + (*ListDiscoveryRunsResponse)(nil), // 44: lapp.web.v1.ListDiscoveryRunsResponse + (*ListPatternsRequest)(nil), // 45: lapp.web.v1.ListPatternsRequest + (*ListPatternsResponse)(nil), // 46: lapp.web.v1.ListPatternsResponse + (*GetPatternRequest)(nil), // 47: lapp.web.v1.GetPatternRequest + (*GetPatternResponse)(nil), // 48: lapp.web.v1.GetPatternResponse + (*GetErrorsViewRequest)(nil), // 49: lapp.web.v1.GetErrorsViewRequest + (*GetErrorsViewResponse)(nil), // 50: lapp.web.v1.GetErrorsViewResponse + (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp } var file_lapp_web_v1_web_proto_depIdxs = []int32{ 0, // 0: lapp.web.v1.Workspace.status:type_name -> lapp.web.v1.WorkspaceStatus - 5, // 1: lapp.web.v1.Workspace.latest_discovery_run:type_name -> lapp.web.v1.DiscoveryRun - 5, // 2: lapp.web.v1.Workspace.latest_successful_discovery_run:type_name -> lapp.web.v1.DiscoveryRun - 39, // 3: lapp.web.v1.LogFile.updated_at:type_name -> google.protobuf.Timestamp - 1, // 4: lapp.web.v1.DiscoveryRun.state:type_name -> lapp.web.v1.DiscoveryRunState - 2, // 5: lapp.web.v1.DiscoveryRun.current_step:type_name -> lapp.web.v1.DiscoveryStep - 39, // 6: lapp.web.v1.DiscoveryRun.started_at:type_name -> google.protobuf.Timestamp - 39, // 7: lapp.web.v1.DiscoveryRun.finished_at:type_name -> google.protobuf.Timestamp - 6, // 8: lapp.web.v1.DiscoveryRun.progress:type_name -> lapp.web.v1.DiscoveryRunProgress - 8, // 9: lapp.web.v1.DiscoveryRun.error:type_name -> lapp.web.v1.DiscoveryRunError - 2, // 10: lapp.web.v1.DiscoveryRunProgress.step:type_name -> lapp.web.v1.DiscoveryStep - 7, // 11: lapp.web.v1.DiscoveryRunProgress.label_batch:type_name -> lapp.web.v1.DiscoveryLabelBatchProgress - 2, // 12: lapp.web.v1.DiscoveryRunError.step:type_name -> lapp.web.v1.DiscoveryStep - 10, // 13: lapp.web.v1.Pattern.first_seen:type_name -> lapp.web.v1.LineRef - 10, // 14: lapp.web.v1.Pattern.last_seen:type_name -> lapp.web.v1.LineRef - 10, // 15: lapp.web.v1.Pattern.line_refs:type_name -> lapp.web.v1.LineRef - 9, // 16: lapp.web.v1.ErrorPattern.pattern:type_name -> lapp.web.v1.Pattern - 3, // 17: lapp.web.v1.ListWorkspacesResponse.workspaces:type_name -> lapp.web.v1.Workspace - 3, // 18: lapp.web.v1.GetWorkspaceResponse.workspace:type_name -> lapp.web.v1.Workspace - 3, // 19: lapp.web.v1.CreateWorkspaceResponse.workspace:type_name -> lapp.web.v1.Workspace - 4, // 20: lapp.web.v1.ListLogFilesResponse.log_files:type_name -> lapp.web.v1.LogFile - 4, // 21: lapp.web.v1.UploadLogFileResponse.log_file:type_name -> lapp.web.v1.LogFile - 5, // 22: lapp.web.v1.CreateDiscoveryRunResponse.discovery_run:type_name -> lapp.web.v1.DiscoveryRun - 5, // 23: lapp.web.v1.GetDiscoveryRunResponse.discovery_run:type_name -> lapp.web.v1.DiscoveryRun - 5, // 24: lapp.web.v1.ListDiscoveryRunsResponse.discovery_runs:type_name -> lapp.web.v1.DiscoveryRun - 9, // 25: lapp.web.v1.ListPatternsResponse.patterns:type_name -> lapp.web.v1.Pattern - 9, // 26: lapp.web.v1.GetPatternResponse.pattern:type_name -> lapp.web.v1.Pattern - 11, // 27: lapp.web.v1.GetErrorsViewResponse.error_patterns:type_name -> lapp.web.v1.ErrorPattern - 12, // 28: lapp.web.v1.GetErrorsViewResponse.unmatched_error_lines:type_name -> lapp.web.v1.UnmatchedErrorLine - 13, // 29: lapp.web.v1.WorkspaceService.ListWorkspaces:input_type -> lapp.web.v1.ListWorkspacesRequest - 15, // 30: lapp.web.v1.WorkspaceService.GetWorkspace:input_type -> lapp.web.v1.GetWorkspaceRequest - 17, // 31: lapp.web.v1.WorkspaceService.CreateWorkspace:input_type -> lapp.web.v1.CreateWorkspaceRequest - 19, // 32: lapp.web.v1.WorkspaceService.DeleteWorkspace:input_type -> lapp.web.v1.DeleteWorkspaceRequest - 21, // 33: lapp.web.v1.WorkspaceService.ListLogFiles:input_type -> lapp.web.v1.ListLogFilesRequest - 23, // 34: lapp.web.v1.WorkspaceService.UploadLogFile:input_type -> lapp.web.v1.UploadLogFileRequest - 25, // 35: lapp.web.v1.WorkspaceService.DeleteLogFile:input_type -> lapp.web.v1.DeleteLogFileRequest - 27, // 36: lapp.web.v1.WorkspaceService.CreateDiscoveryRun:input_type -> lapp.web.v1.CreateDiscoveryRunRequest - 29, // 37: lapp.web.v1.WorkspaceService.GetDiscoveryRun:input_type -> lapp.web.v1.GetDiscoveryRunRequest - 31, // 38: lapp.web.v1.WorkspaceService.ListDiscoveryRuns:input_type -> lapp.web.v1.ListDiscoveryRunsRequest - 33, // 39: lapp.web.v1.WorkspaceService.ListPatterns:input_type -> lapp.web.v1.ListPatternsRequest - 35, // 40: lapp.web.v1.WorkspaceService.GetPattern:input_type -> lapp.web.v1.GetPatternRequest - 37, // 41: lapp.web.v1.WorkspaceService.GetErrorsView:input_type -> lapp.web.v1.GetErrorsViewRequest - 14, // 42: lapp.web.v1.WorkspaceService.ListWorkspaces:output_type -> lapp.web.v1.ListWorkspacesResponse - 16, // 43: lapp.web.v1.WorkspaceService.GetWorkspace:output_type -> lapp.web.v1.GetWorkspaceResponse - 18, // 44: lapp.web.v1.WorkspaceService.CreateWorkspace:output_type -> lapp.web.v1.CreateWorkspaceResponse - 20, // 45: lapp.web.v1.WorkspaceService.DeleteWorkspace:output_type -> lapp.web.v1.DeleteWorkspaceResponse - 22, // 46: lapp.web.v1.WorkspaceService.ListLogFiles:output_type -> lapp.web.v1.ListLogFilesResponse - 24, // 47: lapp.web.v1.WorkspaceService.UploadLogFile:output_type -> lapp.web.v1.UploadLogFileResponse - 26, // 48: lapp.web.v1.WorkspaceService.DeleteLogFile:output_type -> lapp.web.v1.DeleteLogFileResponse - 28, // 49: lapp.web.v1.WorkspaceService.CreateDiscoveryRun:output_type -> lapp.web.v1.CreateDiscoveryRunResponse - 30, // 50: lapp.web.v1.WorkspaceService.GetDiscoveryRun:output_type -> lapp.web.v1.GetDiscoveryRunResponse - 32, // 51: lapp.web.v1.WorkspaceService.ListDiscoveryRuns:output_type -> lapp.web.v1.ListDiscoveryRunsResponse - 34, // 52: lapp.web.v1.WorkspaceService.ListPatterns:output_type -> lapp.web.v1.ListPatternsResponse - 36, // 53: lapp.web.v1.WorkspaceService.GetPattern:output_type -> lapp.web.v1.GetPatternResponse - 38, // 54: lapp.web.v1.WorkspaceService.GetErrorsView:output_type -> lapp.web.v1.GetErrorsViewResponse - 42, // [42:55] is the sub-list for method output_type - 29, // [29:42] is the sub-list for method input_type - 29, // [29:29] is the sub-list for extension type_name - 29, // [29:29] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 8, // 1: lapp.web.v1.Workspace.latest_discovery_run:type_name -> lapp.web.v1.DiscoveryRun + 8, // 2: lapp.web.v1.Workspace.latest_successful_discovery_run:type_name -> lapp.web.v1.DiscoveryRun + 51, // 3: lapp.web.v1.LogFile.updated_at:type_name -> google.protobuf.Timestamp + 51, // 4: lapp.web.v1.ImportRun.from:type_name -> google.protobuf.Timestamp + 51, // 5: lapp.web.v1.ImportRun.to:type_name -> google.protobuf.Timestamp + 1, // 6: lapp.web.v1.ImportRun.state:type_name -> lapp.web.v1.ImportRunState + 51, // 7: lapp.web.v1.ImportRun.started_at:type_name -> google.protobuf.Timestamp + 51, // 8: lapp.web.v1.ImportRun.finished_at:type_name -> google.protobuf.Timestamp + 7, // 9: lapp.web.v1.ImportRun.error:type_name -> lapp.web.v1.ImportRunError + 2, // 10: lapp.web.v1.DiscoveryRun.state:type_name -> lapp.web.v1.DiscoveryRunState + 3, // 11: lapp.web.v1.DiscoveryRun.current_step:type_name -> lapp.web.v1.DiscoveryStep + 51, // 12: lapp.web.v1.DiscoveryRun.started_at:type_name -> google.protobuf.Timestamp + 51, // 13: lapp.web.v1.DiscoveryRun.finished_at:type_name -> google.protobuf.Timestamp + 9, // 14: lapp.web.v1.DiscoveryRun.progress:type_name -> lapp.web.v1.DiscoveryRunProgress + 11, // 15: lapp.web.v1.DiscoveryRun.error:type_name -> lapp.web.v1.DiscoveryRunError + 3, // 16: lapp.web.v1.DiscoveryRunProgress.step:type_name -> lapp.web.v1.DiscoveryStep + 10, // 17: lapp.web.v1.DiscoveryRunProgress.label_batch:type_name -> lapp.web.v1.DiscoveryLabelBatchProgress + 3, // 18: lapp.web.v1.DiscoveryRunError.step:type_name -> lapp.web.v1.DiscoveryStep + 13, // 19: lapp.web.v1.Pattern.first_seen:type_name -> lapp.web.v1.LineRef + 13, // 20: lapp.web.v1.Pattern.last_seen:type_name -> lapp.web.v1.LineRef + 13, // 21: lapp.web.v1.Pattern.line_refs:type_name -> lapp.web.v1.LineRef + 12, // 22: lapp.web.v1.ErrorPattern.pattern:type_name -> lapp.web.v1.Pattern + 4, // 23: lapp.web.v1.ListWorkspacesResponse.workspaces:type_name -> lapp.web.v1.Workspace + 4, // 24: lapp.web.v1.GetWorkspaceResponse.workspace:type_name -> lapp.web.v1.Workspace + 4, // 25: lapp.web.v1.CreateWorkspaceResponse.workspace:type_name -> lapp.web.v1.Workspace + 5, // 26: lapp.web.v1.ListLogFilesResponse.log_files:type_name -> lapp.web.v1.LogFile + 5, // 27: lapp.web.v1.UploadLogFileResponse.log_file:type_name -> lapp.web.v1.LogFile + 51, // 28: lapp.web.v1.CreateImportRunRequest.from:type_name -> google.protobuf.Timestamp + 51, // 29: lapp.web.v1.CreateImportRunRequest.to:type_name -> google.protobuf.Timestamp + 6, // 30: lapp.web.v1.CreateImportRunResponse.import_run:type_name -> lapp.web.v1.ImportRun + 6, // 31: lapp.web.v1.GetImportRunResponse.import_run:type_name -> lapp.web.v1.ImportRun + 6, // 32: lapp.web.v1.ListImportRunsResponse.import_runs:type_name -> lapp.web.v1.ImportRun + 51, // 33: lapp.web.v1.RecentImportQuery.last_used_at:type_name -> google.protobuf.Timestamp + 37, // 34: lapp.web.v1.ListRecentImportQueriesResponse.recent_queries:type_name -> lapp.web.v1.RecentImportQuery + 8, // 35: lapp.web.v1.CreateDiscoveryRunResponse.discovery_run:type_name -> lapp.web.v1.DiscoveryRun + 8, // 36: lapp.web.v1.GetDiscoveryRunResponse.discovery_run:type_name -> lapp.web.v1.DiscoveryRun + 8, // 37: lapp.web.v1.ListDiscoveryRunsResponse.discovery_runs:type_name -> lapp.web.v1.DiscoveryRun + 12, // 38: lapp.web.v1.ListPatternsResponse.patterns:type_name -> lapp.web.v1.Pattern + 12, // 39: lapp.web.v1.GetPatternResponse.pattern:type_name -> lapp.web.v1.Pattern + 14, // 40: lapp.web.v1.GetErrorsViewResponse.error_patterns:type_name -> lapp.web.v1.ErrorPattern + 15, // 41: lapp.web.v1.GetErrorsViewResponse.unmatched_error_lines:type_name -> lapp.web.v1.UnmatchedErrorLine + 16, // 42: lapp.web.v1.WorkspaceService.ListWorkspaces:input_type -> lapp.web.v1.ListWorkspacesRequest + 18, // 43: lapp.web.v1.WorkspaceService.GetWorkspace:input_type -> lapp.web.v1.GetWorkspaceRequest + 20, // 44: lapp.web.v1.WorkspaceService.CreateWorkspace:input_type -> lapp.web.v1.CreateWorkspaceRequest + 22, // 45: lapp.web.v1.WorkspaceService.DeleteWorkspace:input_type -> lapp.web.v1.DeleteWorkspaceRequest + 24, // 46: lapp.web.v1.WorkspaceService.ListLogFiles:input_type -> lapp.web.v1.ListLogFilesRequest + 26, // 47: lapp.web.v1.WorkspaceService.UploadLogFile:input_type -> lapp.web.v1.UploadLogFileRequest + 28, // 48: lapp.web.v1.WorkspaceService.DeleteLogFile:input_type -> lapp.web.v1.DeleteLogFileRequest + 30, // 49: lapp.web.v1.WorkspaceService.CreateImportRun:input_type -> lapp.web.v1.CreateImportRunRequest + 32, // 50: lapp.web.v1.WorkspaceService.GetImportRun:input_type -> lapp.web.v1.GetImportRunRequest + 34, // 51: lapp.web.v1.WorkspaceService.ListImportRuns:input_type -> lapp.web.v1.ListImportRunsRequest + 36, // 52: lapp.web.v1.WorkspaceService.ListRecentImportQueries:input_type -> lapp.web.v1.ListRecentImportQueriesRequest + 39, // 53: lapp.web.v1.WorkspaceService.CreateDiscoveryRun:input_type -> lapp.web.v1.CreateDiscoveryRunRequest + 41, // 54: lapp.web.v1.WorkspaceService.GetDiscoveryRun:input_type -> lapp.web.v1.GetDiscoveryRunRequest + 43, // 55: lapp.web.v1.WorkspaceService.ListDiscoveryRuns:input_type -> lapp.web.v1.ListDiscoveryRunsRequest + 45, // 56: lapp.web.v1.WorkspaceService.ListPatterns:input_type -> lapp.web.v1.ListPatternsRequest + 47, // 57: lapp.web.v1.WorkspaceService.GetPattern:input_type -> lapp.web.v1.GetPatternRequest + 49, // 58: lapp.web.v1.WorkspaceService.GetErrorsView:input_type -> lapp.web.v1.GetErrorsViewRequest + 17, // 59: lapp.web.v1.WorkspaceService.ListWorkspaces:output_type -> lapp.web.v1.ListWorkspacesResponse + 19, // 60: lapp.web.v1.WorkspaceService.GetWorkspace:output_type -> lapp.web.v1.GetWorkspaceResponse + 21, // 61: lapp.web.v1.WorkspaceService.CreateWorkspace:output_type -> lapp.web.v1.CreateWorkspaceResponse + 23, // 62: lapp.web.v1.WorkspaceService.DeleteWorkspace:output_type -> lapp.web.v1.DeleteWorkspaceResponse + 25, // 63: lapp.web.v1.WorkspaceService.ListLogFiles:output_type -> lapp.web.v1.ListLogFilesResponse + 27, // 64: lapp.web.v1.WorkspaceService.UploadLogFile:output_type -> lapp.web.v1.UploadLogFileResponse + 29, // 65: lapp.web.v1.WorkspaceService.DeleteLogFile:output_type -> lapp.web.v1.DeleteLogFileResponse + 31, // 66: lapp.web.v1.WorkspaceService.CreateImportRun:output_type -> lapp.web.v1.CreateImportRunResponse + 33, // 67: lapp.web.v1.WorkspaceService.GetImportRun:output_type -> lapp.web.v1.GetImportRunResponse + 35, // 68: lapp.web.v1.WorkspaceService.ListImportRuns:output_type -> lapp.web.v1.ListImportRunsResponse + 38, // 69: lapp.web.v1.WorkspaceService.ListRecentImportQueries:output_type -> lapp.web.v1.ListRecentImportQueriesResponse + 40, // 70: lapp.web.v1.WorkspaceService.CreateDiscoveryRun:output_type -> lapp.web.v1.CreateDiscoveryRunResponse + 42, // 71: lapp.web.v1.WorkspaceService.GetDiscoveryRun:output_type -> lapp.web.v1.GetDiscoveryRunResponse + 44, // 72: lapp.web.v1.WorkspaceService.ListDiscoveryRuns:output_type -> lapp.web.v1.ListDiscoveryRunsResponse + 46, // 73: lapp.web.v1.WorkspaceService.ListPatterns:output_type -> lapp.web.v1.ListPatternsResponse + 48, // 74: lapp.web.v1.WorkspaceService.GetPattern:output_type -> lapp.web.v1.GetPatternResponse + 50, // 75: lapp.web.v1.WorkspaceService.GetErrorsView:output_type -> lapp.web.v1.GetErrorsViewResponse + 59, // [59:76] is the sub-list for method output_type + 42, // [42:59] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_lapp_web_v1_web_proto_init() } @@ -2422,8 +3223,8 @@ func file_lapp_web_v1_web_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_lapp_web_v1_web_proto_rawDesc), len(file_lapp_web_v1_web_proto_rawDesc)), - NumEnums: 3, - NumMessages: 36, + NumEnums: 4, + NumMessages: 47, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/lapp/web/v1/webv1connect/web.connect.go b/gen/go/lapp/web/v1/webv1connect/web.connect.go index 5c1d2a1..43e7312 100644 --- a/gen/go/lapp/web/v1/webv1connect/web.connect.go +++ b/gen/go/lapp/web/v1/webv1connect/web.connect.go @@ -54,6 +54,18 @@ const ( // WorkspaceServiceDeleteLogFileProcedure is the fully-qualified name of the WorkspaceService's // DeleteLogFile RPC. WorkspaceServiceDeleteLogFileProcedure = "/lapp.web.v1.WorkspaceService/DeleteLogFile" + // WorkspaceServiceCreateImportRunProcedure is the fully-qualified name of the WorkspaceService's + // CreateImportRun RPC. + WorkspaceServiceCreateImportRunProcedure = "/lapp.web.v1.WorkspaceService/CreateImportRun" + // WorkspaceServiceGetImportRunProcedure is the fully-qualified name of the WorkspaceService's + // GetImportRun RPC. + WorkspaceServiceGetImportRunProcedure = "/lapp.web.v1.WorkspaceService/GetImportRun" + // WorkspaceServiceListImportRunsProcedure is the fully-qualified name of the WorkspaceService's + // ListImportRuns RPC. + WorkspaceServiceListImportRunsProcedure = "/lapp.web.v1.WorkspaceService/ListImportRuns" + // WorkspaceServiceListRecentImportQueriesProcedure is the fully-qualified name of the + // WorkspaceService's ListRecentImportQueries RPC. + WorkspaceServiceListRecentImportQueriesProcedure = "/lapp.web.v1.WorkspaceService/ListRecentImportQueries" // WorkspaceServiceCreateDiscoveryRunProcedure is the fully-qualified name of the WorkspaceService's // CreateDiscoveryRun RPC. WorkspaceServiceCreateDiscoveryRunProcedure = "/lapp.web.v1.WorkspaceService/CreateDiscoveryRun" @@ -83,6 +95,10 @@ type WorkspaceServiceClient interface { ListLogFiles(context.Context, *connect.Request[v1.ListLogFilesRequest]) (*connect.Response[v1.ListLogFilesResponse], error) UploadLogFile(context.Context, *connect.Request[v1.UploadLogFileRequest]) (*connect.Response[v1.UploadLogFileResponse], error) DeleteLogFile(context.Context, *connect.Request[v1.DeleteLogFileRequest]) (*connect.Response[v1.DeleteLogFileResponse], error) + CreateImportRun(context.Context, *connect.Request[v1.CreateImportRunRequest]) (*connect.Response[v1.CreateImportRunResponse], error) + GetImportRun(context.Context, *connect.Request[v1.GetImportRunRequest]) (*connect.Response[v1.GetImportRunResponse], error) + ListImportRuns(context.Context, *connect.Request[v1.ListImportRunsRequest]) (*connect.Response[v1.ListImportRunsResponse], error) + ListRecentImportQueries(context.Context, *connect.Request[v1.ListRecentImportQueriesRequest]) (*connect.Response[v1.ListRecentImportQueriesResponse], error) CreateDiscoveryRun(context.Context, *connect.Request[v1.CreateDiscoveryRunRequest]) (*connect.Response[v1.CreateDiscoveryRunResponse], error) GetDiscoveryRun(context.Context, *connect.Request[v1.GetDiscoveryRunRequest]) (*connect.Response[v1.GetDiscoveryRunResponse], error) ListDiscoveryRuns(context.Context, *connect.Request[v1.ListDiscoveryRunsRequest]) (*connect.Response[v1.ListDiscoveryRunsResponse], error) @@ -144,6 +160,30 @@ func NewWorkspaceServiceClient(httpClient connect.HTTPClient, baseURL string, op connect.WithSchema(workspaceServiceMethods.ByName("DeleteLogFile")), connect.WithClientOptions(opts...), ), + createImportRun: connect.NewClient[v1.CreateImportRunRequest, v1.CreateImportRunResponse]( + httpClient, + baseURL+WorkspaceServiceCreateImportRunProcedure, + connect.WithSchema(workspaceServiceMethods.ByName("CreateImportRun")), + connect.WithClientOptions(opts...), + ), + getImportRun: connect.NewClient[v1.GetImportRunRequest, v1.GetImportRunResponse]( + httpClient, + baseURL+WorkspaceServiceGetImportRunProcedure, + connect.WithSchema(workspaceServiceMethods.ByName("GetImportRun")), + connect.WithClientOptions(opts...), + ), + listImportRuns: connect.NewClient[v1.ListImportRunsRequest, v1.ListImportRunsResponse]( + httpClient, + baseURL+WorkspaceServiceListImportRunsProcedure, + connect.WithSchema(workspaceServiceMethods.ByName("ListImportRuns")), + connect.WithClientOptions(opts...), + ), + listRecentImportQueries: connect.NewClient[v1.ListRecentImportQueriesRequest, v1.ListRecentImportQueriesResponse]( + httpClient, + baseURL+WorkspaceServiceListRecentImportQueriesProcedure, + connect.WithSchema(workspaceServiceMethods.ByName("ListRecentImportQueries")), + connect.WithClientOptions(opts...), + ), createDiscoveryRun: connect.NewClient[v1.CreateDiscoveryRunRequest, v1.CreateDiscoveryRunResponse]( httpClient, baseURL+WorkspaceServiceCreateDiscoveryRunProcedure, @@ -185,19 +225,23 @@ func NewWorkspaceServiceClient(httpClient connect.HTTPClient, baseURL string, op // workspaceServiceClient implements WorkspaceServiceClient. type workspaceServiceClient struct { - listWorkspaces *connect.Client[v1.ListWorkspacesRequest, v1.ListWorkspacesResponse] - getWorkspace *connect.Client[v1.GetWorkspaceRequest, v1.GetWorkspaceResponse] - createWorkspace *connect.Client[v1.CreateWorkspaceRequest, v1.CreateWorkspaceResponse] - deleteWorkspace *connect.Client[v1.DeleteWorkspaceRequest, v1.DeleteWorkspaceResponse] - listLogFiles *connect.Client[v1.ListLogFilesRequest, v1.ListLogFilesResponse] - uploadLogFile *connect.Client[v1.UploadLogFileRequest, v1.UploadLogFileResponse] - deleteLogFile *connect.Client[v1.DeleteLogFileRequest, v1.DeleteLogFileResponse] - createDiscoveryRun *connect.Client[v1.CreateDiscoveryRunRequest, v1.CreateDiscoveryRunResponse] - getDiscoveryRun *connect.Client[v1.GetDiscoveryRunRequest, v1.GetDiscoveryRunResponse] - listDiscoveryRuns *connect.Client[v1.ListDiscoveryRunsRequest, v1.ListDiscoveryRunsResponse] - listPatterns *connect.Client[v1.ListPatternsRequest, v1.ListPatternsResponse] - getPattern *connect.Client[v1.GetPatternRequest, v1.GetPatternResponse] - getErrorsView *connect.Client[v1.GetErrorsViewRequest, v1.GetErrorsViewResponse] + listWorkspaces *connect.Client[v1.ListWorkspacesRequest, v1.ListWorkspacesResponse] + getWorkspace *connect.Client[v1.GetWorkspaceRequest, v1.GetWorkspaceResponse] + createWorkspace *connect.Client[v1.CreateWorkspaceRequest, v1.CreateWorkspaceResponse] + deleteWorkspace *connect.Client[v1.DeleteWorkspaceRequest, v1.DeleteWorkspaceResponse] + listLogFiles *connect.Client[v1.ListLogFilesRequest, v1.ListLogFilesResponse] + uploadLogFile *connect.Client[v1.UploadLogFileRequest, v1.UploadLogFileResponse] + deleteLogFile *connect.Client[v1.DeleteLogFileRequest, v1.DeleteLogFileResponse] + createImportRun *connect.Client[v1.CreateImportRunRequest, v1.CreateImportRunResponse] + getImportRun *connect.Client[v1.GetImportRunRequest, v1.GetImportRunResponse] + listImportRuns *connect.Client[v1.ListImportRunsRequest, v1.ListImportRunsResponse] + listRecentImportQueries *connect.Client[v1.ListRecentImportQueriesRequest, v1.ListRecentImportQueriesResponse] + createDiscoveryRun *connect.Client[v1.CreateDiscoveryRunRequest, v1.CreateDiscoveryRunResponse] + getDiscoveryRun *connect.Client[v1.GetDiscoveryRunRequest, v1.GetDiscoveryRunResponse] + listDiscoveryRuns *connect.Client[v1.ListDiscoveryRunsRequest, v1.ListDiscoveryRunsResponse] + listPatterns *connect.Client[v1.ListPatternsRequest, v1.ListPatternsResponse] + getPattern *connect.Client[v1.GetPatternRequest, v1.GetPatternResponse] + getErrorsView *connect.Client[v1.GetErrorsViewRequest, v1.GetErrorsViewResponse] } // ListWorkspaces calls lapp.web.v1.WorkspaceService.ListWorkspaces. @@ -235,6 +279,26 @@ func (c *workspaceServiceClient) DeleteLogFile(ctx context.Context, req *connect return c.deleteLogFile.CallUnary(ctx, req) } +// CreateImportRun calls lapp.web.v1.WorkspaceService.CreateImportRun. +func (c *workspaceServiceClient) CreateImportRun(ctx context.Context, req *connect.Request[v1.CreateImportRunRequest]) (*connect.Response[v1.CreateImportRunResponse], error) { + return c.createImportRun.CallUnary(ctx, req) +} + +// GetImportRun calls lapp.web.v1.WorkspaceService.GetImportRun. +func (c *workspaceServiceClient) GetImportRun(ctx context.Context, req *connect.Request[v1.GetImportRunRequest]) (*connect.Response[v1.GetImportRunResponse], error) { + return c.getImportRun.CallUnary(ctx, req) +} + +// ListImportRuns calls lapp.web.v1.WorkspaceService.ListImportRuns. +func (c *workspaceServiceClient) ListImportRuns(ctx context.Context, req *connect.Request[v1.ListImportRunsRequest]) (*connect.Response[v1.ListImportRunsResponse], error) { + return c.listImportRuns.CallUnary(ctx, req) +} + +// ListRecentImportQueries calls lapp.web.v1.WorkspaceService.ListRecentImportQueries. +func (c *workspaceServiceClient) ListRecentImportQueries(ctx context.Context, req *connect.Request[v1.ListRecentImportQueriesRequest]) (*connect.Response[v1.ListRecentImportQueriesResponse], error) { + return c.listRecentImportQueries.CallUnary(ctx, req) +} + // CreateDiscoveryRun calls lapp.web.v1.WorkspaceService.CreateDiscoveryRun. func (c *workspaceServiceClient) CreateDiscoveryRun(ctx context.Context, req *connect.Request[v1.CreateDiscoveryRunRequest]) (*connect.Response[v1.CreateDiscoveryRunResponse], error) { return c.createDiscoveryRun.CallUnary(ctx, req) @@ -274,6 +338,10 @@ type WorkspaceServiceHandler interface { ListLogFiles(context.Context, *connect.Request[v1.ListLogFilesRequest]) (*connect.Response[v1.ListLogFilesResponse], error) UploadLogFile(context.Context, *connect.Request[v1.UploadLogFileRequest]) (*connect.Response[v1.UploadLogFileResponse], error) DeleteLogFile(context.Context, *connect.Request[v1.DeleteLogFileRequest]) (*connect.Response[v1.DeleteLogFileResponse], error) + CreateImportRun(context.Context, *connect.Request[v1.CreateImportRunRequest]) (*connect.Response[v1.CreateImportRunResponse], error) + GetImportRun(context.Context, *connect.Request[v1.GetImportRunRequest]) (*connect.Response[v1.GetImportRunResponse], error) + ListImportRuns(context.Context, *connect.Request[v1.ListImportRunsRequest]) (*connect.Response[v1.ListImportRunsResponse], error) + ListRecentImportQueries(context.Context, *connect.Request[v1.ListRecentImportQueriesRequest]) (*connect.Response[v1.ListRecentImportQueriesResponse], error) CreateDiscoveryRun(context.Context, *connect.Request[v1.CreateDiscoveryRunRequest]) (*connect.Response[v1.CreateDiscoveryRunResponse], error) GetDiscoveryRun(context.Context, *connect.Request[v1.GetDiscoveryRunRequest]) (*connect.Response[v1.GetDiscoveryRunResponse], error) ListDiscoveryRuns(context.Context, *connect.Request[v1.ListDiscoveryRunsRequest]) (*connect.Response[v1.ListDiscoveryRunsResponse], error) @@ -331,6 +399,30 @@ func NewWorkspaceServiceHandler(svc WorkspaceServiceHandler, opts ...connect.Han connect.WithSchema(workspaceServiceMethods.ByName("DeleteLogFile")), connect.WithHandlerOptions(opts...), ) + workspaceServiceCreateImportRunHandler := connect.NewUnaryHandler( + WorkspaceServiceCreateImportRunProcedure, + svc.CreateImportRun, + connect.WithSchema(workspaceServiceMethods.ByName("CreateImportRun")), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceGetImportRunHandler := connect.NewUnaryHandler( + WorkspaceServiceGetImportRunProcedure, + svc.GetImportRun, + connect.WithSchema(workspaceServiceMethods.ByName("GetImportRun")), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceListImportRunsHandler := connect.NewUnaryHandler( + WorkspaceServiceListImportRunsProcedure, + svc.ListImportRuns, + connect.WithSchema(workspaceServiceMethods.ByName("ListImportRuns")), + connect.WithHandlerOptions(opts...), + ) + workspaceServiceListRecentImportQueriesHandler := connect.NewUnaryHandler( + WorkspaceServiceListRecentImportQueriesProcedure, + svc.ListRecentImportQueries, + connect.WithSchema(workspaceServiceMethods.ByName("ListRecentImportQueries")), + connect.WithHandlerOptions(opts...), + ) workspaceServiceCreateDiscoveryRunHandler := connect.NewUnaryHandler( WorkspaceServiceCreateDiscoveryRunProcedure, svc.CreateDiscoveryRun, @@ -383,6 +475,14 @@ func NewWorkspaceServiceHandler(svc WorkspaceServiceHandler, opts ...connect.Han workspaceServiceUploadLogFileHandler.ServeHTTP(w, r) case WorkspaceServiceDeleteLogFileProcedure: workspaceServiceDeleteLogFileHandler.ServeHTTP(w, r) + case WorkspaceServiceCreateImportRunProcedure: + workspaceServiceCreateImportRunHandler.ServeHTTP(w, r) + case WorkspaceServiceGetImportRunProcedure: + workspaceServiceGetImportRunHandler.ServeHTTP(w, r) + case WorkspaceServiceListImportRunsProcedure: + workspaceServiceListImportRunsHandler.ServeHTTP(w, r) + case WorkspaceServiceListRecentImportQueriesProcedure: + workspaceServiceListRecentImportQueriesHandler.ServeHTTP(w, r) case WorkspaceServiceCreateDiscoveryRunProcedure: workspaceServiceCreateDiscoveryRunHandler.ServeHTTP(w, r) case WorkspaceServiceGetDiscoveryRunProcedure: @@ -432,6 +532,22 @@ func (UnimplementedWorkspaceServiceHandler) DeleteLogFile(context.Context, *conn return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.DeleteLogFile is not implemented")) } +func (UnimplementedWorkspaceServiceHandler) CreateImportRun(context.Context, *connect.Request[v1.CreateImportRunRequest]) (*connect.Response[v1.CreateImportRunResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.CreateImportRun is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) GetImportRun(context.Context, *connect.Request[v1.GetImportRunRequest]) (*connect.Response[v1.GetImportRunResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.GetImportRun is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) ListImportRuns(context.Context, *connect.Request[v1.ListImportRunsRequest]) (*connect.Response[v1.ListImportRunsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.ListImportRuns is not implemented")) +} + +func (UnimplementedWorkspaceServiceHandler) ListRecentImportQueries(context.Context, *connect.Request[v1.ListRecentImportQueriesRequest]) (*connect.Response[v1.ListRecentImportQueriesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.ListRecentImportQueries is not implemented")) +} + func (UnimplementedWorkspaceServiceHandler) CreateDiscoveryRun(context.Context, *connect.Request[v1.CreateDiscoveryRunRequest]) (*connect.Response[v1.CreateDiscoveryRunResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("lapp.web.v1.WorkspaceService.CreateDiscoveryRun is not implemented")) } diff --git a/pkg/webapp/import_service.go b/pkg/webapp/import_service.go new file mode 100644 index 0000000..8e4ea09 --- /dev/null +++ b/pkg/webapp/import_service.go @@ -0,0 +1,330 @@ +package webapp + +import ( + "context" + "fmt" + "log/slog" + "math" + "os" + "sort" + "strings" + "time" + + "connectrpc.com/connect" + "github.com/go-errors/errors" + "github.com/google/uuid" + webv1 "github.com/strrl/lapp/gen/go/lapp/web/v1" + "github.com/strrl/lapp/pkg/workspace" + "google.golang.org/protobuf/types/known/timestamppb" +) + +const defaultImportLimit = 100000 +const recentImportQueryLimit = 20 + +func (s *WorkspaceService) CreateImportRun(_ context.Context, req *connect.Request[webv1.CreateImportRunRequest]) (*connect.Response[webv1.CreateImportRunResponse], error) { + id, connectErr := workspaceIDFromName(req.Msg.Parent) + if connectErr != nil { + return nil, connectErr + } + if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { + return nil, connectErr + } + from, to, limit, connectErr := validateImportRunRequest(req.Msg) + if connectErr != nil { + return nil, connectErr + } + if s.importFetcher == nil { + return nil, connect.NewError(connect.CodeInternal, errors.New("import fetcher is not configured")) + } + + if !s.reserveRun(id) { + return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("another run is active")) + } + if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { + s.releaseRun(id) + return nil, connectErr + } + runID, err := uuid.NewV7() + if err != nil { + s.releaseRun(id) + return nil, connect.NewError(connect.CodeInternal, err) + } + record := workspace.ImportRunRecord{ + ID: runID.String(), + Provider: "gcp", + Project: req.Msg.Project, + Filter: req.Msg.Filter, + From: from, + To: to, + Limit: limit, + State: workspace.ImportRunStateQueued, + StartedAt: time.Now().UTC(), + } + if err := workspace.WriteImportRunRecord(s.workspaceDir(id), record); err != nil { + s.releaseRun(id) + return nil, connect.NewError(connect.CodeInternal, err) + } + message, err := s.importRunMessage(id, record) + if err != nil { + s.releaseRun(id) + return nil, connect.NewError(connect.CodeInternal, err) + } + + go func() { + defer s.releaseRun(id) + _, err := workspace.RunImport(context.Background(), workspace.ImportConfig{ + Dir: s.workspaceDir(id), + RunID: record.ID, + Provider: record.Provider, + Project: record.Project, + Filter: record.Filter, + From: record.From, + To: record.To, + Limit: record.Limit, + Fetcher: s.importFetcher, + }) + if err != nil { + slog.Error("ImportRun failed", "workspace", id, "run", record.ID, "error", err) + return + } + }() + + return connect.NewResponse(&webv1.CreateImportRunResponse{ + ImportRun: message, + }), nil +} + +func validateImportRunRequest(req *webv1.CreateImportRunRequest) (from, to time.Time, limit int, connectErr *connect.Error) { + if strings.TrimSpace(req.Project) == "" { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.New("project must not be blank")) + } + if req.From == nil || req.To == nil { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.New("from and to are required")) + } + if err := req.From.CheckValid(); err != nil { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid from timestamp: %w", err)) + } + if err := req.To.CheckValid(); err != nil { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid to timestamp: %w", err)) + } + from = req.From.AsTime().UTC() + to = req.To.AsTime().UTC() + if from.After(to) { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.New("from must not be after to")) + } + if req.Limit < 0 { + return time.Time{}, time.Time{}, 0, connect.NewError(connect.CodeInvalidArgument, errors.New("limit must not be negative")) + } + limit = int(req.Limit) + if limit == 0 { + limit = defaultImportLimit + } + return from, to, limit, nil +} + +func (s *WorkspaceService) GetImportRun(_ context.Context, req *connect.Request[webv1.GetImportRunRequest]) (*connect.Response[webv1.GetImportRunResponse], error) { + id, runID, connectErr := importRunNameFromResource(req.Msg.Name) + if connectErr != nil { + return nil, connectErr + } + record, err := workspace.ReadImportRunRecord(s.workspaceDir(id), runID) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, connect.NewError(connect.CodeNotFound, err) + } + return nil, connect.NewError(connect.CodeInternal, err) + } + message, err := s.importRunMessage(id, record) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + return connect.NewResponse(&webv1.GetImportRunResponse{ + ImportRun: message, + }), nil +} + +func (s *WorkspaceService) ListImportRuns(_ context.Context, req *connect.Request[webv1.ListImportRunsRequest]) (*connect.Response[webv1.ListImportRunsResponse], error) { + id, connectErr := workspaceIDFromName(req.Msg.Parent) + if connectErr != nil { + return nil, connectErr + } + if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { + return nil, connectErr + } + records, err := workspace.ListImportRunRecords(s.workspaceDir(id)) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + sort.Slice(records, func(i, j int) bool { + if records[i].StartedAt.Equal(records[j].StartedAt) { + return records[i].ID > records[j].ID + } + return records[i].StartedAt.After(records[j].StartedAt) + }) + runs := make([]*webv1.ImportRun, 0, len(records)) + for _, record := range records { + message, err := s.importRunMessage(id, record) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + runs = append(runs, message) + } + return connect.NewResponse(&webv1.ListImportRunsResponse{ImportRuns: runs}), nil +} + +func (s *WorkspaceService) ListRecentImportQueries(_ context.Context, _ *connect.Request[webv1.ListRecentImportQueriesRequest]) (*connect.Response[webv1.ListRecentImportQueriesResponse], error) { + entries, err := os.ReadDir(s.root) + if err != nil { + if os.IsNotExist(err) { + return connect.NewResponse(&webv1.ListRecentImportQueriesResponse{}), nil + } + return nil, connect.NewError(connect.CodeInternal, err) + } + + type queryKey struct { + project string + filter string + } + latest := make(map[queryKey]time.Time) + for _, entry := range entries { + if !entry.IsDir() { + continue + } + records, err := workspace.ListImportRunRecords(s.workspaceDir(entry.Name())) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + for _, record := range records { + key := queryKey{project: record.Project, filter: record.Filter} + if usedAt, ok := latest[key]; !ok || record.StartedAt.After(usedAt) { + latest[key] = record.StartedAt + } + } + } + + queries := make([]*webv1.RecentImportQuery, 0, len(latest)) + for key, usedAt := range latest { + queries = append(queries, &webv1.RecentImportQuery{ + Project: key.project, + Filter: key.filter, + LastUsedAt: timestamppb.New(usedAt), + }) + } + sort.Slice(queries, func(i, j int) bool { + leftTime := queries[i].LastUsedAt.AsTime() + rightTime := queries[j].LastUsedAt.AsTime() + if !leftTime.Equal(rightTime) { + return leftTime.After(rightTime) + } + if queries[i].Project != queries[j].Project { + return queries[i].Project < queries[j].Project + } + return queries[i].Filter < queries[j].Filter + }) + if len(queries) > recentImportQueryLimit { + queries = queries[:recentImportQueryLimit] + } + return connect.NewResponse(&webv1.ListRecentImportQueriesResponse{RecentQueries: queries}), nil +} + +func (s *WorkspaceService) importRunMessage(workspaceID string, record workspace.ImportRunRecord) (*webv1.ImportRun, error) { + limit, err := importRunInt32("limit", record.Limit) + if err != nil { + return nil, err + } + entryCount, err := importRunInt32("entry count", record.EntryCount) + if err != nil { + return nil, err + } + msg := &webv1.ImportRun{ + Name: fmt.Sprintf("%s/importRuns/%s", workspaceName(workspaceID), record.ID), + ImportRunId: record.ID, + Provider: record.Provider, + Project: record.Project, + Filter: record.Filter, + From: timestamppb.New(record.From), + To: timestamppb.New(record.To), + Limit: limit, + State: importRunState(record.State), + EntryCount: entryCount, + Truncated: record.Truncated, + LogFileName: record.LogFileName, + StartedAt: timestamppb.New(record.StartedAt), + } + if record.FinishedAt != nil { + msg.FinishedAt = timestamppb.New(*record.FinishedAt) + } + if record.Error != nil { + msg.Error = &webv1.ImportRunError{ + Code: record.Error.Code, + Message: record.Error.Message, + } + } + return msg, nil +} + +func importRunInt32(field string, value int) (int32, error) { + if value < math.MinInt32 || value > math.MaxInt32 { + return 0, errors.Errorf("import run %s %d is outside int32 range", field, value) + } + return int32(value), nil +} + +func (s *WorkspaceService) recoverInterruptedImportRuns() error { + entries, err := os.ReadDir(s.root) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return errors.Errorf("read workspace root: %w", err) + } + for _, entry := range entries { + if !entry.IsDir() { + continue + } + workspaceDir := s.workspaceDir(entry.Name()) + records, err := workspace.ListImportRunRecords(workspaceDir) + if err != nil { + return errors.Errorf("list import runs for %s: %w", entry.Name(), err) + } + for _, record := range records { + if record.State != workspace.ImportRunStateQueued && record.State != workspace.ImportRunStateRunning { + continue + } + finishedAt := time.Now().UTC() + record.State = workspace.ImportRunStateFailed + record.FinishedAt = &finishedAt + record.Error = &workspace.ImportRunError{ + Code: "IMPORT_INTERRUPTED", + Message: "Import did not complete before the web server stopped", + } + if err := workspace.WriteImportRunRecord(workspaceDir, record); err != nil { + return errors.Errorf("mark import run %s interrupted: %w", record.ID, err) + } + } + } + return nil +} + +func importRunNameFromResource(name string) (workspaceID, runID string, err *connect.Error) { + parts := strings.Split(strings.Trim(name, "/"), "/") + if len(parts) == 4 && parts[0] == "workspaces" && parts[2] == "importRuns" && validResourcePart(parts[1]) && validResourcePart(parts[3]) { + return parts[1], parts[3], nil + } + return "", "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid import run name %q", name)) +} + +func importRunState(state workspace.ImportRunState) webv1.ImportRunState { + switch state { + case workspace.ImportRunStateQueued: + return webv1.ImportRunState_IMPORT_RUN_STATE_QUEUED + case workspace.ImportRunStateRunning: + return webv1.ImportRunState_IMPORT_RUN_STATE_RUNNING + case workspace.ImportRunStateSucceeded: + return webv1.ImportRunState_IMPORT_RUN_STATE_SUCCEEDED + case workspace.ImportRunStateFailed: + return webv1.ImportRunState_IMPORT_RUN_STATE_FAILED + default: + return webv1.ImportRunState_IMPORT_RUN_STATE_UNSPECIFIED + } +} diff --git a/pkg/webapp/import_service_test.go b/pkg/webapp/import_service_test.go new file mode 100644 index 0000000..d7fb7b9 --- /dev/null +++ b/pkg/webapp/import_service_test.go @@ -0,0 +1,544 @@ +package webapp + +import ( + "context" + stderrors "errors" + "fmt" + "os" + "path/filepath" + "testing" + "time" + + "connectrpc.com/connect" + webv1 "github.com/strrl/lapp/gen/go/lapp/web/v1" + "github.com/strrl/lapp/pkg/semantic" + "github.com/strrl/lapp/pkg/workspace" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestCreateImportRunRejectsInvalidRequestWithoutRecord(t *testing.T) { + root := t.TempDir() + service, err := NewWorkspaceService(ServiceConfig{ + Root: root, + ImportFetcher: func(context.Context, workspace.ImportRequest) (workspace.ImportFetchResult, error) { + t.Fatal("fetcher must not run") + return workspace.ImportFetchResult{}, nil + }, + }) + if err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + created, err := service.CreateWorkspace(context.Background(), connect.NewRequest(&webv1.CreateWorkspaceRequest{ + WorkspaceId: "imports", + })) + if err != nil { + t.Fatalf("CreateWorkspace: %v", err) + } + workspaceName := created.Msg.Workspace.Name + from := timestamppb.New(time.Date(2026, 7, 25, 0, 0, 0, 0, time.UTC)) + to := timestamppb.New(time.Date(2026, 7, 25, 1, 0, 0, 0, time.UTC)) + + tests := []struct { + name string + req *webv1.CreateImportRunRequest + code connect.Code + }{ + { + name: "blank project", + req: &webv1.CreateImportRunRequest{ + Parent: workspaceName, + Project: " \t ", + From: from, + To: to, + }, + code: connect.CodeInvalidArgument, + }, + { + name: "missing from", + req: &webv1.CreateImportRunRequest{ + Parent: workspaceName, + Project: "acme-prod", + To: to, + }, + code: connect.CodeInvalidArgument, + }, + { + name: "missing to", + req: &webv1.CreateImportRunRequest{ + Parent: workspaceName, + Project: "acme-prod", + From: from, + }, + code: connect.CodeInvalidArgument, + }, + { + name: "from after to", + req: &webv1.CreateImportRunRequest{ + Parent: workspaceName, + Project: "acme-prod", + From: to, + To: from, + }, + code: connect.CodeInvalidArgument, + }, + { + name: "negative limit", + req: &webv1.CreateImportRunRequest{ + Parent: workspaceName, + Project: "acme-prod", + From: from, + To: to, + Limit: -1, + }, + code: connect.CodeInvalidArgument, + }, + { + name: "unknown workspace", + req: &webv1.CreateImportRunRequest{ + Parent: "workspaces/missing", + Project: "acme-prod", + From: from, + To: to, + }, + code: connect.CodeNotFound, + }, + { + name: "unsafe workspace", + req: &webv1.CreateImportRunRequest{ + Parent: "workspaces/..", + Project: "acme-prod", + From: from, + To: to, + }, + code: connect.CodeInvalidArgument, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if _, err := service.CreateImportRun(context.Background(), connect.NewRequest(test.req)); connect.CodeOf(err) != test.code { + t.Fatalf("CreateImportRun code = %s, want %s: %v", connect.CodeOf(err), test.code, err) + } + records, err := workspace.ListImportRunRecords(service.workspaceDir("imports")) + if err != nil { + t.Fatalf("ListImportRunRecords: %v", err) + } + if len(records) != 0 { + t.Fatalf("validation wrote records: %+v", records) + } + }) + } +} + +func TestWorkspaceServiceImportRunAsyncSuccess(t *testing.T) { + fetchStarted := make(chan struct{}) + releaseFetch := make(chan struct{}) + line := `{"ts":"2026-07-25T00:00:01Z","severity":"ERROR","payload":{"message":"failed request"}}` + service, workspaceName := newImportTestService(t, func(_ context.Context, req workspace.ImportRequest) (workspace.ImportFetchResult, error) { + if req.Limit != defaultImportLimit { + t.Errorf("fetch limit = %d, want %d", req.Limit, defaultImportLimit) + } + close(fetchStarted) + <-releaseFetch + return workspace.ImportFetchResult{Lines: []string{line}}, nil + }) + + response, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(workspaceName))) + if err != nil { + t.Fatalf("CreateImportRun: %v", err) + } + runName := response.Msg.ImportRun.Name + if runName == "" { + t.Fatal("CreateImportRun returned an empty run name") + } + if response.Msg.ImportRun.Limit != defaultImportLimit { + t.Fatalf("run limit = %d, want %d", response.Msg.ImportRun.Limit, defaultImportLimit) + } + + immediate, err := service.GetImportRun(context.Background(), connect.NewRequest(&webv1.GetImportRunRequest{Name: runName})) + if err != nil { + t.Fatalf("GetImportRun immediately after create: %v", err) + } + if immediate.Msg.ImportRun.Name != runName { + t.Fatalf("GetImportRun name = %q, want %q", immediate.Msg.ImportRun.Name, runName) + } + select { + case <-fetchStarted: + case <-time.After(2 * time.Second): + t.Fatal("fetcher did not start") + } + + close(releaseFetch) + run := waitForImportRunState(t, service, runName, webv1.ImportRunState_IMPORT_RUN_STATE_SUCCEEDED) + if run.EntryCount != 1 || run.LogFileName == "" || run.Truncated { + t.Fatalf("unexpected terminal run: %+v", run) + } + record, err := workspace.ReadImportRunRecord(service.workspaceDir("imports"), run.ImportRunId) + if err != nil { + t.Fatalf("ReadImportRunRecord: %v", err) + } + if int(run.EntryCount) != record.EntryCount || run.LogFileName != record.LogFileName { + t.Fatalf("response and record disagree: run %+v, record %+v", run, record) + } + content, err := os.ReadFile(filepath.Join(service.workspaceDir("imports"), "logs", run.LogFileName)) + if err != nil { + t.Fatalf("read imported log: %v", err) + } + if string(content) != line+"\n" { + t.Fatalf("imported log content = %q", content) + } +} + +func TestWorkspaceServiceImportRunFailure(t *testing.T) { + service, workspaceName := newImportTestService(t, func(context.Context, workspace.ImportRequest) (workspace.ImportFetchResult, error) { + return workspace.ImportFetchResult{}, stderrors.New("cloud logging unavailable") + }) + + response, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(workspaceName))) + if err != nil { + t.Fatalf("CreateImportRun: %v", err) + } + run := waitForImportRunState(t, service, response.Msg.ImportRun.Name, webv1.ImportRunState_IMPORT_RUN_STATE_FAILED) + if run.Error == nil || run.Error.Code != "FETCH_FAILED" { + t.Fatalf("unexpected import error: %+v", run.Error) + } + if run.FinishedAt == nil { + t.Fatal("failed run has no finished_at") + } +} + +func TestWorkspaceServiceImportRunTruncation(t *testing.T) { + service, workspaceName := newImportTestService(t, func(context.Context, workspace.ImportRequest) (workspace.ImportFetchResult, error) { + return workspace.ImportFetchResult{ + Lines: []string{`{"payload":{"message":"one"}}`}, + Truncated: true, + }, nil + }) + + response, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(workspaceName))) + if err != nil { + t.Fatalf("CreateImportRun: %v", err) + } + run := waitForImportRunState(t, service, response.Msg.ImportRun.Name, webv1.ImportRunState_IMPORT_RUN_STATE_SUCCEEDED) + if !run.Truncated { + t.Fatalf("expected truncated run: %+v", run) + } +} + +func TestWorkspaceServiceListImportRunsNewestFirst(t *testing.T) { + root := t.TempDir() + workspaceDir := filepath.Join(root, "imports") + mustMkdir(t, filepath.Join(workspaceDir, "logs")) + oldTime := time.Date(2026, 7, 25, 0, 0, 0, 0, time.UTC) + newTime := oldTime.Add(time.Hour) + writeImportRecord(t, workspaceDir, "old", "old-project", "", oldTime, workspace.ImportRunStateSucceeded) + writeImportRecord(t, workspaceDir, "same-a", "first-new-project", "", newTime, workspace.ImportRunStateSucceeded) + writeImportRecord(t, workspaceDir, "same-b", "second-new-project", "", newTime, workspace.ImportRunStateSucceeded) + + service, err := NewWorkspaceService(ServiceConfig{Root: root}) + if err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + response, err := service.ListImportRuns(context.Background(), connect.NewRequest(&webv1.ListImportRunsRequest{ + Parent: "workspaces/imports", + })) + if err != nil { + t.Fatalf("ListImportRuns: %v", err) + } + if len(response.Msg.ImportRuns) != 3 { + t.Fatalf("ListImportRuns count = %d, want 3", len(response.Msg.ImportRuns)) + } + if response.Msg.ImportRuns[0].ImportRunId != "same-b" || + response.Msg.ImportRuns[1].ImportRunId != "same-a" || + response.Msg.ImportRuns[2].ImportRunId != "old" { + t.Fatalf("unexpected run order: %+v", response.Msg.ImportRuns) + } +} + +func TestWorkspaceServiceRunMutualExclusion(t *testing.T) { + importStarted := make(chan struct{}) + releaseImport := make(chan struct{}) + discoveryStarted := make(chan struct{}) + releaseDiscovery := make(chan struct{}) + service, err := NewWorkspaceService(ServiceConfig{ + Root: t.TempDir(), + ImportFetcher: func(context.Context, workspace.ImportRequest) (workspace.ImportFetchResult, error) { + close(importStarted) + <-releaseImport + return workspace.ImportFetchResult{}, nil + }, + Labeler: func(_ context.Context, _ semantic.Config, inputs []semantic.PatternInput) ([]semantic.SemanticLabel, error) { + close(discoveryStarted) + <-releaseDiscovery + labels := make([]semantic.SemanticLabel, 0, len(inputs)) + for _, input := range inputs { + labels = append(labels, semantic.SemanticLabel{ + PatternUUIDString: input.PatternUUIDString, + SemanticID: "request-failed", + Description: "Request failed", + }) + } + return labels, nil + }, + }) + if err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + importWorkspace := createWorkspaceWithLog(t, service, "import-busy") + discoveryWorkspace := createWorkspaceWithLog(t, service, "discovery-busy") + + importResponse, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(importWorkspace))) + if err != nil { + t.Fatalf("CreateImportRun: %v", err) + } + select { + case <-importStarted: + case <-time.After(2 * time.Second): + t.Fatal("import fetcher did not start") + } + + failedPreconditions := []struct { + name string + call func() error + }{ + { + name: "second import", + call: func() error { + _, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(importWorkspace))) + return err + }, + }, + { + name: "discovery", + call: func() error { + _, err := service.CreateDiscoveryRun(context.Background(), connect.NewRequest(&webv1.CreateDiscoveryRunRequest{Parent: importWorkspace})) + return err + }, + }, + { + name: "upload", + call: func() error { + _, err := service.UploadLogFile(context.Background(), connect.NewRequest(&webv1.UploadLogFileRequest{ + Parent: importWorkspace, + FileName: "other.log", + Content: []byte("other\n"), + })) + return err + }, + }, + { + name: "delete log", + call: func() error { + _, err := service.DeleteLogFile(context.Background(), connect.NewRequest(&webv1.DeleteLogFileRequest{ + Name: importWorkspace + "/logFiles/app.log", + })) + return err + }, + }, + { + name: "delete workspace", + call: func() error { + _, err := service.DeleteWorkspace(context.Background(), connect.NewRequest(&webv1.DeleteWorkspaceRequest{Name: importWorkspace})) + return err + }, + }, + } + for _, test := range failedPreconditions { + t.Run("import blocks "+test.name, func(t *testing.T) { + if err := test.call(); connect.CodeOf(err) != connect.CodeFailedPrecondition { + t.Fatalf("code = %s, want failed_precondition: %v", connect.CodeOf(err), err) + } + }) + } + + close(releaseImport) + waitForImportRunState(t, service, importResponse.Msg.ImportRun.Name, webv1.ImportRunState_IMPORT_RUN_STATE_SUCCEEDED) + + discoveryResponse, err := service.CreateDiscoveryRun(context.Background(), connect.NewRequest(&webv1.CreateDiscoveryRunRequest{ + Parent: discoveryWorkspace, + })) + if err != nil { + t.Fatalf("CreateDiscoveryRun: %v", err) + } + select { + case <-discoveryStarted: + case <-time.After(2 * time.Second): + t.Fatal("discovery labeler did not start") + } + if _, err := service.CreateImportRun(context.Background(), connect.NewRequest(validImportRequest(discoveryWorkspace))); connect.CodeOf(err) != connect.CodeFailedPrecondition { + t.Fatalf("CreateImportRun during discovery code = %s, want failed_precondition: %v", connect.CodeOf(err), err) + } + close(releaseDiscovery) + waitForRunState(t, service, discoveryResponse.Msg.DiscoveryRun.Name, webv1.DiscoveryRunState_DISCOVERY_RUN_STATE_SUCCEEDED) +} + +func TestNewWorkspaceServiceMarksInterruptedImportRunsFailed(t *testing.T) { + root := t.TempDir() + workspaceDir := filepath.Join(root, "imports") + mustMkdir(t, filepath.Join(workspaceDir, "logs")) + startedAt := time.Now().Add(-time.Minute).UTC() + writeImportRecord(t, workspaceDir, "queued", "acme-prod", "severity>=ERROR", startedAt, workspace.ImportRunStateQueued) + writeImportRecord(t, workspaceDir, "running", "acme-prod", "severity>=ERROR", startedAt, workspace.ImportRunStateRunning) + writeImportRecord(t, workspaceDir, "succeeded", "acme-prod", "severity>=ERROR", startedAt, workspace.ImportRunStateSucceeded) + + if _, err := NewWorkspaceService(ServiceConfig{Root: root}); err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + for _, id := range []string{"queued", "running"} { + record, err := workspace.ReadImportRunRecord(workspaceDir, id) + if err != nil { + t.Fatalf("ReadImportRunRecord %s: %v", id, err) + } + if record.State != workspace.ImportRunStateFailed || record.FinishedAt == nil { + t.Fatalf("interrupted run %s was not failed: %+v", id, record) + } + if record.Error == nil || record.Error.Code != "IMPORT_INTERRUPTED" { + t.Fatalf("unexpected interrupted error for %s: %+v", id, record.Error) + } + } + record, err := workspace.ReadImportRunRecord(workspaceDir, "succeeded") + if err != nil { + t.Fatalf("ReadImportRunRecord succeeded: %v", err) + } + if record.State != workspace.ImportRunStateSucceeded { + t.Fatalf("succeeded run changed state: %+v", record) + } +} + +func TestWorkspaceServiceListRecentImportQueries(t *testing.T) { + root := t.TempDir() + firstDir := filepath.Join(root, "first") + secondDir := filepath.Join(root, "second") + mustMkdir(t, filepath.Join(firstDir, "logs")) + mustMkdir(t, filepath.Join(secondDir, "logs")) + base := time.Date(2026, 7, 25, 0, 0, 0, 0, time.UTC) + writeImportRecord(t, firstDir, "duplicate-old", "acme-prod", "severity>=ERROR", base, workspace.ImportRunStateSucceeded) + writeImportRecord(t, secondDir, "other", "billing-prod", "resource.type=\"cloud_run_revision\"", base.Add(time.Hour), workspace.ImportRunStateSucceeded) + writeImportRecord(t, secondDir, "duplicate-new", "acme-prod", "severity>=ERROR", base.Add(2*time.Hour), workspace.ImportRunStateSucceeded) + + service, err := NewWorkspaceService(ServiceConfig{Root: root}) + if err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + response, err := service.ListRecentImportQueries(context.Background(), connect.NewRequest(&webv1.ListRecentImportQueriesRequest{})) + if err != nil { + t.Fatalf("ListRecentImportQueries: %v", err) + } + if len(response.Msg.RecentQueries) != 2 { + t.Fatalf("recent query count = %d, want 2", len(response.Msg.RecentQueries)) + } + if response.Msg.RecentQueries[0].Project != "acme-prod" || response.Msg.RecentQueries[0].Filter != "severity>=ERROR" { + t.Fatalf("unexpected first query: %+v", response.Msg.RecentQueries[0]) + } + if !response.Msg.RecentQueries[0].LastUsedAt.AsTime().Equal(base.Add(2 * time.Hour)) { + t.Fatalf("duplicate last_used_at = %s, want %s", response.Msg.RecentQueries[0].LastUsedAt.AsTime(), base.Add(2*time.Hour)) + } + if response.Msg.RecentQueries[1].Project != "billing-prod" { + t.Fatalf("unexpected second query: %+v", response.Msg.RecentQueries[1]) + } + + for index := range 25 { + writeImportRecord( + t, + firstDir, + fmt.Sprintf("extra-%02d", index), + fmt.Sprintf("project-%02d", index), + "", + base.Add(-time.Duration(index+1)*time.Hour), + workspace.ImportRunStateSucceeded, + ) + } + response, err = service.ListRecentImportQueries(context.Background(), connect.NewRequest(&webv1.ListRecentImportQueriesRequest{})) + if err != nil { + t.Fatalf("ListRecentImportQueries after extra records: %v", err) + } + if len(response.Msg.RecentQueries) != recentImportQueryLimit { + t.Fatalf("recent query count = %d, want %d", len(response.Msg.RecentQueries), recentImportQueryLimit) + } +} + +func newImportTestService(t *testing.T, fetcher workspace.ImportFetcher) (service *WorkspaceService, name string) { + t.Helper() + service, err := NewWorkspaceService(ServiceConfig{ + Root: t.TempDir(), + ImportFetcher: fetcher, + }) + if err != nil { + t.Fatalf("NewWorkspaceService: %v", err) + } + created, err := service.CreateWorkspace(context.Background(), connect.NewRequest(&webv1.CreateWorkspaceRequest{ + WorkspaceId: "imports", + })) + if err != nil { + t.Fatalf("CreateWorkspace: %v", err) + } + return service, created.Msg.Workspace.Name +} + +func validImportRequest(parent string) *webv1.CreateImportRunRequest { + return &webv1.CreateImportRunRequest{ + Parent: parent, + Project: "acme-prod", + Filter: "severity>=ERROR", + From: timestamppb.New(time.Date(2026, 7, 25, 0, 0, 0, 0, time.UTC)), + To: timestamppb.New(time.Date(2026, 7, 25, 1, 0, 0, 0, time.UTC)), + } +} + +func createWorkspaceWithLog(t *testing.T, service *WorkspaceService, id string) string { + t.Helper() + created, err := service.CreateWorkspace(context.Background(), connect.NewRequest(&webv1.CreateWorkspaceRequest{ + WorkspaceId: id, + })) + if err != nil { + t.Fatalf("CreateWorkspace: %v", err) + } + name := created.Msg.Workspace.Name + if _, err := service.UploadLogFile(context.Background(), connect.NewRequest(&webv1.UploadLogFileRequest{ + Parent: name, + FileName: "app.log", + Content: []byte("2026-07-25T00:00:01Z ERROR request failed id=1\n2026-07-25T00:00:02Z ERROR request failed id=2\n"), + })); err != nil { + t.Fatalf("UploadLogFile: %v", err) + } + return name +} + +func writeImportRecord(t *testing.T, dir, id, project, filter string, startedAt time.Time, state workspace.ImportRunState) { + t.Helper() + record := workspace.ImportRunRecord{ + ID: id, + Provider: "gcp", + Project: project, + Filter: filter, + From: startedAt.Add(-time.Hour), + To: startedAt, + Limit: defaultImportLimit, + State: state, + StartedAt: startedAt, + } + if state == workspace.ImportRunStateSucceeded || state == workspace.ImportRunStateFailed { + finishedAt := startedAt.Add(time.Minute) + record.FinishedAt = &finishedAt + } + if err := workspace.WriteImportRunRecord(dir, record); err != nil { + t.Fatalf("WriteImportRunRecord: %v", err) + } +} + +func waitForImportRunState(t *testing.T, service *WorkspaceService, runName string, state webv1.ImportRunState) *webv1.ImportRun { + t.Helper() + deadline := time.Now().Add(5 * time.Second) + for time.Now().Before(deadline) { + response, err := service.GetImportRun(context.Background(), connect.NewRequest(&webv1.GetImportRunRequest{Name: runName})) + if err != nil { + t.Fatalf("GetImportRun: %v", err) + } + if response.Msg.ImportRun.State == state { + return response.Msg.ImportRun + } + time.Sleep(20 * time.Millisecond) + } + t.Fatalf("import run did not reach %s", state) + return nil +} diff --git a/pkg/webapp/server.go b/pkg/webapp/server.go index 1056343..7408411 100644 --- a/pkg/webapp/server.go +++ b/pkg/webapp/server.go @@ -1,6 +1,7 @@ package webapp import ( + "context" "embed" "io/fs" "mime" @@ -11,6 +12,8 @@ import ( "github.com/go-errors/errors" "github.com/strrl/lapp/gen/go/lapp/web/v1/webv1connect" + "github.com/strrl/lapp/pkg/gcplog" + "github.com/strrl/lapp/pkg/workspace" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) @@ -31,6 +34,22 @@ func NewHandler(config ServerConfig) (http.Handler, error) { Root: config.Root, APIKey: config.APIKey, Model: config.Model, + ImportFetcher: func(ctx context.Context, req workspace.ImportRequest) (workspace.ImportFetchResult, error) { + fetched, err := gcplog.FetchLines(ctx, gcplog.FetchRequest{ + Project: req.Project, + Filter: req.Filter, + From: req.From, + To: req.To, + Limit: req.Limit, + }) + if err != nil { + return workspace.ImportFetchResult{}, err + } + return workspace.ImportFetchResult{ + Lines: fetched.Lines, + Truncated: fetched.Truncated, + }, nil + }, }) if err != nil { return nil, err diff --git a/pkg/webapp/service.go b/pkg/webapp/service.go index c3ad56d..fea60fc 100644 --- a/pkg/webapp/service.go +++ b/pkg/webapp/service.go @@ -27,19 +27,21 @@ var workspaceIDPattern = regexp.MustCompile(`[^a-z0-9]+`) var errorLikePattern = regexp.MustCompile(`(?i)(error|warn|fatal|panic|exception|failed|timeout)`) type WorkspaceService struct { - root string - apiKey string - model string - mu sync.Mutex - running map[string]bool - labeler workspace.PatternLabeler + root string + apiKey string + model string + mu sync.Mutex + activeRuns map[string]bool + labeler workspace.PatternLabeler + importFetcher workspace.ImportFetcher } type ServiceConfig struct { - Root string - APIKey string - Model string - Labeler workspace.PatternLabeler + Root string + APIKey string + Model string + Labeler workspace.PatternLabeler + ImportFetcher workspace.ImportFetcher } func NewWorkspaceService(config ServiceConfig) (*WorkspaceService, error) { @@ -52,15 +54,19 @@ func NewWorkspaceService(config ServiceConfig) (*WorkspaceService, error) { root = filepath.Join(home, ".lapp", "workspaces") } service := &WorkspaceService{ - root: root, - apiKey: config.APIKey, - model: config.Model, - running: make(map[string]bool), - labeler: config.Labeler, + root: root, + apiKey: config.APIKey, + model: config.Model, + activeRuns: make(map[string]bool), + labeler: config.Labeler, + importFetcher: config.ImportFetcher, } if err := service.recoverInterruptedDiscoveryRuns(); err != nil { return nil, err } + if err := service.recoverInterruptedImportRuns(); err != nil { + return nil, err + } return service, nil } @@ -132,12 +138,10 @@ func (s *WorkspaceService) DeleteWorkspace(_ context.Context, req *connect.Reque if connectErr != nil { return nil, connectErr } - s.mu.Lock() - running := s.running[id] - s.mu.Unlock() - if running { - return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("discovery is running")) + if !s.reserveRun(id) { + return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("another run is active")) } + defer s.releaseRun(id) if err := os.RemoveAll(s.workspaceDir(id)); err != nil { return nil, connect.NewError(connect.CodeInternal, err) } @@ -164,12 +168,13 @@ func (s *WorkspaceService) UploadLogFile(_ context.Context, req *connect.Request if connectErr != nil { return nil, connectErr } + if !s.reserveRun(id) { + return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("another run is active")) + } + defer s.releaseRun(id) if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { return nil, connectErr } - if s.isRunning(id) { - return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("discovery is running")) - } fileName := filepath.Base(req.Msg.FileName) if fileName == "." || fileName == string(filepath.Separator) || fileName == "" { return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("file_name is required")) @@ -195,12 +200,13 @@ func (s *WorkspaceService) DeleteLogFile(_ context.Context, req *connect.Request if connectErr != nil { return nil, connectErr } + if !s.reserveRun(id) { + return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("another run is active")) + } + defer s.releaseRun(id) if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { return nil, connectErr } - if s.isRunning(id) { - return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("discovery is running")) - } if err := os.Remove(filepath.Join(s.workspaceDir(id), "logs", fileName)); err != nil { if os.IsNotExist(err) { return nil, connect.NewError(connect.CodeNotFound, err) @@ -218,19 +224,25 @@ func (s *WorkspaceService) CreateDiscoveryRun(_ context.Context, req *connect.Re if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { return nil, connectErr } + if !s.reserveRun(id) { + return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("another run is active")) + } + if connectErr := s.ensureWorkspaceExists(id); connectErr != nil { + s.releaseRun(id) + return nil, connectErr + } files, err := s.listLogFileMessages(id) if err != nil { + s.releaseRun(id) return nil, connect.NewError(connect.CodeInternal, err) } if len(files) == 0 { + s.releaseRun(id) return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("discovery requires at least one log file")) } - if !s.reserveDiscovery(id) { - return nil, connect.NewError(connect.CodeFailedPrecondition, errors.New("discovery is already running")) - } runID, uuidErr := uuid.NewV7() if uuidErr != nil { - s.setRunning(id, false) + s.releaseRun(id) return nil, connect.NewError(connect.CodeInternal, uuidErr) } record := workspace.DiscoveryRunRecord{ @@ -243,11 +255,11 @@ func (s *WorkspaceService) CreateDiscoveryRun(_ context.Context, req *connect.Re StartedAt: time.Now().UTC(), } if err := workspace.WriteDiscoveryRunRecord(s.workspaceDir(id), record); err != nil { - s.setRunning(id, false) + s.releaseRun(id) return nil, connect.NewError(connect.CodeInternal, err) } go func() { - defer s.setRunning(id, false) + defer s.releaseRun(id) slog.Info("DiscoveryRun started", "workspace", id, "run", runID.String()) result, err := workspace.Discover(context.Background(), workspace.DiscoveryConfig{ Dir: s.workspaceDir(id), @@ -552,30 +564,20 @@ func (s *WorkspaceService) ensureWorkspaceExists(id string) *connect.Error { return nil } -func (s *WorkspaceService) isRunning(id string) bool { +func (s *WorkspaceService) reserveRun(id string) bool { s.mu.Lock() defer s.mu.Unlock() - return s.running[id] -} - -func (s *WorkspaceService) reserveDiscovery(id string) bool { - s.mu.Lock() - defer s.mu.Unlock() - if s.running[id] { + if s.activeRuns[id] { return false } - s.running[id] = true + s.activeRuns[id] = true return true } -func (s *WorkspaceService) setRunning(id string, running bool) { +func (s *WorkspaceService) releaseRun(id string) { s.mu.Lock() defer s.mu.Unlock() - if running { - s.running[id] = true - return - } - delete(s.running, id) + delete(s.activeRuns, id) } func patternMessage(workspaceID, runID string, p workspace.PatternInfo) *webv1.Pattern { @@ -610,10 +612,10 @@ func workspaceName(id string) string { func workspaceIDFromName(name string) (string, *connect.Error) { parts := strings.Split(strings.Trim(name, "/"), "/") - if len(parts) == 2 && parts[0] == "workspaces" && parts[1] != "" { + if len(parts) == 2 && parts[0] == "workspaces" && validResourcePart(parts[1]) { return parts[1], nil } - if len(parts) == 1 && parts[0] != "" { + if len(parts) == 1 && validResourcePart(parts[0]) { return parts[0], nil } return "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid workspace name %q", name)) @@ -621,7 +623,7 @@ func workspaceIDFromName(name string) (string, *connect.Error) { func logFileNameFromResource(name string) (workspaceID, fileName string, err *connect.Error) { parts := strings.Split(strings.Trim(name, "/"), "/") - if len(parts) == 4 && parts[0] == "workspaces" && parts[2] == "logFiles" && parts[1] != "" && parts[3] != "" { + if len(parts) == 4 && parts[0] == "workspaces" && parts[2] == "logFiles" && validResourcePart(parts[1]) && validResourcePart(parts[3]) { return parts[1], parts[3], nil } return "", "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid log file name %q", name)) @@ -629,7 +631,7 @@ func logFileNameFromResource(name string) (workspaceID, fileName string, err *co func discoveryRunNameFromResource(name string) (workspaceID, runID string, err *connect.Error) { parts := strings.Split(strings.Trim(name, "/"), "/") - if len(parts) == 4 && parts[0] == "workspaces" && parts[2] == "discoveryRuns" && parts[1] != "" && parts[3] != "" { + if len(parts) == 4 && parts[0] == "workspaces" && parts[2] == "discoveryRuns" && validResourcePart(parts[1]) && validResourcePart(parts[3]) { return parts[1], parts[3], nil } return "", "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid discovery run name %q", name)) @@ -637,12 +639,17 @@ func discoveryRunNameFromResource(name string) (workspaceID, runID string, err * func patternNameFromResource(name string) (workspaceID, runID, patternID string, err *connect.Error) { parts := strings.Split(strings.Trim(name, "/"), "/") - if len(parts) == 6 && parts[0] == "workspaces" && parts[2] == "discoveryRuns" && parts[4] == "patterns" && parts[1] != "" && parts[3] != "" && parts[5] != "" { + if len(parts) == 6 && parts[0] == "workspaces" && parts[2] == "discoveryRuns" && parts[4] == "patterns" && + validResourcePart(parts[1]) && validResourcePart(parts[3]) && validResourcePart(parts[5]) { return parts[1], parts[3], parts[5], nil } return "", "", "", connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid pattern name %q", name)) } +func validResourcePart(value string) bool { + return value != "" && value != "." && value != ".." && filepath.Base(value) == value +} + func sanitizeWorkspaceID(value string) string { value = strings.ToLower(strings.TrimSpace(value)) value = workspaceIDPattern.ReplaceAllString(value, "-") diff --git a/pkg/workspace/import.go b/pkg/workspace/import.go index 91d396f..cd690a7 100644 --- a/pkg/workspace/import.go +++ b/pkg/workspace/import.go @@ -71,22 +71,9 @@ func RunImport(ctx context.Context, config ImportConfig) (ImportResult, error) { if err != nil { return ImportResult{}, err } - if _, err := os.Stat(ImportRunRecordPath(config.Dir, runID)); err == nil { - return ImportResult{}, errors.Errorf("import run %q already exists", runID) - } else if !os.IsNotExist(err) { - return ImportResult{}, errors.Errorf("check import run %q: %w", runID, err) - } - - record := ImportRunRecord{ - ID: runID, - Provider: config.Provider, - Project: config.Project, - Filter: config.Filter, - From: config.From.UTC(), - To: config.To.UTC(), - Limit: config.Limit, - State: ImportRunStateRunning, - StartedAt: timeNow(), + record, err := claimImportRun(config, runID) + if err != nil { + return ImportResult{}, err } slog.Info("ImportRun started", "run", runID, "provider", config.Provider, "project", config.Project) if err := WriteImportRunRecord(config.Dir, record); err != nil { @@ -150,6 +137,42 @@ func RunImport(ctx context.Context, config ImportConfig) (ImportResult, error) { }, nil } +func claimImportRun(config ImportConfig, runID string) (ImportRunRecord, error) { + record := ImportRunRecord{ + ID: runID, + Provider: config.Provider, + Project: config.Project, + Filter: config.Filter, + From: config.From.UTC(), + To: config.To.UTC(), + Limit: config.Limit, + State: ImportRunStateRunning, + StartedAt: timeNow(), + } + existing, err := ReadImportRunRecord(config.Dir, runID) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return record, nil + } + return ImportRunRecord{}, errors.Errorf("check import run %q: %w", runID, err) + } + if existing.State != ImportRunStateQueued || !sameImportRequest(existing, record) { + return ImportRunRecord{}, errors.Errorf("import run %q already exists", runID) + } + existing.State = ImportRunStateRunning + return existing, nil +} + +func sameImportRequest(left, right ImportRunRecord) bool { + return left.ID == right.ID && + left.Provider == right.Provider && + left.Project == right.Project && + left.Filter == right.Filter && + left.From.Equal(right.From) && + left.To.Equal(right.To) && + left.Limit == right.Limit +} + func importRunID(value string) (string, error) { if value != "" { return value, nil diff --git a/proto/lapp/web/v1/web.proto b/proto/lapp/web/v1/web.proto index 3b8c663..140e553 100644 --- a/proto/lapp/web/v1/web.proto +++ b/proto/lapp/web/v1/web.proto @@ -16,6 +16,11 @@ service WorkspaceService { rpc UploadLogFile(UploadLogFileRequest) returns (UploadLogFileResponse); rpc DeleteLogFile(DeleteLogFileRequest) returns (DeleteLogFileResponse); + rpc CreateImportRun(CreateImportRunRequest) returns (CreateImportRunResponse); + rpc GetImportRun(GetImportRunRequest) returns (GetImportRunResponse); + rpc ListImportRuns(ListImportRunsRequest) returns (ListImportRunsResponse); + rpc ListRecentImportQueries(ListRecentImportQueriesRequest) returns (ListRecentImportQueriesResponse); + rpc CreateDiscoveryRun(CreateDiscoveryRunRequest) returns (CreateDiscoveryRunResponse); rpc GetDiscoveryRun(GetDiscoveryRunRequest) returns (GetDiscoveryRunResponse); rpc ListDiscoveryRuns(ListDiscoveryRunsRequest) returns (ListDiscoveryRunsResponse); @@ -50,6 +55,37 @@ message LogFile { google.protobuf.Timestamp updated_at = 4; } +message ImportRun { + string name = 1; + string import_run_id = 2; + string provider = 3; + string project = 4; + string filter = 5; + google.protobuf.Timestamp from = 6; + google.protobuf.Timestamp to = 7; + int32 limit = 8; + ImportRunState state = 9; + int32 entry_count = 10; + bool truncated = 11; + string log_file_name = 12; + google.protobuf.Timestamp started_at = 13; + google.protobuf.Timestamp finished_at = 14; + ImportRunError error = 15; +} + +message ImportRunError { + string code = 1; + string message = 2; +} + +enum ImportRunState { + IMPORT_RUN_STATE_UNSPECIFIED = 0; + IMPORT_RUN_STATE_QUEUED = 1; + IMPORT_RUN_STATE_RUNNING = 2; + IMPORT_RUN_STATE_SUCCEEDED = 3; + IMPORT_RUN_STATE_FAILED = 4; +} + message DiscoveryRun { string name = 1; string discovery_run_id = 2; @@ -184,6 +220,47 @@ message DeleteLogFileRequest { message DeleteLogFileResponse {} +message CreateImportRunRequest { + string parent = 1; + string project = 2; + string filter = 3; + google.protobuf.Timestamp from = 4; + google.protobuf.Timestamp to = 5; + int32 limit = 6; +} + +message CreateImportRunResponse { + ImportRun import_run = 1; +} + +message GetImportRunRequest { + string name = 1; +} + +message GetImportRunResponse { + ImportRun import_run = 1; +} + +message ListImportRunsRequest { + string parent = 1; +} + +message ListImportRunsResponse { + repeated ImportRun import_runs = 1; +} + +message ListRecentImportQueriesRequest {} + +message RecentImportQuery { + string project = 1; + string filter = 2; + google.protobuf.Timestamp last_used_at = 3; +} + +message ListRecentImportQueriesResponse { + repeated RecentImportQuery recent_queries = 1; +} + message CreateDiscoveryRunRequest { string parent = 1; string model = 2;