/
tag_type.go
116 lines (94 loc) · 2.97 KB
/
tag_type.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package types
import (
"context"
"fmt"
"strconv"
"github.com/Juniper/asf/pkg/errutil"
"github.com/Juniper/contrail/pkg/models"
"github.com/Juniper/contrail/pkg/services"
asfdb "github.com/Juniper/asf/pkg/db"
asfmodels "github.com/Juniper/asf/pkg/models"
)
const (
tagTypeIDPoolKey = "tag_type_id"
)
// CreateTagType validates if TagTypeID is not set, allocates one and creates new Tag Type.
func (sv *ContrailTypeLogicService) CreateTagType(
ctx context.Context,
request *services.CreateTagTypeRequest,
) (*services.CreateTagTypeResponse, error) {
var response *services.CreateTagTypeResponse
tt := request.GetTagType()
if tt.GetTagTypeID() != "" {
return response, errutil.ErrorBadRequestf("Tag Type ID is not settable")
}
err := sv.InTransactionDoer.DoInTransaction(
ctx,
func(ctx context.Context) error {
id, err := sv.IntPoolAllocator.AllocateInt(ctx, tagTypeIDPoolKey, asfdb.EmptyIntOwner)
if err != nil {
return err
}
tt.TagTypeID = fmt.Sprintf("0x%04x", id)
response, err = sv.BaseService.CreateTagType(ctx, request)
return err
})
return response, err
}
// UpdateTagType checks if DisplayName or TagTypeID is provided in request.
func (sv *ContrailTypeLogicService) UpdateTagType(
ctx context.Context,
request *services.UpdateTagTypeRequest,
) (*services.UpdateTagTypeResponse, error) {
var response *services.UpdateTagTypeResponse
fm := request.GetFieldMask()
if asfmodels.FieldMaskContains(&fm, models.TagTypeFieldDisplayName) ||
asfmodels.FieldMaskContains(&fm, models.TagTypeFieldTagTypeID) {
return response, errutil.ErrorBadRequest("Tag Type value nor ID cannot be updated")
}
err := sv.InTransactionDoer.DoInTransaction(
ctx,
func(ctx context.Context) error {
var err error
response, err = sv.BaseService.UpdateTagType(ctx, request)
return err
})
return response, err
}
// DeleteTagType deallocates TagTypeID and deletes Tag Type.
func (sv *ContrailTypeLogicService) DeleteTagType(
ctx context.Context,
request *services.DeleteTagTypeRequest,
) (*services.DeleteTagTypeResponse, error) {
var response *services.DeleteTagTypeResponse
err := sv.InTransactionDoer.DoInTransaction(
ctx,
func(ctx context.Context) error {
tt, err := sv.getTagType(ctx, request.GetID())
if err != nil {
return err
}
val, err := strconv.ParseInt(tt.TagTypeID, 0, 64)
if err != nil {
return errutil.ErrorBadRequestf("convert hex to int error for (%v): %s", tt.TagTypeID, err)
}
if err = sv.IntPoolAllocator.DeallocateInt(ctx, tagTypeIDPoolKey, val); err != nil {
return errutil.ErrorBadRequestf("cannot deallocate int (%v): %s", val, err)
}
response, err = sv.BaseService.DeleteTagType(ctx, request)
return err
})
return response, err
}
func (sv *ContrailTypeLogicService) getTagType(
ctx context.Context,
id string,
) (*models.TagType, error) {
tagTypeResponse, err := sv.ReadService.GetTagType(
ctx,
&services.GetTagTypeRequest{
ID: id,
},
)
return tagTypeResponse.GetTagType(), err
}