-
Notifications
You must be signed in to change notification settings - Fork 301
/
devicetemplateconverter.go
91 lines (76 loc) · 3.14 KB
/
devicetemplateconverter.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright © 2019 The Things Network Foundation, The Things Industries B.V.
//
// 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 devicetemplateconverter provides device template services.
package devicetemplateconverter
import (
"context"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"go.thethings.network/lorawan-stack/pkg/component"
"go.thethings.network/lorawan-stack/pkg/devicetemplates"
"go.thethings.network/lorawan-stack/pkg/errors"
"go.thethings.network/lorawan-stack/pkg/log"
"go.thethings.network/lorawan-stack/pkg/ttnpb"
"google.golang.org/grpc"
)
// Config represents the DeviceTemplateConverter configuration.
type Config struct {
Enabled []string `name:"enabled" description:"Enabled converters"`
}
// DeviceTemplateConverter implements the Device Template Converter component.
//
// The Device Template Converter exposes the EndDeviceTemplateConverter service.
type DeviceTemplateConverter struct {
*component.Component
ctx context.Context
converters map[string]devicetemplates.Converter
grpc struct {
endDeviceTemplateConverter *endDeviceTemplateConverterServer
}
}
var errNotFound = errors.DefineNotFound("converter", "converter `{id}` not found")
// New returns a new *DeviceTemplateConverter.
func New(c *component.Component, conf *Config) (*DeviceTemplateConverter, error) {
converters := make(map[string]devicetemplates.Converter, len(conf.Enabled))
for _, id := range conf.Enabled {
converter := devicetemplates.GetConverter(id)
if converter == nil {
return nil, errNotFound.WithAttributes("id", id)
}
converters[id] = converter
}
dtc := &DeviceTemplateConverter{
Component: c,
ctx: log.NewContextWithField(c.Context(), "namespace", "devicetemplateconverter"),
converters: converters,
}
dtc.grpc.endDeviceTemplateConverter = &endDeviceTemplateConverterServer{DTC: dtc}
c.RegisterGRPC(dtc)
return dtc, nil
}
// Context returns the context of the Device Template Converter.
func (dtc *DeviceTemplateConverter) Context() context.Context {
return dtc.ctx
}
// Roles returns the roles that the Device Template Converter fulfills.
func (dtc *DeviceTemplateConverter) Roles() []ttnpb.ClusterRole {
return []ttnpb.ClusterRole{ttnpb.ClusterRole_DEVICE_TEMPLATE_CONVERTER}
}
// RegisterServices registers services provided by dtc at s.
func (dtc *DeviceTemplateConverter) RegisterServices(s *grpc.Server) {
ttnpb.RegisterEndDeviceTemplateConverterServer(s, dtc.grpc.endDeviceTemplateConverter)
}
// RegisterHandlers registers gRPC handlers.
func (dtc *DeviceTemplateConverter) RegisterHandlers(s *runtime.ServeMux, conn *grpc.ClientConn) {
ttnpb.RegisterEndDeviceTemplateConverterHandler(dtc.Context(), s, conn)
}