-
Notifications
You must be signed in to change notification settings - Fork 9
/
client.go
67 lines (54 loc) · 2.54 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
Copyright (c) 2021-2023 Nordix Foundation
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.
*/
package interfacename
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/protobuf/types/known/emptypb"
"github.com/networkservicemesh/api/pkg/api/networkservice"
"github.com/networkservicemesh/sdk/pkg/networkservice/core/next"
)
type interfaceNameClient struct {
*interfaceNameSetter
}
// NewClient implements NetworkServiceClient to generate and add the interface name in the
// mechanism and mechanism preferences of the requests
func NewClient(prefix string, generator NameGenerator) networkservice.NetworkServiceClient {
return &interfaceNameClient{
newInterfaceNameSetter(prefix, generator, MAX_INTERFACE_NAME_LENGTH),
}
}
// Request sets the value for the common.InterfaceNameKey key in the parameters of the mechanism
// A non-nil error is returned if the name generation fails or if a next element in the chain returns a non-nil error
// It implements NetworkServiceClient for the interfacename package
func (inc *interfaceNameClient) Request(ctx context.Context, request *networkservice.NetworkServiceRequest, opts ...grpc.CallOption) (*networkservice.Connection, error) {
inc.SetInterfaceName(request)
connection, err := next.Client(ctx).Request(ctx, request, opts...)
if err != nil {
inc.UnsetInterfaceName(request)
return connection, fmt.Errorf("failed to request (%s) connection to NSM (interfaceNameClient): %w", request.String(), err)
}
return connection, nil
}
// Close it does nothing except calling the next Close in the chain
// A non-nil error if a next element in the chain returns a non-nil error
// It implements NetworkServiceClient for the interfacename package
func (inc *interfaceNameClient) Close(ctx context.Context, conn *networkservice.Connection, opts ...grpc.CallOption) (*emptypb.Empty, error) {
inc.UnsetInterfaceName(conn)
empty, err := next.Client(ctx).Close(ctx, conn, opts...)
if err != nil {
return empty, fmt.Errorf("failed to close (%s) connection from NSM (interfaceNameClient): %w", conn.String(), err)
}
return empty, nil
}