Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DXE-3764 Release/v8.1.0 #203

Merged
merged 5 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# EDGEGRID GOLANG RELEASE NOTES

## 8.1.0 (April 11, 2024)

#### FEATURES/ENHANCEMENTS:

* DNS
* Modified `ParseRData` method to remove priority, weight and port from targets **only** when those values are same for all `SRV` targets.
Otherwise, targets are returned untouched and `priority`, `weight` and `port` in the map are not populated.

* Image and Video Manager
* Added `SmartCrop` transformation

## 8.0.0 (March 19, 2024)

#### BREAKING CHANGES:
Expand Down
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ VERSION ?= $(shell git describe --tags --always | grep '^v\d' || \
BIN = $(CURDIR)/bin
GOLANGCI_LINT_VERSION = v1.55.2
GO = go
GOMODTIDY = $(GO) mod tidy
TIMEOUT = 15
V = 0
Q = $(if $(filter 1,$V),,@)
Expand Down Expand Up @@ -42,7 +43,7 @@ $(BIN)/golangci-lint: ; $(info $(M) Installing golangci-lint...) @


.PHONY: all
all: clean fmt-check lint test-verbose create-junit-report create-coverage-files clean-tools
all: clean tidy fmt-check lint test-verbose create-junit-report create-coverage-files clean-tools

# Tests

Expand Down Expand Up @@ -83,6 +84,10 @@ create-coverage-files: | $(GOCOV) $(GOCOVXML); $(info $(M) Creating coverage fil
lint: | $(GOLANGCILINT) ; $(info $(M) Running golangci-lint...) @
$Q $(BIN)/golangci-lint run

.PHONY: tidy
tidy: ; $(info $(M) Running go mod tidy...) @
@$(GOMODTIDY)

.PHONY: fmt
fmt: | $(GOIMPORTS); $(info $(M) Running goimports...) @ ## Run goimports on all source files
$Q $(GOIMPORTS) -w .
Expand Down
40 changes: 32 additions & 8 deletions pkg/dns/record_lookup.go
Original file line number Diff line number Diff line change
Expand Up @@ -387,15 +387,39 @@ func resolveRRSIGType(rData []string, fieldMap map[string]interface{}) {
}

func resolveSRVType(rData, newRData []string, fieldMap map[string]interface{}) {
// pull out some fields
parts := strings.Split(rData[0], " ")
fieldMap["priority"], _ = strconv.Atoi(parts[0])
fieldMap["weight"], _ = strconv.Atoi(parts[1])
fieldMap["port"], _ = strconv.Atoi(parts[2])
// populate target
// if all targets have the same priority, weight and port, process it in the old way
priorityMap := make(map[int]struct{})
weightMap := make(map[int]struct{})
portMap := make(map[int]struct{})
for _, rContent := range rData {
parts = strings.Split(rContent, " ")
newRData = append(newRData, parts[3])
parts := strings.Split(rContent, " ")
priority, _ := strconv.Atoi(parts[0])
weight, _ := strconv.Atoi(parts[1])
port, _ := strconv.Atoi(parts[2])
priorityMap[priority] = struct{}{}
weightMap[weight] = struct{}{}
portMap[port] = struct{}{}
}
// all values are the same, so process in the old way
if len(priorityMap) == 1 && len(weightMap) == 1 && len(portMap) == 1 {
// pull out some fields
parts := strings.Split(rData[0], " ")
fieldMap["priority"], _ = strconv.Atoi(parts[0])
fieldMap["weight"], _ = strconv.Atoi(parts[1])
fieldMap["port"], _ = strconv.Atoi(parts[2])
// populate target
for _, rContent := range rData {
parts = strings.Split(rContent, " ")
newRData = append(newRData, parts[3])
}
} else {
delete(fieldMap, "priority")
delete(fieldMap, "weight")
delete(fieldMap, "port")
// populate target
for _, rContent := range rData {
newRData = append(newRData, rContent)
}
}
fieldMap["target"] = newRData
}
Expand Down
23 changes: 22 additions & 1 deletion pkg/dns/record_lookup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -318,17 +318,20 @@ func TestDNS_ParseRData(t *testing.T) {
client := Client(session.Must(session.New()))

tests := map[string]struct {
rType string
rdata []string
expect map[string]interface{}
}{
"AFSDB": {
rType: "AFSDB",
rdata: []string{"1 bar.com"},
expect: map[string]interface{}{
"subtype": 1,
"target": []string{"bar.com"},
},
},
"SVCB": {
rType: "SVCB",
rdata: []string{"0 svc4.example.com."},
expect: map[string]interface{}{
"target": []string{},
Expand All @@ -337,6 +340,7 @@ func TestDNS_ParseRData(t *testing.T) {
},
},
"HTTPS": {
rType: "HTTPS",
rdata: []string{"3 https.example.com. alpn=bar port=8080"},
expect: map[string]interface{}{
"target": []string{},
Expand All @@ -345,11 +349,28 @@ func TestDNS_ParseRData(t *testing.T) {
"svc_params": "alpn=bar port=8080",
},
},
"SRV with default values": {
rType: "SRV",
rdata: []string{"10 60 5060 big.example.com.", "10 60 5060 small.example.com."},
expect: map[string]interface{}{
"port": 5060,
"priority": 10,
"weight": 60,
"target": []string{"big.example.com.", "small.example.com."},
},
},
"SRV without default values": {
rType: "SRV",
rdata: []string{"10 60 5060 big.example.com.", "20 50 5060 small.example.com."},
expect: map[string]interface{}{
"target": []string{"10 60 5060 big.example.com.", "20 50 5060 small.example.com."},
},
},
}

for name, test := range tests {
t.Run(name, func(t *testing.T) {
out := client.ParseRData(context.Background(), name, test.rdata)
out := client.ParseRData(context.Background(), test.rType, test.rdata)

assert.Equal(t, test.expect, out)
})
Expand Down
109 changes: 109 additions & 0 deletions pkg/imaging/policy.gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,34 @@ type (
// ShearTransformation ...
ShearTransformation string

// SmartCrop Crops around whatever is most important in the image, to a region around a specified area of interest relative to the specified `width` and `height` values. The crop detects any faces present, otherwise features.
SmartCrop struct {
// Debug When enabled, the SmartCrop transformation doesn't actually execute. Instead, it outlines found faces or features, the region of interest, and the crop area.
Debug *BooleanVariableInline `json:"debug,omitempty"`
// Height The height in pixels of the output image relative to the specified `style` value.
Height *IntegerVariableInline `json:"height,omitempty"`
// Sloppy Whether to sacrifice any image fidelity for transformation performance.
Sloppy *BooleanVariableInline `json:"sloppy,omitempty"`
// Style Specifies how to crop or scale a crop area for the specified area of interest in the source image, `fill` by default. The output image resizes to the specified `width` and `height` values. A value of `crop` places raw crop around the point of interest. A value of `fill` scales the crop area to include as much of the image and point of interest as possible, relative to the specified `width` and `height` values. A value of `zoom` scales the crop area as small as possible to fit the point of interest, relative to the specified `width` and `height` values.
Style *SmartCropStyleVariableInline `json:"style,omitempty"`
// Transformation Identifies this type of transformation, `SmartCrop` in this case.
Transformation SmartCropTransformation `json:"transformation"`
// Width The width in pixels of the output image relative to the specified `style` value.
Width *IntegerVariableInline `json:"width,omitempty"`
}

// SmartCropStyle ...
SmartCropStyle string

// SmartCropStyleVariableInline represents a type which stores either a value or a variable name
SmartCropStyleVariableInline struct {
Name *string
Value *SmartCropStyle
}

// SmartCropTransformation ...
SmartCropTransformation string

// StringVariableInline represents a type which stores either a value or a variable name
StringVariableInline struct {
Name *string
Expand Down Expand Up @@ -1495,6 +1523,16 @@ const (
// ShearTransformationShear const
ShearTransformationShear ShearTransformation = "Shear"

// SmartCropStyleCrop const
SmartCropStyleCrop SmartCropStyle = "crop"
// SmartCropStyleFill const
SmartCropStyleFill SmartCropStyle = "fill"
// SmartCropStyleZoom const
SmartCropStyleZoom SmartCropStyle = "zoom"

// SmartCropTransformationSmartCrop const
SmartCropTransformationSmartCrop SmartCropTransformation = "SmartCrop"

// TextImageTypePostTypeText const
TextImageTypePostTypeText TextImageTypePostType = "Text"

Expand Down Expand Up @@ -1724,6 +1762,10 @@ func (Shear) transformationType() string {
return "Shear"
}

func (SmartCrop) transformationType() string {
return "SmartCrop"
}

func (TextImageType) imageType() string {
return "TextImageType"
}
Expand Down Expand Up @@ -2123,6 +2165,16 @@ func ShearTransformationPtr(v ShearTransformation) *ShearTransformation {
return &v
}

// SmartCropStylePtr returns pointer of SmartCropStyle
func SmartCropStylePtr(v SmartCropStyle) *SmartCropStyle {
return &v
}

// SmartCropTransformationPtr returns pointer of SmartCropTransformation
func SmartCropTransformationPtr(v SmartCropTransformation) *SmartCropTransformation {
return &v
}

// TextImageTypePostTypePtr returns pointer of TextImageTypePostType
func TextImageTypePostTypePtr(v TextImageTypePostType) *TextImageTypePostType {
return &v
Expand Down Expand Up @@ -3166,6 +3218,31 @@ func (s Shear) Validate() error {
}.Filter()
}

// Validate validates SmartCrop
func (s SmartCrop) Validate() error {
return validation.Errors{
"Debug": validation.Validate(s.Debug),
"Height": validation.Validate(s.Height),
"Sloppy": validation.Validate(s.Sloppy),
"Style": validation.Validate(s.Style),
"Transformation": validation.Validate(s.Transformation,
validation.Required,
validation.In(SmartCropTransformationSmartCrop),
),
"Width": validation.Validate(s.Width),
}.Filter()
}

// Validate validates SmartCropStyleVariableInline
func (s SmartCropStyleVariableInline) Validate() error {
return validation.Errors{
"Name": validation.Validate(s.Name),
"Value": validation.Validate(s.Value,
validation.In(SmartCropStyleCrop, SmartCropStyleFill, SmartCropStyleZoom),
),
}.Filter()
}

// Validate validates StringVariableInline
func (s StringVariableInline) Validate() error {
return validation.Errors{
Expand Down Expand Up @@ -3432,6 +3509,8 @@ var (
ErrUnmarshalVariableResizeAspectVariableInline = errors.New("unmarshalling ResizeAspectVariableInline")
// ErrUnmarshalVariableResizeTypeVariableInline represents an error while unmarshalling ResizeTypeVariableInline
ErrUnmarshalVariableResizeTypeVariableInline = errors.New("unmarshalling ResizeTypeVariableInline")
// ErrUnmarshalVariableSmartCropStyleVariableInline represents an error while unmarshalling SmartCropStyleVariableInline
ErrUnmarshalVariableSmartCropStyleVariableInline = errors.New("unmarshalling SmartCropStyleVariableInline")
// ErrUnmarshalVariableStringVariableInline represents an error while unmarshalling StringVariableInline
ErrUnmarshalVariableStringVariableInline = errors.New("unmarshalling StringVariableInline")
// ErrUnmarshalVariableOutputVideoPerceptualQualityVariableInline represents an error while unmarshalling OutputVideoPerceptualQualityVariableInline
Expand Down Expand Up @@ -4068,6 +4147,35 @@ func (r *ResizeTypeVariableInline) MarshalJSON() ([]byte, error) {
return nil, nil
}

// UnmarshalJSON is a custom unmarshaler used to decode a variable which can be either a value or a variable object
func (s *SmartCropStyleVariableInline) UnmarshalJSON(in []byte) error {
var err error
var variable InlineVariable
if err = json.Unmarshal(in, &variable); err == nil {
s.Name = &variable.Var
s.Value = nil
return nil
}
var value SmartCropStyle
if err = json.Unmarshal(in, &value); err == nil {
s.Name = nil
s.Value = &value
return nil
}
return fmt.Errorf("%w: %s", ErrUnmarshalVariableSmartCropStyleVariableInline, err)
}

// MarshalJSON is a custom marshaler used to encode a variable which can be either a value or a variable object
func (s *SmartCropStyleVariableInline) MarshalJSON() ([]byte, error) {
if s.Value != nil {
return json.Marshal(*s.Value)
}
if s.Name != nil {
return json.Marshal(VariableInline{Var: *s.Name})
}
return nil, nil
}

// UnmarshalJSON is a custom unmarshaler used to decode a variable which can be either a value or a variable object
func (s *StringVariableInline) UnmarshalJSON(in []byte) error {
var err error
Expand Down Expand Up @@ -4466,6 +4574,7 @@ var TransformationHandlers = map[string]func() TransformationType{
"Rotate": func() TransformationType { return &Rotate{} },
"Scale": func() TransformationType { return &Scale{} },
"Shear": func() TransformationType { return &Shear{} },
"SmartCrop": func() TransformationType { return &SmartCrop{} },
"Trim": func() TransformationType { return &Trim{} },
"UnsharpMask": func() TransformationType { return &UnsharpMask{} },
}
Expand Down
Loading