Updating documentation & API endpoint for container copy
This commit is contained in:
1
API.md
1
API.md
@@ -19,6 +19,7 @@ wwctl container delete
|
||||
wwctl container import
|
||||
wwctl container list
|
||||
wwctl container show
|
||||
wwctl container cp
|
||||
|
||||
Some notes on the files:
|
||||
|
||||
|
||||
@@ -11,8 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
- New documentation for the hostlist syntax. #611
|
||||
- New documentation for development environment (Vagrant)
|
||||
- Ability to duplicate an image with `wwctl container cp` or the API
|
||||
- New documentation for container duplication procedure
|
||||
|
||||
### Fixed
|
||||
- Fix hard CPU architecture on proto's installation in the Makefile
|
||||
- More aggressive `make clean`.
|
||||
- Replace deprecated `io.utils` functions with new `os` functions.
|
||||
- The correct header is now displayed when `-al` flags are specified to overlay
|
||||
|
||||
@@ -26,3 +26,4 @@
|
||||
* Brian Phan <bphan@ciq.com>
|
||||
* Jeffrey Frey @jtfrey
|
||||
* Xu Yang(Jason Yang) <jasonyangshadow@gmail.com> @JasonYangShadow
|
||||
* Arnaud LECOMTE <contact@arnaud-lcm.com>
|
||||
|
||||
4
Makefile
4
Makefile
@@ -9,14 +9,14 @@ build: lint test vet all
|
||||
.PHONY: setup_tools
|
||||
setup_tools: $(GO_TOOLS_BIN) $(GOLANGCI_LINT) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_GRPC)
|
||||
|
||||
$(GO_TOOLS_BIN):
|
||||
$(GO_TOOLS_BIN):
|
||||
GOBIN="$(PWD)/$(TOOLS_BIN)" go install -mod=vendor $(GO_TOOLS)
|
||||
|
||||
$(GOLANGCI_LINT):
|
||||
curl -qq -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(TOOLS_BIN) $(GOLANGCI_LINT_VERSION)
|
||||
|
||||
$(PROTOC):
|
||||
cd $(PWD)/$(TOOLS_DIR) && curl -LO $(PROTOC_URL) && unzip protoc-24.0-linux-aarch_64.zip
|
||||
cd $(PWD)/$(TOOLS_DIR) && curl -LO $(PROTOC_URL) && unzip protoc-24.0-linux-$(ARCHITECTURE_CPU).zip
|
||||
|
||||
$(PROTOC_GEN_GRPC_GATEWAY):
|
||||
curl -L $(PROTOC_GEN_GRPC_GATEWAY_URL) -o $(PROTOC_GEN_GRPC_GATEWAY)
|
||||
|
||||
@@ -97,6 +97,8 @@ PROTOC_GEN_GRPC_GATEWAY_URL := https://github.com/grpc-ecosystem/grpc-gateway/re
|
||||
# helper functions
|
||||
godeps=$(shell go list -deps -f '{{if not .Standard}}{{ $$dep := . }}{{range .GoFiles}}{{$$dep.Dir}}/{{.}} {{end}}{{end}}' $(1) | sed "s%${PWD}/%%g")
|
||||
|
||||
ARCHITECTURE_CPU=$(shell lscpu | grep 'Architecture' | cut -d':' -f2 | xargs)
|
||||
|
||||
# use GOPROXY for older git clients and speed up downloads
|
||||
GOPROXY ?= https://proxy.golang.org
|
||||
export GOPROXY
|
||||
|
||||
2
go.mod
2
go.mod
@@ -11,7 +11,6 @@ require (
|
||||
github.com/creasty/defaults v1.7.0
|
||||
github.com/fatih/color v1.15.0
|
||||
github.com/golang/glog v1.0.0
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2
|
||||
github.com/manifoldco/promptui v0.9.0
|
||||
@@ -56,6 +55,7 @@ require (
|
||||
github.com/docker/go-units v0.4.0 // indirect
|
||||
github.com/ghodss/yaml v1.0.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/golang/snappy v0.0.3 // indirect
|
||||
github.com/gorilla/mux v1.7.4 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||
|
||||
@@ -158,21 +158,14 @@ func (s *apiServer) ContainerBuild(ctx context.Context, request *wwapiv1.Contain
|
||||
}
|
||||
|
||||
// ContainerCopy duplicates a container.
|
||||
func (s *apiServer) ContainerCopy(ctx context.Context, request *wwapiv1.ContainerCopyParameter) (response *wwapiv1.ContainerListResponse, err error) {
|
||||
func (s *apiServer) ContainerCopy(ctx context.Context, request *wwapiv1.ContainerCopyParameter) (response *emptypb.Empty, err error) {
|
||||
|
||||
// Parameter checks.
|
||||
if request == nil {
|
||||
return response, status.Errorf(codes.InvalidArgument, "nil request")
|
||||
}
|
||||
|
||||
if request.ContainerSource == "" {
|
||||
return response, status.Errorf(codes.InvalidArgument, "nil request.ContainerSource")
|
||||
}
|
||||
|
||||
if request.ContainerDestination == "" {
|
||||
return response, status.Errorf(codes.InvalidArgument, "nil request.ContainerDest")
|
||||
}
|
||||
|
||||
err = container.ContainerCopy(request)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,31 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func ContainerCopy(cbp *wwapiv1.ContainerCopyParameter) (err error) {
|
||||
if cbp == nil {
|
||||
return fmt.Errorf("ContainerCopyParameter is nil")
|
||||
}
|
||||
|
||||
if !container.DoesSourceExist(cbp.ContainerSource) {
|
||||
return fmt.Errorf("Container %s does not exists.", cbp.ContainerSource)
|
||||
}
|
||||
|
||||
if !container.ValidName(cbp.ContainerDestination) {
|
||||
return fmt.Errorf("Container name contains illegal characters : %s", cbp.ContainerDestination)
|
||||
}
|
||||
|
||||
if container.DoesSourceExist(cbp.ContainerDestination) {
|
||||
return fmt.Errorf("An other container with the name %s already exists", cbp.ContainerDestination)
|
||||
}
|
||||
|
||||
err = container.Duplicate(cbp.ContainerSource, cbp.ContainerDestination)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not duplicate image: %s", err.Error())
|
||||
}
|
||||
|
||||
return fmt.Errorf("Container %s has been succesfully duplicated as %s", cbp.ContainerSource, cbp.ContainerDestination)
|
||||
}
|
||||
|
||||
func ContainerBuild(cbp *wwapiv1.ContainerBuildParameter) (err error) {
|
||||
if cbp == nil {
|
||||
return fmt.Errorf("ContainerBuildParameter is nil")
|
||||
|
||||
@@ -34,8 +34,8 @@ message ContainerDeleteParameter {
|
||||
|
||||
// ContainerCopyParameter contains 2 inputs : first one for the source container name and second one for the duplicated container name.
|
||||
message ContainerCopyParameter {
|
||||
repeated string containerSourceName = 1;
|
||||
repeated string containerDestName = 1;
|
||||
string containerSource = 1;
|
||||
string containerDestination = 2;
|
||||
|
||||
}
|
||||
|
||||
@@ -246,6 +246,13 @@ service WWApi {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
rpc ContainerCopy(ContainerCopyParameter) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/containercopy"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
// ContainerImport imports a container to Warewulf.
|
||||
rpc ContainerImport(ContainerImportParameter) returns (ContainerListResponse) {
|
||||
option(google.api.http) = {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,6 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"github.com/golang/protobuf/ptypes/empty"
|
||||
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
||||
"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
|
||||
"google.golang.org/grpc"
|
||||
@@ -22,6 +21,7 @@ import (
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/types/known/emptypb"
|
||||
)
|
||||
|
||||
// Suppress "imported and not used" errors
|
||||
@@ -102,6 +102,40 @@ func local_request_WWApi_ContainerDelete_0(ctx context.Context, marshaler runtim
|
||||
|
||||
}
|
||||
|
||||
func request_WWApi_ContainerCopy_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ContainerCopyParameter
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
newReader, berr := utilities.IOReaderFactory(req.Body)
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.ContainerCopy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func local_request_WWApi_ContainerCopy_0(ctx context.Context, marshaler runtime.Marshaler, server WWApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ContainerCopyParameter
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
newReader, berr := utilities.IOReaderFactory(req.Body)
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.ContainerCopy(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func request_WWApi_ContainerImport_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ContainerImportParameter
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -137,7 +171,7 @@ func local_request_WWApi_ContainerImport_0(ctx context.Context, marshaler runtim
|
||||
}
|
||||
|
||||
func request_WWApi_ContainerList_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq empty.Empty
|
||||
var protoReq emptypb.Empty
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
msg, err := client.ContainerList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
@@ -146,7 +180,7 @@ func request_WWApi_ContainerList_0(ctx context.Context, marshaler runtime.Marsha
|
||||
}
|
||||
|
||||
func local_request_WWApi_ContainerList_0(ctx context.Context, marshaler runtime.Marshaler, server WWApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq empty.Empty
|
||||
var protoReq emptypb.Empty
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
msg, err := server.ContainerList(ctx, &protoReq)
|
||||
@@ -367,7 +401,7 @@ func local_request_WWApi_NodeStatus_0(ctx context.Context, marshaler runtime.Mar
|
||||
}
|
||||
|
||||
func request_WWApi_Version_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq empty.Empty
|
||||
var protoReq emptypb.Empty
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
msg, err := client.Version(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
@@ -376,7 +410,7 @@ func request_WWApi_Version_0(ctx context.Context, marshaler runtime.Marshaler, c
|
||||
}
|
||||
|
||||
func local_request_WWApi_Version_0(ctx context.Context, marshaler runtime.Marshaler, server WWApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq empty.Empty
|
||||
var protoReq emptypb.Empty
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
msg, err := server.Version(ctx, &protoReq)
|
||||
@@ -440,6 +474,31 @@ func RegisterWWApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerCopy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
var err error
|
||||
var annotatedContext context.Context
|
||||
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/wwapi.v1.WWApi/ContainerCopy", runtime.WithHTTPPathPattern("/v1/containercopy"))
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := local_request_WWApi_ContainerCopy_0(annotatedContext, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_WWApi_ContainerCopy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerImport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
@@ -750,6 +809,28 @@ func RegisterWWApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerCopy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
var err error
|
||||
var annotatedContext context.Context
|
||||
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/wwapi.v1.WWApi/ContainerCopy", runtime.WithHTTPPathPattern("/v1/containercopy"))
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_WWApi_ContainerCopy_0(annotatedContext, inboundMarshaler, client, req, pathParams)
|
||||
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_WWApi_ContainerCopy_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerImport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
@@ -956,6 +1037,8 @@ var (
|
||||
|
||||
pattern_WWApi_ContainerDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "container"}, ""))
|
||||
|
||||
pattern_WWApi_ContainerCopy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "containercopy"}, ""))
|
||||
|
||||
pattern_WWApi_ContainerImport_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "container"}, ""))
|
||||
|
||||
pattern_WWApi_ContainerList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "container"}, ""))
|
||||
@@ -980,6 +1063,8 @@ var (
|
||||
|
||||
forward_WWApi_ContainerDelete_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_ContainerCopy_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_ContainerImport_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_ContainerList_0 = runtime.ForwardResponseMessage
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
// Routes for the wwapi (WareWulf API).
|
||||
// TODO: Try protoc-gen-doc for generating documentation.
|
||||
|
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.3.0
|
||||
// - protoc v3.21.1
|
||||
// - protoc-gen-go-grpc v1.2.0
|
||||
// - protoc v4.24.0
|
||||
// source: routes.proto
|
||||
|
||||
package wwapiv1
|
||||
|
||||
import (
|
||||
context "context"
|
||||
empty "github.com/golang/protobuf/ptypes/empty"
|
||||
grpc "google.golang.org/grpc"
|
||||
codes "google.golang.org/grpc/codes"
|
||||
status "google.golang.org/grpc/status"
|
||||
emptypb "google.golang.org/protobuf/types/known/emptypb"
|
||||
)
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
@@ -22,20 +19,6 @@ import (
|
||||
// Requires gRPC-Go v1.32.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion7
|
||||
|
||||
const (
|
||||
WWApi_ContainerBuild_FullMethodName = "/wwapi.v1.WWApi/ContainerBuild"
|
||||
WWApi_ContainerDelete_FullMethodName = "/wwapi.v1.WWApi/ContainerDelete"
|
||||
WWApi_ContainerImport_FullMethodName = "/wwapi.v1.WWApi/ContainerImport"
|
||||
WWApi_ContainerList_FullMethodName = "/wwapi.v1.WWApi/ContainerList"
|
||||
WWApi_ContainerShow_FullMethodName = "/wwapi.v1.WWApi/ContainerShow"
|
||||
WWApi_NodeAdd_FullMethodName = "/wwapi.v1.WWApi/NodeAdd"
|
||||
WWApi_NodeDelete_FullMethodName = "/wwapi.v1.WWApi/NodeDelete"
|
||||
WWApi_NodeList_FullMethodName = "/wwapi.v1.WWApi/NodeList"
|
||||
WWApi_NodeSet_FullMethodName = "/wwapi.v1.WWApi/NodeSet"
|
||||
WWApi_NodeStatus_FullMethodName = "/wwapi.v1.WWApi/NodeStatus"
|
||||
WWApi_Version_FullMethodName = "/wwapi.v1.WWApi/Version"
|
||||
)
|
||||
|
||||
// WWApiClient is the client API for WWApi service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
@@ -43,18 +26,19 @@ type WWApiClient interface {
|
||||
// ContainerBuild builds zero or more containers.
|
||||
ContainerBuild(ctx context.Context, in *ContainerBuildParameter, opts ...grpc.CallOption) (*ContainerListResponse, error)
|
||||
// ContainerDelete removes one or more container from Warewulf management.
|
||||
ContainerDelete(ctx context.Context, in *ContainerDeleteParameter, opts ...grpc.CallOption) (*empty.Empty, error)
|
||||
ContainerDelete(ctx context.Context, in *ContainerDeleteParameter, opts ...grpc.CallOption) (*emptypb.Empty, error)
|
||||
ContainerCopy(ctx context.Context, in *ContainerCopyParameter, opts ...grpc.CallOption) (*emptypb.Empty, error)
|
||||
// ContainerImport imports a container to Warewulf.
|
||||
ContainerImport(ctx context.Context, in *ContainerImportParameter, opts ...grpc.CallOption) (*ContainerListResponse, error)
|
||||
// ContainerList lists ContainerInfo for each container.
|
||||
ContainerList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ContainerListResponse, error)
|
||||
ContainerList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ContainerListResponse, error)
|
||||
// ContainerShow lists ContainerShow for each container.
|
||||
ContainerShow(ctx context.Context, in *ContainerShowParameter, opts ...grpc.CallOption) (*ContainerShowResponse, error)
|
||||
// NodeAdd adds one or more nodes for management by Warewulf and returns
|
||||
// the added nodes. Node fields may be shimmed in per profiles.
|
||||
NodeAdd(ctx context.Context, in *NodeAddParameter, opts ...grpc.CallOption) (*NodeListResponse, error)
|
||||
// NodeDelete removes one or more nodes from Warewulf management.
|
||||
NodeDelete(ctx context.Context, in *NodeDeleteParameter, opts ...grpc.CallOption) (*empty.Empty, error)
|
||||
NodeDelete(ctx context.Context, in *NodeDeleteParameter, opts ...grpc.CallOption) (*emptypb.Empty, error)
|
||||
// NodeList lists some or all nodes managed by Warewulf.
|
||||
NodeList(ctx context.Context, in *NodeNames, opts ...grpc.CallOption) (*NodeListResponse, error)
|
||||
// NodeSet updates node fields for one or more nodes.
|
||||
@@ -64,7 +48,7 @@ type WWApiClient interface {
|
||||
NodeStatus(ctx context.Context, in *NodeNames, opts ...grpc.CallOption) (*NodeStatusResponse, error)
|
||||
// Version returns the wwapi version, the api prefix, and the Warewulf
|
||||
// version. This is also useful for testing if the service is up.
|
||||
Version(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*VersionResponse, error)
|
||||
Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error)
|
||||
}
|
||||
|
||||
type wWApiClient struct {
|
||||
@@ -77,16 +61,25 @@ func NewWWApiClient(cc grpc.ClientConnInterface) WWApiClient {
|
||||
|
||||
func (c *wWApiClient) ContainerBuild(ctx context.Context, in *ContainerBuildParameter, opts ...grpc.CallOption) (*ContainerListResponse, error) {
|
||||
out := new(ContainerListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_ContainerBuild_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerBuild", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) ContainerDelete(ctx context.Context, in *ContainerDeleteParameter, opts ...grpc.CallOption) (*empty.Empty, error) {
|
||||
out := new(empty.Empty)
|
||||
err := c.cc.Invoke(ctx, WWApi_ContainerDelete_FullMethodName, in, out, opts...)
|
||||
func (c *wWApiClient) ContainerDelete(ctx context.Context, in *ContainerDeleteParameter, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerDelete", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) ContainerCopy(ctx context.Context, in *ContainerCopyParameter, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerCopy", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -95,16 +88,16 @@ func (c *wWApiClient) ContainerDelete(ctx context.Context, in *ContainerDeletePa
|
||||
|
||||
func (c *wWApiClient) ContainerImport(ctx context.Context, in *ContainerImportParameter, opts ...grpc.CallOption) (*ContainerListResponse, error) {
|
||||
out := new(ContainerListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_ContainerImport_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerImport", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) ContainerList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ContainerListResponse, error) {
|
||||
func (c *wWApiClient) ContainerList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ContainerListResponse, error) {
|
||||
out := new(ContainerListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_ContainerList_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerList", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -113,7 +106,7 @@ func (c *wWApiClient) ContainerList(ctx context.Context, in *empty.Empty, opts .
|
||||
|
||||
func (c *wWApiClient) ContainerShow(ctx context.Context, in *ContainerShowParameter, opts ...grpc.CallOption) (*ContainerShowResponse, error) {
|
||||
out := new(ContainerShowResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_ContainerShow_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerShow", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -122,16 +115,16 @@ func (c *wWApiClient) ContainerShow(ctx context.Context, in *ContainerShowParame
|
||||
|
||||
func (c *wWApiClient) NodeAdd(ctx context.Context, in *NodeAddParameter, opts ...grpc.CallOption) (*NodeListResponse, error) {
|
||||
out := new(NodeListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_NodeAdd_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeAdd", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) NodeDelete(ctx context.Context, in *NodeDeleteParameter, opts ...grpc.CallOption) (*empty.Empty, error) {
|
||||
out := new(empty.Empty)
|
||||
err := c.cc.Invoke(ctx, WWApi_NodeDelete_FullMethodName, in, out, opts...)
|
||||
func (c *wWApiClient) NodeDelete(ctx context.Context, in *NodeDeleteParameter, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeDelete", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -140,7 +133,7 @@ func (c *wWApiClient) NodeDelete(ctx context.Context, in *NodeDeleteParameter, o
|
||||
|
||||
func (c *wWApiClient) NodeList(ctx context.Context, in *NodeNames, opts ...grpc.CallOption) (*NodeListResponse, error) {
|
||||
out := new(NodeListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_NodeList_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeList", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -149,7 +142,7 @@ func (c *wWApiClient) NodeList(ctx context.Context, in *NodeNames, opts ...grpc.
|
||||
|
||||
func (c *wWApiClient) NodeSet(ctx context.Context, in *NodeSetParameter, opts ...grpc.CallOption) (*NodeListResponse, error) {
|
||||
out := new(NodeListResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_NodeSet_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeSet", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -158,16 +151,16 @@ func (c *wWApiClient) NodeSet(ctx context.Context, in *NodeSetParameter, opts ..
|
||||
|
||||
func (c *wWApiClient) NodeStatus(ctx context.Context, in *NodeNames, opts ...grpc.CallOption) (*NodeStatusResponse, error) {
|
||||
out := new(NodeStatusResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_NodeStatus_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeStatus", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) Version(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*VersionResponse, error) {
|
||||
func (c *wWApiClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) {
|
||||
out := new(VersionResponse)
|
||||
err := c.cc.Invoke(ctx, WWApi_Version_FullMethodName, in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/Version", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -181,18 +174,19 @@ type WWApiServer interface {
|
||||
// ContainerBuild builds zero or more containers.
|
||||
ContainerBuild(context.Context, *ContainerBuildParameter) (*ContainerListResponse, error)
|
||||
// ContainerDelete removes one or more container from Warewulf management.
|
||||
ContainerDelete(context.Context, *ContainerDeleteParameter) (*empty.Empty, error)
|
||||
ContainerDelete(context.Context, *ContainerDeleteParameter) (*emptypb.Empty, error)
|
||||
ContainerCopy(context.Context, *ContainerCopyParameter) (*emptypb.Empty, error)
|
||||
// ContainerImport imports a container to Warewulf.
|
||||
ContainerImport(context.Context, *ContainerImportParameter) (*ContainerListResponse, error)
|
||||
// ContainerList lists ContainerInfo for each container.
|
||||
ContainerList(context.Context, *empty.Empty) (*ContainerListResponse, error)
|
||||
ContainerList(context.Context, *emptypb.Empty) (*ContainerListResponse, error)
|
||||
// ContainerShow lists ContainerShow for each container.
|
||||
ContainerShow(context.Context, *ContainerShowParameter) (*ContainerShowResponse, error)
|
||||
// NodeAdd adds one or more nodes for management by Warewulf and returns
|
||||
// the added nodes. Node fields may be shimmed in per profiles.
|
||||
NodeAdd(context.Context, *NodeAddParameter) (*NodeListResponse, error)
|
||||
// NodeDelete removes one or more nodes from Warewulf management.
|
||||
NodeDelete(context.Context, *NodeDeleteParameter) (*empty.Empty, error)
|
||||
NodeDelete(context.Context, *NodeDeleteParameter) (*emptypb.Empty, error)
|
||||
// NodeList lists some or all nodes managed by Warewulf.
|
||||
NodeList(context.Context, *NodeNames) (*NodeListResponse, error)
|
||||
// NodeSet updates node fields for one or more nodes.
|
||||
@@ -202,7 +196,7 @@ type WWApiServer interface {
|
||||
NodeStatus(context.Context, *NodeNames) (*NodeStatusResponse, error)
|
||||
// Version returns the wwapi version, the api prefix, and the Warewulf
|
||||
// version. This is also useful for testing if the service is up.
|
||||
Version(context.Context, *empty.Empty) (*VersionResponse, error)
|
||||
Version(context.Context, *emptypb.Empty) (*VersionResponse, error)
|
||||
mustEmbedUnimplementedWWApiServer()
|
||||
}
|
||||
|
||||
@@ -213,13 +207,16 @@ type UnimplementedWWApiServer struct {
|
||||
func (UnimplementedWWApiServer) ContainerBuild(context.Context, *ContainerBuildParameter) (*ContainerListResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerBuild not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerDelete(context.Context, *ContainerDeleteParameter) (*empty.Empty, error) {
|
||||
func (UnimplementedWWApiServer) ContainerDelete(context.Context, *ContainerDeleteParameter) (*emptypb.Empty, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerDelete not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerCopy(context.Context, *ContainerCopyParameter) (*emptypb.Empty, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerCopy not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerImport(context.Context, *ContainerImportParameter) (*ContainerListResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerImport not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerList(context.Context, *empty.Empty) (*ContainerListResponse, error) {
|
||||
func (UnimplementedWWApiServer) ContainerList(context.Context, *emptypb.Empty) (*ContainerListResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerList not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerShow(context.Context, *ContainerShowParameter) (*ContainerShowResponse, error) {
|
||||
@@ -228,7 +225,7 @@ func (UnimplementedWWApiServer) ContainerShow(context.Context, *ContainerShowPar
|
||||
func (UnimplementedWWApiServer) NodeAdd(context.Context, *NodeAddParameter) (*NodeListResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method NodeAdd not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) NodeDelete(context.Context, *NodeDeleteParameter) (*empty.Empty, error) {
|
||||
func (UnimplementedWWApiServer) NodeDelete(context.Context, *NodeDeleteParameter) (*emptypb.Empty, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method NodeDelete not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) NodeList(context.Context, *NodeNames) (*NodeListResponse, error) {
|
||||
@@ -240,7 +237,7 @@ func (UnimplementedWWApiServer) NodeSet(context.Context, *NodeSetParameter) (*No
|
||||
func (UnimplementedWWApiServer) NodeStatus(context.Context, *NodeNames) (*NodeStatusResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method NodeStatus not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) Version(context.Context, *empty.Empty) (*VersionResponse, error) {
|
||||
func (UnimplementedWWApiServer) Version(context.Context, *emptypb.Empty) (*VersionResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method Version not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) mustEmbedUnimplementedWWApiServer() {}
|
||||
@@ -266,7 +263,7 @@ func _WWApi_ContainerBuild_Handler(srv interface{}, ctx context.Context, dec fun
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_ContainerBuild_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerBuild",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerBuild(ctx, req.(*ContainerBuildParameter))
|
||||
@@ -284,7 +281,7 @@ func _WWApi_ContainerDelete_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_ContainerDelete_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerDelete",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerDelete(ctx, req.(*ContainerDeleteParameter))
|
||||
@@ -292,6 +289,24 @@ func _WWApi_ContainerDelete_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _WWApi_ContainerCopy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(ContainerCopyParameter)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(WWApiServer).ContainerCopy(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerCopy",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerCopy(ctx, req.(*ContainerCopyParameter))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _WWApi_ContainerImport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(ContainerImportParameter)
|
||||
if err := dec(in); err != nil {
|
||||
@@ -302,7 +317,7 @@ func _WWApi_ContainerImport_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_ContainerImport_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerImport",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerImport(ctx, req.(*ContainerImportParameter))
|
||||
@@ -311,7 +326,7 @@ func _WWApi_ContainerImport_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
}
|
||||
|
||||
func _WWApi_ContainerList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(empty.Empty)
|
||||
in := new(emptypb.Empty)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -320,10 +335,10 @@ func _WWApi_ContainerList_Handler(srv interface{}, ctx context.Context, dec func
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_ContainerList_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerList",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerList(ctx, req.(*empty.Empty))
|
||||
return srv.(WWApiServer).ContainerList(ctx, req.(*emptypb.Empty))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
@@ -338,7 +353,7 @@ func _WWApi_ContainerShow_Handler(srv interface{}, ctx context.Context, dec func
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_ContainerShow_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerShow",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerShow(ctx, req.(*ContainerShowParameter))
|
||||
@@ -356,7 +371,7 @@ func _WWApi_NodeAdd_Handler(srv interface{}, ctx context.Context, dec func(inter
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_NodeAdd_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/NodeAdd",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).NodeAdd(ctx, req.(*NodeAddParameter))
|
||||
@@ -374,7 +389,7 @@ func _WWApi_NodeDelete_Handler(srv interface{}, ctx context.Context, dec func(in
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_NodeDelete_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/NodeDelete",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).NodeDelete(ctx, req.(*NodeDeleteParameter))
|
||||
@@ -392,7 +407,7 @@ func _WWApi_NodeList_Handler(srv interface{}, ctx context.Context, dec func(inte
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_NodeList_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/NodeList",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).NodeList(ctx, req.(*NodeNames))
|
||||
@@ -410,7 +425,7 @@ func _WWApi_NodeSet_Handler(srv interface{}, ctx context.Context, dec func(inter
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_NodeSet_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/NodeSet",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).NodeSet(ctx, req.(*NodeSetParameter))
|
||||
@@ -428,7 +443,7 @@ func _WWApi_NodeStatus_Handler(srv interface{}, ctx context.Context, dec func(in
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_NodeStatus_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/NodeStatus",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).NodeStatus(ctx, req.(*NodeNames))
|
||||
@@ -437,7 +452,7 @@ func _WWApi_NodeStatus_Handler(srv interface{}, ctx context.Context, dec func(in
|
||||
}
|
||||
|
||||
func _WWApi_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(empty.Empty)
|
||||
in := new(emptypb.Empty)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -446,10 +461,10 @@ func _WWApi_Version_Handler(srv interface{}, ctx context.Context, dec func(inter
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: WWApi_Version_FullMethodName,
|
||||
FullMethod: "/wwapi.v1.WWApi/Version",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).Version(ctx, req.(*empty.Empty))
|
||||
return srv.(WWApiServer).Version(ctx, req.(*emptypb.Empty))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
@@ -469,6 +484,10 @@ var WWApi_ServiceDesc = grpc.ServiceDesc{
|
||||
MethodName: "ContainerDelete",
|
||||
Handler: _WWApi_ContainerDelete_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "ContainerCopy",
|
||||
Handler: _WWApi_ContainerCopy_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "ContainerImport",
|
||||
Handler: _WWApi_ContainerImport_Handler,
|
||||
|
||||
@@ -349,3 +349,13 @@ issues in most circumstances:
|
||||
If you are still getting "Not enough memory" or "No space left on
|
||||
device" errors, try disabling any "memory hole" features or updating
|
||||
your system BIOS or firmware.
|
||||
|
||||
Duplicating a container
|
||||
============================
|
||||
It is possible to duplicate an installed image by using :
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# wwctl container copy CONTAINER_NAME DUPLICATED_CONTAINER_NAME
|
||||
|
||||
This kind of duplication can be useful if you are looking for canary tests.
|
||||
@@ -76,6 +76,7 @@ Node status
|
||||
========================
|
||||
During the whole provisioning process of your nodes, you can check their status
|
||||
through the following command :
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# wwctl node status
|
||||
@@ -85,6 +86,7 @@ through the following command :
|
||||
|
||||
|
||||
For each node, there is 4 different stages :
|
||||
|
||||
* **IPXE**
|
||||
* **KERNEL**
|
||||
* **SYSTEM_OVERLAY**
|
||||
|
||||
Reference in New Issue
Block a user