-
Notifications
You must be signed in to change notification settings - Fork 0
/
tenant_id.go
89 lines (76 loc) · 2.08 KB
/
tenant_id.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
// Copyright © 2020 The Things Industries B.V.
package packetbroker
import (
"errors"
"fmt"
"regexp"
"strings"
)
var tenantIDRegexp = regexp.MustCompile("^[a-z0-9](?:[-]?[a-z0-9]){2,}$|^$")
// TenantID identifies a tenant of a Member.
type TenantID struct {
NetID
ID string
}
func (t TenantID) String() string {
id := t.ID
if id == "" {
id = "default"
}
return fmt.Sprintf("%s/%s", t.NetID, id)
}
// Validate returns an error if the tenant ID is invalid.
func (t TenantID) Validate() error {
if !tenantIDRegexp.MatchString(t.ID) {
return fmt.Errorf("invalid tenant ID format")
}
return nil
}
// ParseTenantID parses the TenantID formatted with String().
func ParseTenantID(s string) (TenantID, error) {
p := strings.SplitN(s, "/", 2)
if len(p) != 2 {
return TenantID{}, errors.New("invalid tenant ID format")
}
res := TenantID{ID: p[1]}
if err := res.NetID.UnmarshalText([]byte(p[0])); err != nil {
return TenantID{}, err
}
return res, res.Validate()
}
// TenantRequest is a request with a Tenant ID.
type TenantRequest interface {
GetNetId() uint32
GetTenantId() string
}
// RequestTenantID returns the TenantID of the given request.
func RequestTenantID(req TenantRequest) TenantID {
return TenantID{
NetID: NetID(req.GetNetId()),
ID: req.GetTenantId(),
}
}
// ForwarderTenantRequest is a request with a Forwarder Tenant ID.
type ForwarderTenantRequest interface {
GetForwarderNetId() uint32
GetForwarderTenantId() string
}
// ForwarderTenantID returns the TenantID of the given interface.
func ForwarderTenantID(req ForwarderTenantRequest) TenantID {
return TenantID{
NetID: NetID(req.GetForwarderNetId()),
ID: req.GetForwarderTenantId(),
}
}
// HomeNetworkTenantRequest is a request with a Home Network Tenant ID.
type HomeNetworkTenantRequest interface {
GetHomeNetworkNetId() uint32
GetHomeNetworkTenantId() string
}
// HomeNetworkTenantID returns the TenantID of the given interface.
func HomeNetworkTenantID(req HomeNetworkTenantRequest) TenantID {
return TenantID{
NetID: NetID(req.GetHomeNetworkNetId()),
ID: req.GetHomeNetworkTenantId(),
}
}