Add container rename support
Signed-off-by: jason yang <jasonyangshadow@gmail.com>
This commit is contained in:
committed by
Jonathon Anderson
parent
7d17bcc6fa
commit
d262ec10ef
45
internal/app/wwctl/container/rename/main.go
Normal file
45
internal/app/wwctl/container/rename/main.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package rename
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
api "github.com/hpcng/warewulf/internal/pkg/api/container"
|
||||
"github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1"
|
||||
"github.com/hpcng/warewulf/internal/pkg/container"
|
||||
"github.com/hpcng/warewulf/internal/pkg/wwlog"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func CobraRunE(cmd *cobra.Command, args []string) (err error) {
|
||||
if len(args) > 2 {
|
||||
wwlog.Warn("rename only requires 2 arguments but you provided %d arguments. Hence, they will be ignored.", len(args))
|
||||
}
|
||||
|
||||
crp := &wwapiv1.ContainerRenameParameter{
|
||||
ContainerName: args[0],
|
||||
TargetName: args[1],
|
||||
Build: SetBuild,
|
||||
}
|
||||
|
||||
if !container.DoesSourceExist(crp.ContainerName) {
|
||||
return fmt.Errorf("%s source dir does not exist", crp.ContainerName)
|
||||
}
|
||||
|
||||
if container.DoesSourceExist(crp.TargetName) {
|
||||
return fmt.Errorf("an other container with the name %s already exists", crp.TargetName)
|
||||
}
|
||||
|
||||
if !container.ValidName(crp.TargetName) {
|
||||
wwlog.Error("Container name contains illegal characters : %s", crp.TargetName)
|
||||
return
|
||||
}
|
||||
|
||||
err = api.ContainerRename(crp)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("could not rename image: %s", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
wwlog.Info("Container %s successfully renamed as %s", crp.ContainerName, crp.TargetName)
|
||||
return
|
||||
}
|
||||
63
internal/app/wwctl/container/rename/main_test.go
Normal file
63
internal/app/wwctl/container/rename/main_test.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package rename
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
containerList "github.com/hpcng/warewulf/internal/app/wwctl/container/list"
|
||||
"github.com/hpcng/warewulf/internal/pkg/testenv"
|
||||
"github.com/hpcng/warewulf/internal/pkg/warewulfd"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test_Rename(t *testing.T) {
|
||||
env := testenv.New(t)
|
||||
env.WriteFile(t, path.Join(testenv.WWChrootdir, "test-container/rootfs/file"), `test`)
|
||||
defer env.RemoveAll(t)
|
||||
warewulfd.SetNoDaemon()
|
||||
|
||||
// first we will verify that there is an existing container
|
||||
t.Run("container list", func(t *testing.T) {
|
||||
verifyContainerListOutput(t, "test-container")
|
||||
})
|
||||
|
||||
// then rename it
|
||||
t.Run("container rename", func(t *testing.T) {
|
||||
baseCmd := GetCommand()
|
||||
baseCmd.SetOut(nil)
|
||||
baseCmd.SetErr(nil)
|
||||
baseCmd.SetArgs([]string{"test-container", "test-container-rename"})
|
||||
err := baseCmd.Execute()
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
|
||||
// retrieve again
|
||||
t.Run("Container list", func(t *testing.T) {
|
||||
verifyContainerListOutput(t, "test-container-rename")
|
||||
})
|
||||
}
|
||||
|
||||
func verifyContainerListOutput(t *testing.T, content string) {
|
||||
baseCmd := containerList.GetCommand()
|
||||
baseCmd.SetOut(nil)
|
||||
baseCmd.SetErr(nil)
|
||||
stdoutR, stdoutW, _ := os.Pipe()
|
||||
os.Stdout = stdoutW
|
||||
err := baseCmd.Execute()
|
||||
assert.NoError(t, err)
|
||||
|
||||
stdoutC := make(chan string)
|
||||
go func() {
|
||||
var buf bytes.Buffer
|
||||
_, _ = io.Copy(&buf, stdoutR)
|
||||
stdoutC <- buf.String()
|
||||
}()
|
||||
stdoutW.Close()
|
||||
|
||||
stdout := <-stdoutC
|
||||
assert.NotEmpty(t, stdout, "output should not be empty")
|
||||
assert.Contains(t, stdout, content)
|
||||
}
|
||||
35
internal/app/wwctl/container/rename/root.go
Normal file
35
internal/app/wwctl/container/rename/root.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package rename
|
||||
|
||||
import (
|
||||
"github.com/hpcng/warewulf/internal/pkg/container"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var baseCmd = &cobra.Command{
|
||||
DisableFlagsInUseLine: true,
|
||||
Use: "rename CONTAINER NEW_NAME",
|
||||
Aliases: []string{"rn"},
|
||||
Short: "Rename an existing container",
|
||||
Long: "This command will rename an existing container.",
|
||||
RunE: CobraRunE,
|
||||
Args: cobra.MinimumNArgs(2),
|
||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
if len(args) != 0 {
|
||||
return nil, cobra.ShellCompDirectiveNoFileComp
|
||||
}
|
||||
list, _ := container.ListSources()
|
||||
return list, cobra.ShellCompDirectiveNoFileComp
|
||||
},
|
||||
}
|
||||
|
||||
var SetBuild bool
|
||||
|
||||
func init() {
|
||||
// Nothing to do here
|
||||
baseCmd.PersistentFlags().BoolVarP(&SetBuild, "build", "b", false, "Build container after rename")
|
||||
}
|
||||
|
||||
// GetRootCommand returns the root cobra.Command for the application.
|
||||
func GetCommand() *cobra.Command {
|
||||
return baseCmd
|
||||
}
|
||||
@@ -7,23 +7,22 @@ import (
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/exec"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/imprt"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/list"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/rename"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/shell"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/show"
|
||||
"github.com/hpcng/warewulf/internal/app/wwctl/container/syncuser"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
baseCmd = &cobra.Command{
|
||||
DisableFlagsInUseLine: true,
|
||||
Use: "container COMMAND [OPTIONS]",
|
||||
Short: "Container / VNFS image management",
|
||||
Long: "Starting with version 4, Warewulf uses containers to build the bootable VNFS\n" +
|
||||
"node images. These commands will help you import, manage, and transform\n" +
|
||||
"containers into bootable Warewulf VNFS images.",
|
||||
Aliases: []string{"vnfs"},
|
||||
}
|
||||
)
|
||||
var baseCmd = &cobra.Command{
|
||||
DisableFlagsInUseLine: true,
|
||||
Use: "container COMMAND [OPTIONS]",
|
||||
Short: "Container / VNFS image management",
|
||||
Long: "Starting with version 4, Warewulf uses containers to build the bootable VNFS\n" +
|
||||
"node images. These commands will help you import, manage, and transform\n" +
|
||||
"containers into bootable Warewulf VNFS images.",
|
||||
Aliases: []string{"vnfs"},
|
||||
}
|
||||
|
||||
func init() {
|
||||
baseCmd.AddCommand(build.GetCommand())
|
||||
@@ -35,7 +34,7 @@ func init() {
|
||||
baseCmd.AddCommand(show.GetCommand())
|
||||
baseCmd.AddCommand(syncuser.GetCommand())
|
||||
baseCmd.AddCommand(copy.GetCommand())
|
||||
|
||||
baseCmd.AddCommand(rename.GetCommand())
|
||||
}
|
||||
|
||||
// GetRootCommand returns the root cobra.Command for the application.
|
||||
|
||||
@@ -404,6 +404,69 @@ func ContainerShow(csp *wwapiv1.ContainerShowParameter) (response *wwapiv1.Conta
|
||||
return
|
||||
}
|
||||
|
||||
func ContainerRename(crp *wwapiv1.ContainerRenameParameter) (err error) {
|
||||
// rename the container source folder
|
||||
sourceDir := container.SourceDir(crp.ContainerName)
|
||||
destDir := container.SourceDir(crp.TargetName)
|
||||
err = os.Rename(sourceDir, destDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if crp.Build {
|
||||
err = container.Build(crp.TargetName, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// update the nodes profiles container name
|
||||
nodeDB, err := node.New()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
nodes, err := nodeDB.FindAllNodes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, node := range nodes {
|
||||
if node.ContainerName.Get() == crp.ContainerName {
|
||||
node.ContainerName.Set(crp.TargetName)
|
||||
if err := nodeDB.NodeUpdate(node); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
profiles, err := nodeDB.FindAllProfiles()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, profile := range profiles {
|
||||
if profile.ContainerName.Get() == crp.ContainerName {
|
||||
profile.ContainerName.Set(crp.TargetName)
|
||||
if err := nodeDB.ProfileUpdate(profile); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err = nodeDB.Persist()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = warewulfd.DaemonStatus()
|
||||
if err != nil {
|
||||
// warewulfd is not running, skip
|
||||
return nil
|
||||
}
|
||||
|
||||
// else reload daemon to apply new changes
|
||||
return warewulfd.DaemonReload()
|
||||
}
|
||||
|
||||
// Private helpers
|
||||
|
||||
func setOCICredentials(sCtx *types.SystemContext) error {
|
||||
|
||||
@@ -84,6 +84,13 @@ message ContainerSyncUserParameter {
|
||||
string containerName = 1;
|
||||
}
|
||||
|
||||
// ContainerRenameParameter is the input for ContainerRename
|
||||
message ContainerRenameParameter {
|
||||
string containerName = 1;
|
||||
string targetName = 2;
|
||||
bool build = 3;
|
||||
}
|
||||
|
||||
// Nodes
|
||||
|
||||
// NodeNames is an array of node ids.
|
||||
@@ -275,6 +282,14 @@ service WWApi {
|
||||
};
|
||||
}
|
||||
|
||||
// ContainerRename renames the container
|
||||
rpc ContainerRename(ContainerRenameParameter) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/containerrename"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Nodes
|
||||
|
||||
// NodeAdd adds one or more nodes for management by Warewulf and returns
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -224,6 +224,40 @@ func local_request_WWApi_ContainerShow_0(ctx context.Context, marshaler runtime.
|
||||
|
||||
}
|
||||
|
||||
func request_WWApi_ContainerRename_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ContainerRenameParameter
|
||||
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.ContainerRename(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func local_request_WWApi_ContainerRename_0(ctx context.Context, marshaler runtime.Marshaler, server WWApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ContainerRenameParameter
|
||||
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.ContainerRename(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
func request_WWApi_NodeAdd_0(ctx context.Context, marshaler runtime.Marshaler, client WWApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq NodeAddParameter
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -574,6 +608,31 @@ func RegisterWWApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerRename_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/ContainerRename", runtime.WithHTTPPathPattern("/v1/containerrename"))
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := local_request_WWApi_ContainerRename_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_ContainerRename_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_NodeAdd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
@@ -897,6 +956,28 @@ func RegisterWWApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_ContainerRename_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/ContainerRename", runtime.WithHTTPPathPattern("/v1/containerrename"))
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_WWApi_ContainerRename_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_ContainerRename_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_WWApi_NodeAdd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
@@ -1045,6 +1126,8 @@ var (
|
||||
|
||||
pattern_WWApi_ContainerShow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "containershow"}, ""))
|
||||
|
||||
pattern_WWApi_ContainerRename_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "containerrename"}, ""))
|
||||
|
||||
pattern_WWApi_NodeAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "node"}, ""))
|
||||
|
||||
pattern_WWApi_NodeDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "node"}, ""))
|
||||
@@ -1071,6 +1154,8 @@ var (
|
||||
|
||||
forward_WWApi_ContainerShow_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_ContainerRename_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_NodeAdd_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_WWApi_NodeDelete_0 = runtime.ForwardResponseMessage
|
||||
|
||||
@@ -34,6 +34,8 @@ type WWApiClient interface {
|
||||
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)
|
||||
// ContainerRename renames the container
|
||||
ContainerRename(ctx context.Context, in *ContainerRenameParameter, opts ...grpc.CallOption) (*emptypb.Empty, 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)
|
||||
@@ -113,6 +115,15 @@ func (c *wWApiClient) ContainerShow(ctx context.Context, in *ContainerShowParame
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) ContainerRename(ctx context.Context, in *ContainerRenameParameter, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/ContainerRename", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *wWApiClient) NodeAdd(ctx context.Context, in *NodeAddParameter, opts ...grpc.CallOption) (*NodeListResponse, error) {
|
||||
out := new(NodeListResponse)
|
||||
err := c.cc.Invoke(ctx, "/wwapi.v1.WWApi/NodeAdd", in, out, opts...)
|
||||
@@ -182,6 +193,8 @@ type WWApiServer interface {
|
||||
ContainerList(context.Context, *emptypb.Empty) (*ContainerListResponse, error)
|
||||
// ContainerShow lists ContainerShow for each container.
|
||||
ContainerShow(context.Context, *ContainerShowParameter) (*ContainerShowResponse, error)
|
||||
// ContainerRename renames the container
|
||||
ContainerRename(context.Context, *ContainerRenameParameter) (*emptypb.Empty, 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)
|
||||
@@ -222,6 +235,9 @@ func (UnimplementedWWApiServer) ContainerList(context.Context, *emptypb.Empty) (
|
||||
func (UnimplementedWWApiServer) ContainerShow(context.Context, *ContainerShowParameter) (*ContainerShowResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerShow not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) ContainerRename(context.Context, *ContainerRenameParameter) (*emptypb.Empty, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method ContainerRename not implemented")
|
||||
}
|
||||
func (UnimplementedWWApiServer) NodeAdd(context.Context, *NodeAddParameter) (*NodeListResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method NodeAdd not implemented")
|
||||
}
|
||||
@@ -361,6 +377,24 @@ func _WWApi_ContainerShow_Handler(srv interface{}, ctx context.Context, dec func
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _WWApi_ContainerRename_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(ContainerRenameParameter)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(WWApiServer).ContainerRename(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/wwapi.v1.WWApi/ContainerRename",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(WWApiServer).ContainerRename(ctx, req.(*ContainerRenameParameter))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _WWApi_NodeAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(NodeAddParameter)
|
||||
if err := dec(in); err != nil {
|
||||
@@ -500,6 +534,10 @@ var WWApi_ServiceDesc = grpc.ServiceDesc{
|
||||
MethodName: "ContainerShow",
|
||||
Handler: _WWApi_ContainerShow_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "ContainerRename",
|
||||
Handler: _WWApi_ContainerRename_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "NodeAdd",
|
||||
Handler: _WWApi_NodeAdd_Handler,
|
||||
|
||||
Reference in New Issue
Block a user