diff --git a/CHANGELOG.md b/CHANGELOG.md index d1115360..ba8172c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Updated 70-persistent-net.rules.ww to use `(lower $netdev.Type)` for case-insensitive comparison of "infiniband". +### Removed + +- Removed the gRPC API servers and client. #1876 + ## v4.6.1, 2025-04-04 ### Added diff --git a/LICENSE_DEPENDENCIES.md b/LICENSE_DEPENDENCIES.md index 1452546c..e5715a04 100644 --- a/LICENSE_DEPENDENCIES.md +++ b/LICENSE_DEPENDENCIES.md @@ -191,12 +191,6 @@ The dependencies and their licenses are as follows: **License URL:** -## github.com/golang/glog - -**License:** Apache-2.0 - -**License URL:** - ## github.com/google/go-containerregistry/pkg/name **License:** Apache-2.0 diff --git a/Makefile b/Makefile index bcfa7073..11563960 100644 --- a/Makefile +++ b/Makefile @@ -236,25 +236,5 @@ dist: vendor lint: $(GOLANGCI_LINT) deadcode: $(GOLANG_DEADCODE) -protofiles = internal/pkg/api/routes/wwapiv1/routes.pb.go \ - internal/pkg/api/routes/wwapiv1/routes.pb.gw.go \ - internal/pkg/api/routes/wwapiv1/routes_grpc.pb.go -.PHONY: proto -proto: $(protofiles) - -routes_proto = internal/pkg/api/routes/v1/routes.proto -$(protofiles): $(routes_proto) $(PROTOC) $(PROTOC_GEN_GRPC_GATEWAY) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_GRPC) - PATH=$(TOOLS_BIN):$(PATH) $(PROTOC) \ - -I /usr/include -I $(shell dirname $(routes_proto)) -I=. \ - --grpc-gateway_opt logtostderr=true \ - --go_out=. \ - --go-grpc_out=. \ - --grpc-gateway_out=. \ - routes.proto - -.PHONY: cleanproto -cleanproto: - rm -f $(protofiles) - clean: cleanvendor endif diff --git a/google/api/annotations.proto b/google/api/annotations.proto deleted file mode 100644 index 85c361b4..00000000 --- a/google/api/annotations.proto +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015, Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -import "google/api/http.proto"; -import "google/protobuf/descriptor.proto"; - -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "AnnotationsProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -extend google.protobuf.MethodOptions { - // See `HttpRule`. - HttpRule http = 72295728; -} diff --git a/google/api/client.proto b/google/api/client.proto deleted file mode 100644 index 3b3fd0c4..00000000 --- a/google/api/client.proto +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -import "google/protobuf/descriptor.proto"; - -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "ClientProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -extend google.protobuf.MethodOptions { - // A definition of a client library method signature. - // - // In client libraries, each proto RPC corresponds to one or more methods - // which the end user is able to call, and calls the underlying RPC. - // Normally, this method receives a single argument (a struct or instance - // corresponding to the RPC request object). Defining this field will - // add one or more overloads providing flattened or simpler method signatures - // in some languages. - // - // The fields on the method signature are provided as a comma-separated - // string. - // - // For example, the proto RPC and annotation: - // - // rpc CreateSubscription(CreateSubscriptionRequest) - // returns (Subscription) { - // option (google.api.method_signature) = "name,topic"; - // } - // - // Would add the following Java overload (in addition to the method accepting - // the request object): - // - // public final Subscription createSubscription(String name, String topic) - // - // The following backwards-compatibility guidelines apply: - // - // * Adding this annotation to an unannotated method is backwards - // compatible. - // * Adding this annotation to a method which already has existing - // method signature annotations is backwards compatible if and only if - // the new method signature annotation is last in the sequence. - // * Modifying or removing an existing method signature annotation is - // a breaking change. - // * Re-ordering existing method signature annotations is a breaking - // change. - repeated string method_signature = 1051; -} - -extend google.protobuf.ServiceOptions { - // The hostname for this service. - // This should be specified with no prefix or protocol. - // - // Example: - // - // service Foo { - // option (google.api.default_host) = "foo.googleapi.com"; - // ... - // } - string default_host = 1049; - - // OAuth scopes needed for the client. - // - // Example: - // - // service Foo { - // option (google.api.oauth_scopes) = \ - // "https://www.googleapis.com/auth/cloud-platform"; - // ... - // } - // - // If there is more than one scope, use a comma-separated string: - // - // Example: - // - // service Foo { - // option (google.api.oauth_scopes) = \ - // "https://www.googleapis.com/auth/cloud-platform," - // "https://www.googleapis.com/auth/monitoring"; - // ... - // } - string oauth_scopes = 1050; -} diff --git a/google/api/http.proto b/google/api/http.proto deleted file mode 100644 index 2bd3a19b..00000000 --- a/google/api/http.proto +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "HttpProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - - -// Defines the HTTP configuration for an API service. It contains a list of -// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method -// to one or more HTTP REST API methods. -message Http { - // A list of HTTP configuration rules that apply to individual API methods. - // - // **NOTE:** All service configuration rules follow "last one wins" order. - repeated HttpRule rules = 1; - - // When set to true, URL path parmeters will be fully URI-decoded except in - // cases of single segment matches in reserved expansion, where "%2F" will be - // left encoded. - // - // The default behavior is to not decode RFC 6570 reserved characters in multi - // segment matches. - bool fully_decode_reserved_expansion = 2; -} - -// `HttpRule` defines the mapping of an RPC method to one or more HTTP -// REST API methods. The mapping specifies how different portions of the RPC -// request message are mapped to URL path, URL query parameters, and -// HTTP request body. The mapping is typically specified as an -// `google.api.http` annotation on the RPC method, -// see "google/api/annotations.proto" for details. -// -// The mapping consists of a field specifying the path template and -// method kind. The path template can refer to fields in the request -// message, as in the example below which describes a REST GET -// operation on a resource collection of messages: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// SubMessage sub = 2; // `sub.subfield` is url-mapped -// } -// message Message { -// string text = 1; // content of the resource -// } -// -// The same http annotation can alternatively be expressed inside the -// `GRPC API Configuration` YAML file. -// -// http: -// rules: -// - selector: .Messaging.GetMessage -// get: /v1/messages/{message_id}/{sub.subfield} -// -// This definition enables an automatic, bidrectional mapping of HTTP -// JSON to RPC. Example: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` -// -// In general, not only fields but also field paths can be referenced -// from a path pattern. Fields mapped to the path pattern cannot be -// repeated and must have a primitive (non-message) type. -// -// Any fields in the request message which are not bound by the path -// pattern automatically become (optional) HTTP query -// parameters. Assume the following definition of the request message: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// int64 revision = 2; // becomes a parameter -// SubMessage sub = 3; // `sub.subfield` becomes a parameter -// } -// -// -// This enables a HTTP JSON to RPC mapping as below: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` -// -// Note that fields which are mapped to HTTP parameters must have a -// primitive type or a repeated primitive type. Message types are not -// allowed. In the case of a repeated type, the parameter can be -// repeated in the URL, as in `...?param=A¶m=B`. -// -// For HTTP method kinds which allow a request body, the `body` field -// specifies the mapping. Consider a REST update method on the -// message resource collection: -// -// -// service Messaging { -// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "message" -// }; -// } -// } -// message UpdateMessageRequest { -// string message_id = 1; // mapped to the URL -// Message message = 2; // mapped to the body -// } -// -// -// The following HTTP JSON to RPC mapping is enabled, where the -// representation of the JSON in the request body is determined by -// protos JSON encoding: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` -// -// The special name `*` can be used in the body mapping to define that -// every field not bound by the path template should be mapped to the -// request body. This enables the following alternative definition of -// the update method: -// -// service Messaging { -// rpc UpdateMessage(Message) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "*" -// }; -// } -// } -// message Message { -// string message_id = 1; -// string text = 2; -// } -// -// -// The following HTTP JSON to RPC mapping is enabled: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` -// -// Note that when using `*` in the body mapping, it is not possible to -// have HTTP parameters, as all fields not bound by the path end in -// the body. This makes this option more rarely used in practice of -// defining REST APIs. The common usage of `*` is in custom methods -// which don't use the URL at all for transferring data. -// -// It is possible to define multiple HTTP methods for one RPC by using -// the `additional_bindings` option. Example: -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http) = { -// get: "/v1/messages/{message_id}" -// additional_bindings { -// get: "/v1/users/{user_id}/messages/{message_id}" -// } -// }; -// } -// } -// message GetMessageRequest { -// string message_id = 1; -// string user_id = 2; -// } -// -// -// This enables the following two alternative HTTP JSON to RPC -// mappings: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` -// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` -// -// # Rules for HTTP mapping -// -// The rules for mapping HTTP path, query parameters, and body fields -// to the request message are as follows: -// -// 1. The `body` field specifies either `*` or a field path, or is -// omitted. If omitted, it indicates there is no HTTP request body. -// 2. Leaf fields (recursive expansion of nested messages in the -// request) can be classified into three types: -// (a) Matched in the URL template. -// (b) Covered by body (if body is `*`, everything except (a) fields; -// else everything under the body field) -// (c) All other fields. -// 3. URL query parameters found in the HTTP request are mapped to (c) fields. -// 4. Any body sent with an HTTP request can contain only (b) fields. -// -// The syntax of the path template is as follows: -// -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// -// The syntax `*` matches a single path segment. The syntax `**` matches zero -// or more path segments, which must be the last part of the path except the -// `Verb`. The syntax `LITERAL` matches literal text in the path. -// -// The syntax `Variable` matches part of the URL path as specified by its -// template. A variable template must not contain other variables. If a variable -// matches a single path segment, its template may be omitted, e.g. `{var}` -// is equivalent to `{var=*}`. -// -// If a variable contains exactly one path segment, such as `"{var}"` or -// `"{var=*}"`, when such a variable is expanded into a URL path, all characters -// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the -// Discovery Document as `{var}`. -// -// If a variable contains one or more path segments, such as `"{var=foo/*}"` -// or `"{var=**}"`, when such a variable is expanded into a URL path, all -// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables -// show up in the Discovery Document as `{+var}`. -// -// NOTE: While the single segment variable matches the semantics of -// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 -// Simple String Expansion, the multi segment variable **does not** match -// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion -// does not expand special characters like `?` and `#`, which would lead -// to invalid URLs. -// -// NOTE: the field paths in variables and in the `body` must not refer to -// repeated fields or map fields. -message HttpRule { - // Selects methods to which this rule applies. - // - // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. - string selector = 1; - - // Determines the URL pattern is matched by this rules. This pattern can be - // used with any of the {get|put|post|delete|patch} methods. A custom method - // can be defined using the 'custom' field. - oneof pattern { - // Used for listing and getting information about resources. - string get = 2; - - // Used for updating a resource. - string put = 3; - - // Used for creating a resource. - string post = 4; - - // Used for deleting a resource. - string delete = 5; - - // Used for updating a resource. - string patch = 6; - - // The custom pattern is used for specifying an HTTP method that is not - // included in the `pattern` field, such as HEAD, or "*" to leave the - // HTTP method unspecified for this rule. The wild-card rule is useful - // for services that provide content to Web (HTML) clients. - CustomHttpPattern custom = 8; - } - - // The name of the request field whose value is mapped to the HTTP body, or - // `*` for mapping all fields not captured by the path pattern to the HTTP - // body. NOTE: the referred field must not be a repeated field and must be - // present at the top-level of request message type. - string body = 7; - - // Optional. The name of the response field whose value is mapped to the HTTP - // body of response. Other response fields are ignored. When - // not set, the response message will be used as HTTP body of response. - string response_body = 12; - - // Additional HTTP bindings for the selector. Nested bindings must - // not contain an `additional_bindings` field themselves (that is, - // the nesting may only be one level deep). - repeated HttpRule additional_bindings = 11; -} - -// A custom pattern is used for defining custom HTTP verb. -message CustomHttpPattern { - // The name of this custom HTTP verb. - string kind = 1; - - // The path matched by this custom verb. - string path = 2; -} diff --git a/google/bytestream/bytestream.proto b/google/bytestream/bytestream.proto deleted file mode 100644 index 814bdf3e..00000000 --- a/google/bytestream/bytestream.proto +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.bytestream; - -import "google/api/annotations.proto"; -import "google/protobuf/wrappers.proto"; - -option go_package = "google.golang.org/genproto/googleapis/bytestream;bytestream"; -option java_outer_classname = "ByteStreamProto"; -option java_package = "com.google.bytestream"; - -// #### Introduction -// -// The Byte Stream API enables a client to read and write a stream of bytes to -// and from a resource. Resources have names, and these names are supplied in -// the API calls below to identify the resource that is being read from or -// written to. -// -// All implementations of the Byte Stream API export the interface defined here: -// -// * `Read()`: Reads the contents of a resource. -// -// * `Write()`: Writes the contents of a resource. The client can call `Write()` -// multiple times with the same resource and can check the status of the write -// by calling `QueryWriteStatus()`. -// -// #### Service parameters and metadata -// -// The ByteStream API provides no direct way to access/modify any metadata -// associated with the resource. -// -// #### Errors -// -// The errors returned by the service are in the Google canonical error space. -service ByteStream { - // `Read()` is used to retrieve the contents of a resource as a sequence - // of bytes. The bytes are returned in a sequence of responses, and the - // responses are delivered as the results of a server-side streaming RPC. - rpc Read(ReadRequest) returns (stream ReadResponse); - - // `Write()` is used to send the contents of a resource as a sequence of - // bytes. The bytes are sent in a sequence of request protos of a client-side - // streaming RPC. - // - // A `Write()` action is resumable. If there is an error or the connection is - // broken during the `Write()`, the client should check the status of the - // `Write()` by calling `QueryWriteStatus()` and continue writing from the - // returned `committed_size`. This may be less than the amount of data the - // client previously sent. - // - // Calling `Write()` on a resource name that was previously written and - // finalized could cause an error, depending on whether the underlying service - // allows over-writing of previously written resources. - // - // When the client closes the request channel, the service will respond with - // a `WriteResponse`. The service will not view the resource as `complete` - // until the client has sent a `WriteRequest` with `finish_write` set to - // `true`. Sending any requests on a stream after sending a request with - // `finish_write` set to `true` will cause an error. The client **should** - // check the `WriteResponse` it receives to determine how much data the - // service was able to commit and whether the service views the resource as - // `complete` or not. - rpc Write(stream WriteRequest) returns (WriteResponse); - - // `QueryWriteStatus()` is used to find the `committed_size` for a resource - // that is being written, which can then be used as the `write_offset` for - // the next `Write()` call. - // - // If the resource does not exist (i.e., the resource has been deleted, or the - // first `Write()` has not yet reached the service), this method returns the - // error `NOT_FOUND`. - // - // The client **may** call `QueryWriteStatus()` at any time to determine how - // much data has been processed for this resource. This is useful if the - // client is buffering data and needs to know which data can be safely - // evicted. For any sequence of `QueryWriteStatus()` calls for a given - // resource name, the sequence of returned `committed_size` values will be - // non-decreasing. - rpc QueryWriteStatus(QueryWriteStatusRequest) - returns (QueryWriteStatusResponse); -} - -// Request object for ByteStream.Read. -message ReadRequest { - // The name of the resource to read. - string resource_name = 1; - - // The offset for the first byte to return in the read, relative to the start - // of the resource. - // - // A `read_offset` that is negative or greater than the size of the resource - // will cause an `OUT_OF_RANGE` error. - int64 read_offset = 2; - - // The maximum number of `data` bytes the server is allowed to return in the - // sum of all `ReadResponse` messages. A `read_limit` of zero indicates that - // there is no limit, and a negative `read_limit` will cause an error. - // - // If the stream returns fewer bytes than allowed by the `read_limit` and no - // error occurred, the stream includes all data from the `read_offset` to the - // end of the resource. - int64 read_limit = 3; -} - -// Response object for ByteStream.Read. -message ReadResponse { - // A portion of the data for the resource. The service **may** leave `data` - // empty for any given `ReadResponse`. This enables the service to inform the - // client that the request is still live while it is running an operation to - // generate more data. - bytes data = 10; -} - -// Request object for ByteStream.Write. -message WriteRequest { - // The name of the resource to write. This **must** be set on the first - // `WriteRequest` of each `Write()` action. If it is set on subsequent calls, - // it **must** match the value of the first request. - string resource_name = 1; - - // The offset from the beginning of the resource at which the data should be - // written. It is required on all `WriteRequest`s. - // - // In the first `WriteRequest` of a `Write()` action, it indicates - // the initial offset for the `Write()` call. The value **must** be equal to - // the `committed_size` that a call to `QueryWriteStatus()` would return. - // - // On subsequent calls, this value **must** be set and **must** be equal to - // the sum of the first `write_offset` and the sizes of all `data` bundles - // sent previously on this stream. - // - // An incorrect value will cause an error. - int64 write_offset = 2; - - // If `true`, this indicates that the write is complete. Sending any - // `WriteRequest`s subsequent to one in which `finish_write` is `true` will - // cause an error. - bool finish_write = 3; - - // A portion of the data for the resource. The client **may** leave `data` - // empty for any given `WriteRequest`. This enables the client to inform the - // service that the request is still live while it is running an operation to - // generate more data. - bytes data = 10; -} - -// Response object for ByteStream.Write. -message WriteResponse { - // The number of bytes that have been processed for the given resource. - int64 committed_size = 1; -} - -// Request object for ByteStream.QueryWriteStatus. -message QueryWriteStatusRequest { - // The name of the resource whose write status is being requested. - string resource_name = 1; -} - -// Response object for ByteStream.QueryWriteStatus. -message QueryWriteStatusResponse { - // The number of bytes that have been processed for the given resource. - int64 committed_size = 1; - - // `complete` is `true` only if the client has sent a `WriteRequest` with - // `finish_write` set to true, and the server has processed that request. - bool complete = 2; -} diff --git a/google/longrunning/operations.proto b/google/longrunning/operations.proto deleted file mode 100644 index 299eefb2..00000000 --- a/google/longrunning/operations.proto +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2019 Google LLC. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.longrunning; - -import "google/api/annotations.proto"; -import "google/api/client.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/empty.proto"; -import "google/rpc/status.proto"; -import "google/protobuf/descriptor.proto"; - -option cc_enable_arenas = true; -option csharp_namespace = "Google.LongRunning"; -option go_package = "google.golang.org/genproto/googleapis/longrunning;longrunning"; -option java_multiple_files = true; -option java_outer_classname = "OperationsProto"; -option java_package = "com.google.longrunning"; -option php_namespace = "Google\\LongRunning"; - -extend google.protobuf.MethodOptions { - // Additional information regarding long-running operations. - // In particular, this specifies the types that are returned from - // long-running operations. - // - // Required for methods that return `google.longrunning.Operation`; invalid - // otherwise. - google.longrunning.OperationInfo operation_info = 1049; -} - -// Manages long-running operations with an API service. -// -// When an API method normally takes long time to complete, it can be designed -// to return [Operation][google.longrunning.Operation] to the client, and the client can use this -// interface to receive the real response asynchronously by polling the -// operation resource, or pass the operation resource to another API (such as -// Google Cloud Pub/Sub API) to receive the response. Any API service that -// returns long-running operations should implement the `Operations` interface -// so developers can have a consistent client experience. -service Operations { - option (google.api.default_host) = "longrunning.googleapis.com"; - - // Lists operations that match the specified filter in the request. If the - // server doesn't support this method, it returns `UNIMPLEMENTED`. - // - // NOTE: the `name` binding allows API services to override the binding - // to use different resource name schemes, such as `users/*/operations`. To - // override the binding, API services can add a binding such as - // `"/v1/{name=users/*}/operations"` to their service configuration. - // For backwards compatibility, the default name includes the operations - // collection id, however overriding users must ensure the name binding - // is the parent resource, without the operations collection id. - rpc ListOperations(ListOperationsRequest) returns (ListOperationsResponse) { - option (google.api.http) = { - get: "/v1/{name=operations}" - }; - option (google.api.method_signature) = "name,filter"; - } - - // Gets the latest state of a long-running operation. Clients can use this - // method to poll the operation result at intervals as recommended by the API - // service. - rpc GetOperation(GetOperationRequest) returns (Operation) { - option (google.api.http) = { - get: "/v1/{name=operations/**}" - }; - option (google.api.method_signature) = "name"; - } - - // Deletes a long-running operation. This method indicates that the client is - // no longer interested in the operation result. It does not cancel the - // operation. If the server doesn't support this method, it returns - // `google.rpc.Code.UNIMPLEMENTED`. - rpc DeleteOperation(DeleteOperationRequest) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/v1/{name=operations/**}" - }; - option (google.api.method_signature) = "name"; - } - - // Starts asynchronous cancellation on a long-running operation. The server - // makes a best effort to cancel the operation, but success is not - // guaranteed. If the server doesn't support this method, it returns - // `google.rpc.Code.UNIMPLEMENTED`. Clients can use - // [Operations.GetOperation][google.longrunning.Operations.GetOperation] or - // other methods to check whether the cancellation succeeded or whether the - // operation completed despite cancellation. On successful cancellation, - // the operation is not deleted; instead, it becomes an operation with - // an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1, - // corresponding to `Code.CANCELLED`. - rpc CancelOperation(CancelOperationRequest) returns (google.protobuf.Empty) { - option (google.api.http) = { - post: "/v1/{name=operations/**}:cancel" - body: "*" - }; - option (google.api.method_signature) = "name"; - } - - // Waits for the specified long-running operation until it is done or reaches - // at most a specified timeout, returning the latest state. If the operation - // is already done, the latest state is immediately returned. If the timeout - // specified is greater than the default HTTP/RPC timeout, the HTTP/RPC - // timeout is used. If the server does not support this method, it returns - // `google.rpc.Code.UNIMPLEMENTED`. - // Note that this method is on a best-effort basis. It may return the latest - // state before the specified timeout (including immediately), meaning even an - // immediate response is no guarantee that the operation is done. - rpc WaitOperation(WaitOperationRequest) returns (Operation) { - } -} - -// This resource represents a long-running operation that is the result of a -// network API call. -message Operation { - // The server-assigned name, which is only unique within the same service that - // originally returns it. If you use the default HTTP mapping, the - // `name` should be a resource name ending with `operations/{unique_id}`. - string name = 1; - - // Service-specific metadata associated with the operation. It typically - // contains progress information and common metadata such as create time. - // Some services might not provide such metadata. Any method that returns a - // long-running operation should document the metadata type, if any. - google.protobuf.Any metadata = 2; - - // If the value is `false`, it means the operation is still in progress. - // If `true`, the operation is completed, and either `error` or `response` is - // available. - bool done = 3; - - // The operation result, which can be either an `error` or a valid `response`. - // If `done` == `false`, neither `error` nor `response` is set. - // If `done` == `true`, exactly one of `error` or `response` is set. - oneof result { - // The error result of the operation in case of failure or cancellation. - google.rpc.Status error = 4; - - // The normal response of the operation in case of success. If the original - // method returns no data on success, such as `Delete`, the response is - // `google.protobuf.Empty`. If the original method is standard - // `Get`/`Create`/`Update`, the response should be the resource. For other - // methods, the response should have the type `XxxResponse`, where `Xxx` - // is the original method name. For example, if the original method name - // is `TakeSnapshot()`, the inferred response type is - // `TakeSnapshotResponse`. - google.protobuf.Any response = 5; - } -} - -// The request message for [Operations.GetOperation][google.longrunning.Operations.GetOperation]. -message GetOperationRequest { - // The name of the operation resource. - string name = 1; -} - -// The request message for [Operations.ListOperations][google.longrunning.Operations.ListOperations]. -message ListOperationsRequest { - // The name of the operation's parent resource. - string name = 4; - - // The standard list filter. - string filter = 1; - - // The standard list page size. - int32 page_size = 2; - - // The standard list page token. - string page_token = 3; -} - -// The response message for [Operations.ListOperations][google.longrunning.Operations.ListOperations]. -message ListOperationsResponse { - // A list of operations that matches the specified filter in the request. - repeated Operation operations = 1; - - // The standard List next-page token. - string next_page_token = 2; -} - -// The request message for [Operations.CancelOperation][google.longrunning.Operations.CancelOperation]. -message CancelOperationRequest { - // The name of the operation resource to be cancelled. - string name = 1; -} - -// The request message for [Operations.DeleteOperation][google.longrunning.Operations.DeleteOperation]. -message DeleteOperationRequest { - // The name of the operation resource to be deleted. - string name = 1; -} - -// The request message for [Operations.WaitOperation][google.longrunning.Operations.WaitOperation]. -message WaitOperationRequest { - // The name of the operation resource to wait on. - string name = 1; - - // The maximum duration to wait before timing out. If left blank, the wait - // will be at most the time permitted by the underlying HTTP/RPC protocol. - // If RPC context deadline is also specified, the shorter one will be used. - google.protobuf.Duration timeout = 2; -} - -// A message representing the message types used by a long-running operation. -// -// Example: -// -// rpc LongRunningRecognize(LongRunningRecognizeRequest) -// returns (google.longrunning.Operation) { -// option (google.longrunning.operation_info) = { -// response_type: "LongRunningRecognizeResponse" -// metadata_type: "LongRunningRecognizeMetadata" -// }; -// } -message OperationInfo { - // Required. The message name of the primary return type for this - // long-running operation. - // This type will be used to deserialize the LRO's response. - // - // If the response is in a different package from the rpc, a fully-qualified - // message name must be used (e.g. `google.protobuf.Struct`). - // - // Note: Altering this value constitutes a breaking change. - string response_type = 1; - - // Required. The message name of the metadata type for this long-running - // operation. - // - // If the response is in a different package from the rpc, a fully-qualified - // message name must be used (e.g. `google.protobuf.Struct`). - // - // Note: Altering this value constitutes a breaking change. - string metadata_type = 2; -} diff --git a/google/rpc/code.proto b/google/rpc/code.proto deleted file mode 100644 index 8fef4117..00000000 --- a/google/rpc/code.proto +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -option go_package = "google.golang.org/genproto/googleapis/rpc/code;code"; -option java_multiple_files = true; -option java_outer_classname = "CodeProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - - -// The canonical error codes for Google APIs. -// -// -// Sometimes multiple error codes may apply. Services should return -// the most specific error code that applies. For example, prefer -// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply. -// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`. -enum Code { - // Not an error; returned on success - // - // HTTP Mapping: 200 OK - OK = 0; - - // The operation was cancelled, typically by the caller. - // - // HTTP Mapping: 499 Client Closed Request - CANCELLED = 1; - - // Unknown error. For example, this error may be returned when - // a `Status` value received from another address space belongs to - // an error space that is not known in this address space. Also - // errors raised by APIs that do not return enough error information - // may be converted to this error. - // - // HTTP Mapping: 500 Internal Server Error - UNKNOWN = 2; - - // The client specified an invalid argument. Note that this differs - // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments - // that are problematic regardless of the state of the system - // (e.g., a malformed file name). - // - // HTTP Mapping: 400 Bad Request - INVALID_ARGUMENT = 3; - - // The deadline expired before the operation could complete. For operations - // that change the state of the system, this error may be returned - // even if the operation has completed successfully. For example, a - // successful response from a server could have been delayed long - // enough for the deadline to expire. - // - // HTTP Mapping: 504 Gateway Timeout - DEADLINE_EXCEEDED = 4; - - // Some requested entity (e.g., file or directory) was not found. - // - // Note to server developers: if a request is denied for an entire class - // of users, such as gradual feature rollout or undocumented whitelist, - // `NOT_FOUND` may be used. If a request is denied for some users within - // a class of users, such as user-based access control, `PERMISSION_DENIED` - // must be used. - // - // HTTP Mapping: 404 Not Found - NOT_FOUND = 5; - - // The entity that a client attempted to create (e.g., file or directory) - // already exists. - // - // HTTP Mapping: 409 Conflict - ALREADY_EXISTS = 6; - - // The caller does not have permission to execute the specified - // operation. `PERMISSION_DENIED` must not be used for rejections - // caused by exhausting some resource (use `RESOURCE_EXHAUSTED` - // instead for those errors). `PERMISSION_DENIED` must not be - // used if the caller can not be identified (use `UNAUTHENTICATED` - // instead for those errors). This error code does not imply the - // request is valid or the requested entity exists or satisfies - // other pre-conditions. - // - // HTTP Mapping: 403 Forbidden - PERMISSION_DENIED = 7; - - // The request does not have valid authentication credentials for the - // operation. - // - // HTTP Mapping: 401 Unauthorized - UNAUTHENTICATED = 16; - - // Some resource has been exhausted, perhaps a per-user quota, or - // perhaps the entire file system is out of space. - // - // HTTP Mapping: 429 Too Many Requests - RESOURCE_EXHAUSTED = 8; - - // The operation was rejected because the system is not in a state - // required for the operation's execution. For example, the directory - // to be deleted is non-empty, an rmdir operation is applied to - // a non-directory, etc. - // - // Service implementors can use the following guidelines to decide - // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: - // (a) Use `UNAVAILABLE` if the client can retry just the failing call. - // (b) Use `ABORTED` if the client should retry at a higher level - // (e.g., when a client-specified test-and-set fails, indicating the - // client should restart a read-modify-write sequence). - // (c) Use `FAILED_PRECONDITION` if the client should not retry until - // the system state has been explicitly fixed. E.g., if an "rmdir" - // fails because the directory is non-empty, `FAILED_PRECONDITION` - // should be returned since the client should not retry unless - // the files are deleted from the directory. - // - // HTTP Mapping: 400 Bad Request - FAILED_PRECONDITION = 9; - - // The operation was aborted, typically due to a concurrency issue such as - // a sequencer check failure or transaction abort. - // - // See the guidelines above for deciding between `FAILED_PRECONDITION`, - // `ABORTED`, and `UNAVAILABLE`. - // - // HTTP Mapping: 409 Conflict - ABORTED = 10; - - // The operation was attempted past the valid range. E.g., seeking or - // reading past end-of-file. - // - // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may - // be fixed if the system state changes. For example, a 32-bit file - // system will generate `INVALID_ARGUMENT` if asked to read at an - // offset that is not in the range [0,2^32-1], but it will generate - // `OUT_OF_RANGE` if asked to read from an offset past the current - // file size. - // - // There is a fair bit of overlap between `FAILED_PRECONDITION` and - // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific - // error) when it applies so that callers who are iterating through - // a space can easily look for an `OUT_OF_RANGE` error to detect when - // they are done. - // - // HTTP Mapping: 400 Bad Request - OUT_OF_RANGE = 11; - - // The operation is not implemented or is not supported/enabled in this - // service. - // - // HTTP Mapping: 501 Not Implemented - UNIMPLEMENTED = 12; - - // Internal errors. This means that some invariants expected by the - // underlying system have been broken. This error code is reserved - // for serious errors. - // - // HTTP Mapping: 500 Internal Server Error - INTERNAL = 13; - - // The service is currently unavailable. This is most likely a - // transient condition, which can be corrected by retrying with - // a backoff. - // - // See the guidelines above for deciding between `FAILED_PRECONDITION`, - // `ABORTED`, and `UNAVAILABLE`. - // - // HTTP Mapping: 503 Service Unavailable - UNAVAILABLE = 14; - - // Unrecoverable data loss or corruption. - // - // HTTP Mapping: 500 Internal Server Error - DATA_LOSS = 15; -} diff --git a/google/rpc/error_details.proto b/google/rpc/error_details.proto deleted file mode 100644 index a8eadd6c..00000000 --- a/google/rpc/error_details.proto +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -import "google/protobuf/duration.proto"; - -option go_package = "google.golang.org/genproto/googleapis/rpc/errdetails;errdetails"; -option java_multiple_files = true; -option java_outer_classname = "ErrorDetailsProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - -// Describes when the clients can retry a failed request. Clients could ignore -// the recommendation here or retry when this information is missing from error -// responses. -// -// It's always recommended that clients should use exponential backoff when -// retrying. -// -// Clients should wait until `retry_delay` amount of time has passed since -// receiving the error response before retrying. If retrying requests also -// fail, clients should use an exponential backoff scheme to gradually increase -// the delay between retries based on `retry_delay`, until either a maximum -// number of retries have been reached or a maximum retry delay cap has been -// reached. -message RetryInfo { - // Clients should wait at least this long between retrying the same request. - google.protobuf.Duration retry_delay = 1; -} - -// Describes additional debugging info. -message DebugInfo { - // The stack trace entries indicating where the error occurred. - repeated string stack_entries = 1; - - // Additional debugging information provided by the server. - string detail = 2; -} - -// Describes how a quota check failed. -// -// For example if a daily limit was exceeded for the calling project, -// a service could respond with a QuotaFailure detail containing the project -// id and the description of the quota limit that was exceeded. If the -// calling project hasn't enabled the service in the developer console, then -// a service could respond with the project id and set `service_disabled` -// to true. -// -// Also see RetryInfo and Help types for other details about handling a -// quota failure. -message QuotaFailure { - // A message type used to describe a single quota violation. For example, a - // daily quota or a custom quota that was exceeded. - message Violation { - // The subject on which the quota check failed. - // For example, "clientip:" or "project:". - string subject = 1; - - // A description of how the quota check failed. Clients can use this - // description to find more about the quota configuration in the service's - // public documentation, or find the relevant quota limit to adjust through - // developer console. - // - // For example: "Service disabled" or "Daily Limit for read operations - // exceeded". - string description = 2; - } - - // Describes all quota violations. - repeated Violation violations = 1; -} - -// Describes the cause of the error with structured details. -// -// Example of an error when contacting the "pubsub.googleapis.com" API when it -// is not enabled: -// { "reason": "API_DISABLED" -// "domain": "googleapis.com" -// "metadata": { -// "resource": "projects/123", -// "service": "pubsub.googleapis.com" -// } -// } -// This response indicates that the pubsub.googleapis.com API is not enabled. -// -// Example of an error that is returned when attempting to create a Spanner -// instance in a region that is out of stock: -// { "reason": "STOCKOUT" -// "domain": "spanner.googleapis.com", -// "metadata": { -// "availableRegions": "us-central1,us-east2" -// } -// } -// -message ErrorInfo { - // The reason of the error. This is a constant value that identifies the - // proximate cause of the error. Error reasons are unique within a particular - // domain of errors. This should be at most 63 characters and match - // /[A-Z0-9_]+/. - string reason = 1; - - // The logical grouping to which the "reason" belongs. Often "domain" will - // contain the registered service name of the tool or product that is the - // source of the error. Example: "pubsub.googleapis.com". If the error is - // common across many APIs, the first segment of the example above will be - // omitted. The value will be, "googleapis.com". - string domain = 2; - - // Additional structured details about this error. - // - // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in - // length. When identifying the current value of an exceeded limit, the units - // should be contained in the key, not the value. For example, rather than - // {"instanceLimit": "100/request"}, should be returned as, - // {"instanceLimitPerRequest": "100"}, if the client exceeds the number of - // instances that can be created in a single (batch) request. - map metadata = 3; -} - -// Describes what preconditions have failed. -// -// For example, if an RPC failed because it required the Terms of Service to be -// acknowledged, it could list the terms of service violation in the -// PreconditionFailure message. -message PreconditionFailure { - // A message type used to describe a single precondition failure. - message Violation { - // The type of PreconditionFailure. We recommend using a service-specific - // enum type to define the supported precondition violation subjects. For - // example, "TOS" for "Terms of Service violation". - string type = 1; - - // The subject, relative to the type, that failed. - // For example, "google.com/cloud" relative to the "TOS" type would indicate - // which terms of service is being referenced. - string subject = 2; - - // A description of how the precondition failed. Developers can use this - // description to understand how to fix the failure. - // - // For example: "Terms of service not accepted". - string description = 3; - } - - // Describes all precondition violations. - repeated Violation violations = 1; -} - -// Describes violations in a client request. This error type focuses on the -// syntactic aspects of the request. -message BadRequest { - // A message type used to describe a single bad request field. - message FieldViolation { - // A path leading to a field in the request body. The value will be a - // sequence of dot-separated identifiers that identify a protocol buffer - // field. E.g., "field_violations.field" would identify this field. - string field = 1; - - // A description of why the request element is bad. - string description = 2; - } - - // Describes all violations in a client request. - repeated FieldViolation field_violations = 1; -} - -// Contains metadata about the request that clients can attach when filing a bug -// or providing other forms of feedback. -message RequestInfo { - // An opaque string that should only be interpreted by the service generating - // it. For example, it can be used to identify requests in the service's logs. - string request_id = 1; - - // Any data that was used to serve this request. For example, an encrypted - // stack trace that can be sent back to the service provider for debugging. - string serving_data = 2; -} - -// Describes the resource that is being accessed. -message ResourceInfo { - // A name for the type of resource being accessed, e.g. "sql table", - // "cloud storage bucket", "file", "Google calendar"; or the type URL - // of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". - string resource_type = 1; - - // The name of the resource being accessed. For example, a shared calendar - // name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current - // error is - // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. - string resource_name = 2; - - // The owner of the resource (optional). - // For example, "user:" or "project:". - string owner = 3; - - // Describes what error is encountered when accessing this resource. - // For example, updating a cloud project may require the `writer` permission - // on the developer console project. - string description = 4; -} - -// Provides links to documentation or for performing an out of band action. -// -// For example, if a quota check failed with an error indicating the calling -// project hasn't enabled the accessed service, this can contain a URL pointing -// directly to the right place in the developer console to flip the bit. -message Help { - // Describes a URL link. - message Link { - // Describes what the link offers. - string description = 1; - - // The URL of the link. - string url = 2; - } - - // URL(s) pointing to additional information on handling the current error. - repeated Link links = 1; -} - -// Provides a localized error message that is safe to return to the user -// which can be attached to an RPC error. -message LocalizedMessage { - // The locale used following the specification defined at - // http://www.rfc-editor.org/rfc/bcp/bcp47.txt. - // Examples are: "en-US", "fr-CH", "es-MX" - string locale = 1; - - // The localized error message in the above locale. - string message = 2; -} \ No newline at end of file diff --git a/google/rpc/status.proto b/google/rpc/status.proto deleted file mode 100644 index 0839ee96..00000000 --- a/google/rpc/status.proto +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.rpc; - -import "google/protobuf/any.proto"; - -option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; -option java_multiple_files = true; -option java_outer_classname = "StatusProto"; -option java_package = "com.google.rpc"; -option objc_class_prefix = "RPC"; - - -// The `Status` type defines a logical error model that is suitable for different -// programming environments, including REST APIs and RPC APIs. It is used by -// [gRPC](https://github.com/grpc). The error model is designed to be: -// -// - Simple to use and understand for most users -// - Flexible enough to meet unexpected needs -// -// # Overview -// -// The `Status` message contains three pieces of data: error code, error message, -// and error details. The error code should be an enum value of -// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The -// error message should be a developer-facing English message that helps -// developers *understand* and *resolve* the error. If a localized user-facing -// error message is needed, put the localized message in the error details or -// localize it in the client. The optional error details may contain arbitrary -// information about the error. There is a predefined set of error detail types -// in the package `google.rpc` that can be used for common error conditions. -// -// # Language mapping -// -// The `Status` message is the logical representation of the error model, but it -// is not necessarily the actual wire format. When the `Status` message is -// exposed in different client libraries and different wire protocols, it can be -// mapped differently. For example, it will likely be mapped to some exceptions -// in Java, but more likely mapped to some error codes in C. -// -// # Other uses -// -// The error model and the `Status` message can be used in a variety of -// environments, either with or without APIs, to provide a -// consistent developer experience across different environments. -// -// Example uses of this error model include: -// -// - Partial errors. If a service needs to return partial errors to the client, -// it may embed the `Status` in the normal response to indicate the partial -// errors. -// -// - Workflow errors. A typical workflow has multiple steps. Each step may -// have a `Status` message for error reporting. -// -// - Batch operations. If a client uses batch request and batch response, the -// `Status` message should be used directly inside batch response, one for -// each error sub-response. -// -// - Asynchronous operations. If an API call embeds asynchronous operation -// results in its response, the status of those operations should be -// represented directly using the `Status` message. -// -// - Logging. If some API errors are stored in logs, the message `Status` could -// be used directly after any stripping needed for security/privacy reasons. -message Status { - // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. - int32 code = 1; - - // A developer-facing error message, which should be in English. Any - // user-facing error message should be localized and sent in the - // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. - string message = 2; - - // A list of messages that carry the error details. There is a common set of - // message types for APIs to use. - repeated google.protobuf.Any details = 3; -} diff --git a/internal/app/api/API.md b/internal/app/api/API.md deleted file mode 100644 index 81bb39f6..00000000 --- a/internal/app/api/API.md +++ /dev/null @@ -1,32 +0,0 @@ -We need an API for Warewulf in order to automate around it. The initial version of the API will look a lot like wwctl. wwctl will call the API by direct function call so that we do not need to maintain separate code paths, nor is the API required. - -wwctl calls the API via direct function call, but we can change that to a gprc or REST call to a Warewulf server in the future. - -The API currently contains: -wwapid WareWulf API Daemon. A grpc server with mTLS auth. -wwapic WareWulf API Client. A grpc client with mTLS auth. It's just a sample that reads the version from the server. -wwapird WareWulf API Rest Daemon. A http REST reverse proxy to wwapid. -There are also sample insecure and secure curls to test with. - -Implemented Functionality: -wwctl node add -wwctl node delete -wwctl node list -wwctl node set -wwctl node status -wwctl image build -wwctl image delete -wwctl image import -wwctl image list -wwctl image show -wwctl image copy - -Some notes on the files: - -Logic that was in wwctl has moved to warewulf/internal/pkg/api. wwctl just calls the API. wwctl functionality is unchanged. -Everything under the /google directory is copied google proto code to stand up wwapird. It's a bit strange to copy in the code, but that is currently how it's done. -Everything in warewulf/internal/pkg/api/routes/wwapiv1 is generated code. - -There are some loose ends here, such as no service installers. I just ran off the command line for development. -The Makefile could use improvement. I'm building by make clean setup proto all build wwapid wwapic wwapird ; echo $? -I copied the configs from warewulf/etc to /usr/local/etc/warewulf manually. diff --git a/internal/app/api/wwapic/README.md b/internal/app/api/wwapic/README.md deleted file mode 100644 index 80233ae6..00000000 --- a/internal/app/api/wwapic/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# wwapiclient is intended as and example grpc wwapid client. -Run wwapid to start the server -```./wwapic``` will get the version. -This works with or without mTLS. \ No newline at end of file diff --git a/internal/app/api/wwapic/wwapic.go b/internal/app/api/wwapic/wwapic.go deleted file mode 100644 index 6407caef..00000000 --- a/internal/app/api/wwapic/wwapic.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - "path" - "time" - - "github.com/warewulf/warewulf/internal/pkg/api/apiconfig" - "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" - warewulfconf "github.com/warewulf/warewulf/internal/pkg/config" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/protobuf/types/known/emptypb" -) - -// wwapic is intended as a sample wwapi client. - -func main() { - log.Println("Client running") - conf := warewulfconf.Get() - - // Read the config file. - config, err := apiconfig.NewClient(path.Join(conf.Paths.Sysconfdir, "warewulf/wwapic.conf")) - if err != nil { - log.Fatalf("err: %v", err) - } - - var opts []grpc.DialOption - if config.TlsConfig.Enabled { - - // Load the client cert and its key - clientCert, err := tls.LoadX509KeyPair(config.TlsConfig.Cert, config.TlsConfig.Key) - if err != nil { - log.Fatalf("Failed to load client cert and key. %s.", err) - } - - // Load the CA cert. - var cacert []byte - cacert, err = os.ReadFile(config.TlsConfig.CaCert) - if err != nil { - log.Fatalf("Failed to load cacert. err: %s\n", err) - } - - // Put the CA cert into the cert pool. - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(cacert) { - log.Fatalf("Failed to append CA cert to certificate pool. %s.", err) - } - - // Create the TLS configuration - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{clientCert}, - RootCAs: certPool, - MinVersion: tls.VersionTLS13, - MaxVersion: tls.VersionTLS13, - } - - // Create TLS credentials from the TLS configuration - creds := credentials.NewTLS(tlsConfig) - opts = append(opts, grpc.DialOption(grpc.WithTransportCredentials(creds))) - } else { - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - } - - conn, err := grpc.NewClient(fmt.Sprintf("%s:%v", config.ApiConfig.Server, config.ApiConfig.Port), opts...) - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - client := wwapiv1.NewWWApiClient(conn) - request := &emptypb.Empty{} - - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - - response, err := client.Version(ctx, request) - if err != nil { - log.Fatalln(err) - } - - log.Printf("Version Response: %v\n", response) -} diff --git a/internal/app/api/wwapid/README.md b/internal/app/api/wwapid/README.md deleted file mode 100644 index d36803fd..00000000 --- a/internal/app/api/wwapid/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Warewulf API Daemon - -wwapid is a grpc service serving the Warewulf API. For v1, the intent is to serve the same interface as wwctl serves. For this preview PR, we are serving much of ```wwctl node``` and ```wwctl image```. - -Initial security is by mTLS. For development we are generating our own keys. A good tutorial for this is here: https://www.handracs.info/blog/grpcmtlsgo/ - -The configuration file is wwapid.conf. diff --git a/internal/app/api/wwapid/wwapid.go b/internal/app/api/wwapid/wwapid.go deleted file mode 100644 index 3fecc544..00000000 --- a/internal/app/api/wwapid/wwapid.go +++ /dev/null @@ -1,356 +0,0 @@ -package main - -import ( - "bufio" - "context" - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "net" - "os" - "path" - - "github.com/warewulf/warewulf/internal/pkg/api/apiconfig" - "github.com/warewulf/warewulf/internal/pkg/api/image" - apinode "github.com/warewulf/warewulf/internal/pkg/api/node" - "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" - warewulfconf "github.com/warewulf/warewulf/internal/pkg/config" - "github.com/warewulf/warewulf/internal/pkg/version" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" -) - -type apiServer struct { - wwapiv1.UnimplementedWWApiServer -} - -var apiPrefix string -var apiVersion string - -func main() { - log.Println("Server running") - - conf := warewulfconf.Get() - // Read the config file. - config, err := apiconfig.NewServer(path.Join(conf.Paths.Sysconfdir, "warewulf/wwapid.conf")) - if err != nil { - log.Fatalf("err: %v", err) - } - - // Pull out config variables. - apiPrefix = config.ApiConfig.Prefix - apiVersion = config.ApiConfig.Version - servicePort := config.ApiConfig.Port - portString := fmt.Sprintf(":%d", servicePort) - - var opts []grpc.ServerOption - if !config.TlsConfig.Enabled { - insecureMode() - } else { - - // Setup TLS. - serverCert, err := tls.LoadX509KeyPair(config.TlsConfig.Cert, config.TlsConfig.Key) - if err != nil { - log.Fatalf("Failed to load server cert and key. err: %s\n", err) - } - - // Load the CA cert. - var cacert []byte - cacert, err = os.ReadFile(config.TlsConfig.CaCert) - if err != nil { - log.Fatalf("Failed to load cacert. err: %s\n", err) - } - - // Put the CA cert into the cert pool. - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(cacert) { - log.Fatalf("Failed to append CA cert to certificate pool. %s.", err) - } - - // Create the TLS configuration - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{serverCert}, - RootCAs: certPool, - ClientCAs: certPool, - MinVersion: tls.VersionTLS13, - MaxVersion: tls.VersionTLS13, - } - - // Create TLS credentials from the TLS configuration - creds := credentials.NewTLS(tlsConfig) - opts = []grpc.ServerOption{grpc.Creds(creds)} - } - - listen, err := net.Listen("tcp", portString) - if err != nil { - log.Fatalln(err) - } - defer func() { - listen.Close() - }() - - grpcServer := grpc.NewServer(opts...) - wwapiv1.RegisterWWApiServer(grpcServer, &apiServer{}) - log.Fatalln(grpcServer.Serve(listen)) -} - -// private helpers - -// insecureMode creates a blocking prompt for customers running wwapid in insecure mode. -// It's a deterrent. Setup TLS. -func insecureMode() { - - fmt.Println("*** Running wwapid in INSECURE mode. *** THIS IS DANGEROUS! *** Enter y to continue. ***") - reader := bufio.NewReader(os.Stdin) - result, err := reader.ReadString('\n') - - if err != nil { - fmt.Printf("Fatal error: %v\n", err) - } - - if !(result == "y\n") { - os.Exit(1) - } - - fmt.Printf("wwapid running IN INSECURE MODE\n") -} - -// Api implementation. - -// ImageBuild builds one or more images. -func (s *apiServer) ImageBuild(ctx context.Context, request *wwapiv1.ImageBuildParameter) (response *wwapiv1.ImageListResponse, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - if request.ImageNames == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request.ImageNames") - } - - // Build the image. - err = image.ImageBuild(request) - if err != nil { - return - } - - // Return the built images. (A REST POST returns what is modified.) - var images []*wwapiv1.ImageInfo - images, err = image.ImageList() - if err != nil { - return - } - - response = &wwapiv1.ImageListResponse{} - for i := 0; i < len(images); i++ { - for j := 0; j < len(request.ImageNames); j++ { - if images[i].Name == request.ImageNames[j] { - response.Images = append(response.Images, images[i]) - } - } - } - return -} - -// ImageCopy duplicates an image. -func (s *apiServer) ImageCopy(ctx context.Context, request *wwapiv1.ImageCopyParameter) (response *emptypb.Empty, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - err = image.ImageCopy(request) - return -} - -// ImageDelete deletes one or more images from Warewulf. -func (s *apiServer) ImageDelete(ctx context.Context, request *wwapiv1.ImageDeleteParameter) (response *emptypb.Empty, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - if request.ImageNames == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request.ImageNames") - } - - err = image.ImageDelete(request) - return -} - -func (s *apiServer) ImageImport(ctx context.Context, request *wwapiv1.ImageImportParameter) (response *wwapiv1.ImageListResponse, err error) { - - // Import the image. - var imageName string - imageName, err = image.ImageImport(request) - if err != nil { - return - } - - // Return the imported image to the client. - var images []*wwapiv1.ImageInfo - images, err = image.ImageList() - if err != nil { - return - } - - // Image name may have been shimmed in during import, - // which is why ImageImport returns it. - for i := 0; i < len(images); i++ { - if imageName == images[i].Name { - response = &wwapiv1.ImageListResponse{ - Images: []*wwapiv1.ImageInfo{images[i]}, - } - return - } - } - return -} - -// ImageList returns details about images. -func (s *apiServer) ImageList(ctx context.Context, request *emptypb.Empty) (response *wwapiv1.ImageListResponse, err error) { - - var images []*wwapiv1.ImageInfo - images, err = image.ImageList() - if err != nil { - return - } - - response = &wwapiv1.ImageListResponse{ - Images: images, - } - return -} - -// ImageShow returns details about images. -func (s *apiServer) ImageShow(ctx context.Context, request *wwapiv1.ImageShowParameter) (response *wwapiv1.ImageShowResponse, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - return image.ImageShow(request) -} - -// NodeAdd adds one or more nodes for management by Warewulf and returns the added nodes. -func (s *apiServer) NodeAdd(ctx context.Context, request *wwapiv1.NodeAddParameter) (response *wwapiv1.NodeListResponse, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - if request.NodeNames == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request.NodeNames") - } - - // Add the node(s). - err = apinode.NodeAdd(request) - if err != nil { - return - } - - // Return the added nodes as per REST. - return s.nodeListInternal(request.NodeNames) -} - -// NodeDelete deletes one or more nodes for removal of management by Warewulf. -func (s *apiServer) NodeDelete(ctx context.Context, request *wwapiv1.NodeDeleteParameter) (response *emptypb.Empty, err error) { - - response = new(emptypb.Empty) - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - if request.NodeNames == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request.NodeNames") - } - - err = apinode.NodeDelete(request) - return -} - -// NodeList returns details about zero or more nodes. -func (s *apiServer) NodeList(ctx context.Context, request *wwapiv1.NodeNames) (response *wwapiv1.NodeListResponse, err error) { - - // Parameter checks. request.NodeNames can be nil. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - // Perform the list. - return s.nodeListInternal(request.NodeNames) -} - -// NodeSet updates fields for zero or more nodes and returns the updated nodes. -func (s *apiServer) NodeSet(ctx context.Context, request *wwapiv1.ConfSetParameter) (response *wwapiv1.NodeListResponse, err error) { - - // Parameter checks. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - if request.ConfList == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request.NodeNames") - } - - // Perform the NodeSet. - err = apinode.NodeSet(request) - if err != nil { - return - } - - // Return the updated nodes as per REST. - return s.nodeListInternal(request.ConfList) -} - -func (s *apiServer) NodeStatus(ctx context.Context, request *wwapiv1.NodeNames) (response *wwapiv1.NodeStatusResponse, err error) { - - // Parameter checks. request.NodeNames can be nil. - if request == nil { - return response, status.Errorf(codes.InvalidArgument, "nil request") - } - - return apinode.NodeStatus(request.NodeNames) -} - -// Version returns the versions of the wwapiv1 and warewulf as well as the api -// prefix for http routes. -func (s *apiServer) Version(ctx context.Context, request *emptypb.Empty) (response *wwapiv1.VersionResponse, err error) { - - response = &wwapiv1.VersionResponse{ - ApiPrefix: apiPrefix, - ApiVersion: apiVersion, - WarewulfVersion: version.GetVersion(), - } - return -} - -// Private helpers. - -// nodeListInternal calls NodeList and returns NodeListResponse. -// This does not contain parameter checks. -func (s *apiServer) nodeListInternal(nodeNames []string) (response *wwapiv1.NodeListResponse, err error) { - - var nodes []*wwapiv1.NodeInfo - /* - nodes, err = apinode.NodeList(nodeNames) - if err != nil { - return - } - */ - response = &wwapiv1.NodeListResponse{ - Nodes: nodes, - } - return -} diff --git a/internal/app/api/wwapird/README.md b/internal/app/api/wwapird/README.md deleted file mode 100644 index 492f0abd..00000000 --- a/internal/app/api/wwapird/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Warewulf API Rest Daemon - -wwapird is a client of wwapid serving a REST interface for the Warewulf API. For v1, the intent is to serve the same interface as wwctl serves. For this preview PR, we are serving much of ```wwctl node``` and ```wwctl image```. - -Initial security is by mTLS. For development we are generating our own keys. A good tutorial for this is here: https://www.handracs.info/blog/grpcmtlsgo/ - -The configuration file is wwapird.conf. - -Sample cURLs with and without mTLS are in curl.sh. This file is just a scratchpad for examples. diff --git a/internal/app/api/wwapird/wwapird.go b/internal/app/api/wwapird/wwapird.go deleted file mode 100644 index 575bdd89..00000000 --- a/internal/app/api/wwapird/wwapird.go +++ /dev/null @@ -1,113 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "crypto/x509" - "os" - - "flag" - "fmt" - "log" - "net/http" - - "github.com/golang/glog" - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - - "github.com/warewulf/warewulf/internal/pkg/api/apiconfig" - warewulfconf "github.com/warewulf/warewulf/internal/pkg/config" - - gw "github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1" - - "path" -) - -func run() error { - - log.Println("test0") - - conf := warewulfconf.Get() - // Read the config file. - config, err := apiconfig.NewClientServer(path.Join(conf.Paths.Sysconfdir, "warewulf/wwapird.conf")) - if err != nil { - glog.Fatalf("Failed to read config file, err: %v", err) - } - grpcServerEndpoint := fmt.Sprintf("%s:%v", config.ClientApiConfig.Server, config.ClientApiConfig.Port) - httpServerEndpoint := fmt.Sprintf(":%v", config.ServerApiConfig.Port) - - ctx := context.Background() - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // Register gRPC server endpoint (we are the client) - // Note: Make sure the gRPC server is running properly and accessible - mux := runtime.NewServeMux() - - var opts []grpc.DialOption - if config.ClientTlsConfig.Enabled { - - // Load the client cert and its key - clientCert, err := tls.LoadX509KeyPair(config.ClientTlsConfig.Cert, config.ClientTlsConfig.Key) - if err != nil { - log.Fatalf("Failed to load client cert and key. %s.", err) - } - - // Load the CA cert. - var cacert []byte - cacert, err = os.ReadFile(config.ClientTlsConfig.CaCert) - if err != nil { - log.Fatalf("Failed to load cacert. err: %s\n", err) - } - - // Put the CA cert into the cert pool. - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(cacert) { - log.Fatalf("Failed to append CA cert to certificate pool. %s.", err) - } - - // Create the TLS configuration - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{clientCert}, - RootCAs: certPool, - MinVersion: tls.VersionTLS13, - MaxVersion: tls.VersionTLS13, - } - - // Create TLS credentials from the TLS configuration - creds := credentials.NewTLS(tlsConfig) - opts = append(opts, grpc.DialOption(grpc.WithTransportCredentials(creds))) - - } else { - opts = []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} - } - - err = gw.RegisterWWApiHandlerFromEndpoint(ctx, mux, grpcServerEndpoint, opts) - if err != nil { - return err - } - - // Start HTTP server (and proxy calls to gRPC server endpoint) - if config.ServerTlsConfig.Enabled { - - return http.ListenAndServeTLS( - httpServerEndpoint, - config.ServerTlsConfig.ConcatCert, - config.ServerTlsConfig.Key, - mux) - } - - // Insecure - return http.ListenAndServe(httpServerEndpoint, mux) -} - -func main() { - flag.Parse() // Pretty sure glog wants this. - defer glog.Flush() - - if err := run(); err != nil { - glog.Fatal(err) - } -} diff --git a/internal/app/api/wwapird_curls/curls.sh b/internal/app/api/wwapird_curls/curls.sh deleted file mode 100644 index a8596780..00000000 --- a/internal/app/api/wwapird_curls/curls.sh +++ /dev/null @@ -1,57 +0,0 @@ -#! /usr/bin/env bash - -# This file is a scratchpad for curling wwapird. - -# version -curl http://localhost:9871/version - -# secure version -curl --cacert /usr/local/etc/warewulf/keys/cacert.pem \ - --key /usr/local/etc/warewulf/keys/client.key \ - --cert /usr/local/etc/warewulf/keys/client.pem \ - https://localhost:9871/version - -# image list all -curl http://localhost:9871/v1/image - -# image import -curl -d '{"source": "docker://ghcr.io/warewulf/warewulf-rockylinux:8", "name": "rocky-8", "update": true, "default": true}' -H "Content-Type: application/json" -X POST http://localhost:9871/v1/image - -# image delete -curl -X DELETE http://localhost:9871/v1/image?imageNames=rocky-8 - -# image build -curl -d '{"imageNames": ["rocky-8"], "force": true}' -H "Content-Type: application/json" -X POST http://localhost:9871/v1/imagebuild - -# node list all -curl http://localhost:9871/v1/node - -# node list one -curl http://localhost:9871/v1/node?nodeNames=testnode1 # this works! case sensitive - -# This is a list of testnode[1-2] with URL escapes. -curl http://localhost:9871/v1/node?nodeNames=testnode%5B1-2%5D - -# node add single discoverable node -curl -d '{"nodeNames": ["testApiNode0"], "discoverable": true}' -H "Content-Type: application/json" -X POST http://localhost:9871/v1/node - -curl -d '{"nodeNames": ["testApiNode1"], "discoverable": true}' -H "Content-Type: application/json" -X POST http://localhost:9871/v1/node - - -# list the node we just added -curl http://localhost:9871/v1/node?nodeNames=testApiNode0 - -# This gets me a little farther, but still no param data: -curl -d '{"nodeNames": ["testApiNode0"], "ipmiIpAddr": "10.0.8.220", "updateMask": "ipmiIpAddr,nodeNames"}' -H "Content-Type: application/json" -X PATCH http://localhost:9871/v1/node - -# Node set with post: -curl -d '{"nodeNames": ["testApiNode0"], "ipmiIpaddr": "6.7.8.9"}' -H "Content-Type: application/json" -X POST http://localhost:9871/v1/nodeset - -# node status -curl http://localhost:9871/v1/nodestatus - -curl http://localhost:9871/v1/nodestatus?nodeNames=testApiNode0 - -# node delete single node -curl -X DELETE http://localhost:9871/v1/node?nodeNames=testApiNode0 -curl -X DELETE http://localhost:9871/v1/node?nodeNames=testApiNode1 diff --git a/internal/pkg/api/apiconfig/client.go b/internal/pkg/api/apiconfig/client.go deleted file mode 100644 index fe201945..00000000 --- a/internal/pkg/api/apiconfig/client.go +++ /dev/null @@ -1,42 +0,0 @@ -package apiconfig - -import ( - "log" - "os" - - "gopkg.in/yaml.v3" -) - -// ClientApiConfig contains configuration parameters for an API server. -type ClientApiConfig struct { - // Server is the hostname or IP address of the server to connect to. - Server string `yaml:"prefix"` - // Port is the where the API server listens. - Port uint32 `yaml:"port"` -} - -// ClientConfig is the full client configuration. -type ClientConfig struct { - ApiConfig ClientApiConfig `yaml:"api"` - TlsConfig TlsConfig `yaml:"tls"` -} - -// NewClient loads the client config from the given configFilePath. -func NewClient(configFilePath string) (config ClientConfig, err error) { - - log.Printf("Loading api client configuration from: %v\n", configFilePath) - - var fileBytes []byte - fileBytes, err = os.ReadFile(configFilePath) - if err != nil { - return - } - - err = yaml.Unmarshal(fileBytes, &config) - if err != nil { - return - } - - log.Printf("api client config: %#v\n", config) - return -} diff --git a/internal/pkg/api/apiconfig/client_server.go b/internal/pkg/api/apiconfig/client_server.go deleted file mode 100644 index 9cbd168e..00000000 --- a/internal/pkg/api/apiconfig/client_server.go +++ /dev/null @@ -1,38 +0,0 @@ -package apiconfig - -import ( - "log" - "os" - - "gopkg.in/yaml.v3" -) - -// ClientServerConfig is the full client server configuration. -// wwapird is a client of wwapid. -// wwapird serves REST. (WareWulf API Rest Daemon) -type ClientServerConfig struct { - ClientApiConfig ClientApiConfig `yaml:"clientapi"` - ServerApiConfig ServerApiConfig `yaml:"serverapi"` - ClientTlsConfig TlsConfig `yaml:"clienttls"` - ServerTlsConfig TlsConfig `yaml:"servertls"` -} - -// NewClientServer loads the client config from the given configFilePath. -func NewClientServer(configFilePath string) (config ClientServerConfig, err error) { - - log.Printf("Loading api client server configuration from: %v\n", configFilePath) - - var fileBytes []byte - fileBytes, err = os.ReadFile(configFilePath) - if err != nil { - return - } - - err = yaml.Unmarshal(fileBytes, &config) - if err != nil { - return - } - - log.Printf("api client server config: %#v\n", config) - return -} diff --git a/internal/pkg/api/apiconfig/server.go b/internal/pkg/api/apiconfig/server.go deleted file mode 100644 index bc5d9f7a..00000000 --- a/internal/pkg/api/apiconfig/server.go +++ /dev/null @@ -1,44 +0,0 @@ -package apiconfig - -import ( - "log" - "os" - - "gopkg.in/yaml.v3" -) - -// ServerApiConfig contains configuration parameters for an API server. -type ServerApiConfig struct { - // Version contains the full version of the API server, eg: 1.0.0. - Version string `yaml:"version"` - // Prefix contains the version url prefix for the API server, eg: v1. - Prefix string `yaml:"prefix"` - // Port is the where the API server listens. - Port uint32 `yaml:"port"` -} - -// ServerConfig is the full server configuration. -type ServerConfig struct { - ApiConfig ServerApiConfig `yaml:"api"` - TlsConfig TlsConfig `yaml:"tls"` -} - -// NewServer loads the server config from the given configFilePath. -func NewServer(configFilePath string) (config ServerConfig, err error) { - - log.Printf("Loading api server configuration from: %v\n", configFilePath) - - var fileBytes []byte - fileBytes, err = os.ReadFile(configFilePath) - if err != nil { - return - } - - err = yaml.Unmarshal(fileBytes, &config) - if err != nil { - return - } - - log.Printf("api server config: %#v\n", config) - return -} diff --git a/internal/pkg/api/apiconfig/tls.go b/internal/pkg/api/apiconfig/tls.go deleted file mode 100644 index eb101091..00000000 --- a/internal/pkg/api/apiconfig/tls.go +++ /dev/null @@ -1,20 +0,0 @@ -package apiconfig - -// TlsConfig contains TLS configuration parameters for a client or server. -type TlsConfig struct { - // Enabled is true when secure. - Enabled bool `yaml:"enabled"` - // Cert is the path to the client or server certificate file. - Cert string `yaml:"cert,omitempty"` - // Key is the path to the client or server key file. - Key string `yaml:"key,omitempty"` - // CaCert is the path the CA certificate file. - CaCert string `yaml:"cacert,omitempty"` - // ConcatCert is for wwapird. http.ListenAndServeTLS wants the following - // cert file, so in our case this file contains `cat ${Cert} ${CaCert}` - // - // If the certificate is signed by a certificate authority, the certFile - // should be the concatenation of the server's certificate, any - // intermediates, and the CA's certificate - ConcatCert string `yaml:"concatcert,omitempty"` -} diff --git a/internal/pkg/api/image/image.go b/internal/pkg/api/image/image.go index 6d3cb0da..a55588d4 100644 --- a/internal/pkg/api/image/image.go +++ b/internal/pkg/api/image/image.go @@ -18,38 +18,6 @@ import ( "github.com/warewulf/warewulf/internal/pkg/wwlog" ) -func ImageCopy(cbp *wwapiv1.ImageCopyParameter) (err error) { - if cbp == nil { - return fmt.Errorf("imageCopyParameter is nil") - } - - if !image.DoesSourceExist(cbp.ImageSource) { - return fmt.Errorf("image %s does not exist", cbp.ImageSource) - } - - if !image.ValidName(cbp.ImageDestination) { - return fmt.Errorf("image name contains illegal characters : %s", cbp.ImageDestination) - } - - if image.DoesSourceExist(cbp.ImageDestination) { - return fmt.Errorf("an other image with the name %s already exists", cbp.ImageDestination) - } - - err = image.Duplicate(cbp.ImageSource, cbp.ImageDestination) - if err != nil { - return fmt.Errorf("could not duplicate image: %s", err.Error()) - } - - if cbp.Build { - err = image.Build(cbp.ImageDestination, true) - if err != nil { - return err - } - } - - return fmt.Errorf("image %s has been succesfully duplicated as %s", cbp.ImageSource, cbp.ImageDestination) -} - func ImageBuild(cbp *wwapiv1.ImageBuildParameter) (err error) { if cbp == nil { return fmt.Errorf("input parameter is nil")