Skip to content

Commit

Permalink
Move AutoScaleSpec and RecommendedResources to types
Browse files Browse the repository at this point in the history
  • Loading branch information
wpjunior committed Mar 20, 2024
1 parent 676dd66 commit c7d44f9
Show file tree
Hide file tree
Showing 11 changed files with 134 additions and 122 deletions.
6 changes: 4 additions & 2 deletions api/scale.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"github.com/tsuru/tsuru/event"
"github.com/tsuru/tsuru/permission"
"github.com/tsuru/tsuru/provision"

provTypes "github.com/tsuru/tsuru/types/provision"
)

// title: units autoscale info
Expand Down Expand Up @@ -66,7 +68,7 @@ func addAutoScaleUnits(w http.ResponseWriter, r *http.Request, t auth.Token) (er
if !allowed {
return permission.ErrUnauthorized
}
var spec provision.AutoScaleSpec
var spec provTypes.AutoScaleSpec
err = ParseInput(r, &spec)
if err != nil {
return &errors.HTTP{
Expand All @@ -78,7 +80,7 @@ func addAutoScaleUnits(w http.ResponseWriter, r *http.Request, t auth.Token) (er
if err != nil {
return err
}
err = spec.Validate(quota.Limit, &a)
err = provision.ValidateAutoScaleSpec(&spec, quota.Limit, &a)
if err != nil {
return &errors.HTTP{
Code: http.StatusBadRequest,
Expand Down
9 changes: 5 additions & 4 deletions api/scale_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/tsuru/tsuru/provision"
"github.com/tsuru/tsuru/provision/provisiontest"
permTypes "github.com/tsuru/tsuru/types/permission"
provTypes "github.com/tsuru/tsuru/types/provision"
"github.com/tsuru/tsuru/types/quota"
check "gopkg.in/check.v1"
)
Expand All @@ -28,7 +29,7 @@ func (s *S) TestAutoScaleUnitsInfo(c *check.C) {
err := app.CreateApp(context.TODO(), &a, s.user)
c.Assert(err, check.IsNil)

autoscaleSpec := provision.AutoScaleSpec{
autoscaleSpec := provTypes.AutoScaleSpec{
Process: "p1",
AverageCPU: "300m",
MaxUnits: 10,
Expand All @@ -50,7 +51,7 @@ func (s *S) TestAutoScaleUnitsInfo(c *check.C) {
c.Assert(recorder.Code, check.Equals, http.StatusOK)
c.Assert(recorder.Header().Get("Content-Type"), check.Equals, "application/json")

var autoscales []provision.AutoScaleSpec
var autoscales []provTypes.AutoScaleSpec
err = json.Unmarshal(recorder.Body.Bytes(), &autoscales)
c.Assert(err, check.IsNil)
c.Assert(autoscales, check.HasLen, 1)
Expand Down Expand Up @@ -89,7 +90,7 @@ func (s *S) TestAddAutoScaleUnits(c *check.C) {
c.Assert(recorder.Code, check.Equals, http.StatusOK)
spec, err := a.AutoScaleInfo()
c.Assert(err, check.IsNil)
c.Assert(spec, check.DeepEquals, []provision.AutoScaleSpec{
c.Assert(spec, check.DeepEquals, []provTypes.AutoScaleSpec{
{Process: "p1", MinUnits: 2, MaxUnits: 10, AverageCPU: "600m"},
})
c.Assert(eventtest.EventDesc{
Expand All @@ -115,7 +116,7 @@ func (s *S) TestRemoveAutoScaleUnits(c *check.C) {
a := app.App{Name: "myapp", Platform: "zend", TeamOwner: s.team.Name}
err := app.CreateApp(context.TODO(), &a, s.user)
c.Assert(err, check.IsNil)
err = a.AutoScale(provision.AutoScaleSpec{
err = a.AutoScale(provTypes.AutoScaleSpec{
Process: "p1",
AverageCPU: "300m",
MaxUnits: 10,
Expand Down
6 changes: 3 additions & 3 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -2789,7 +2789,7 @@ buildResult:
return result
}

func (app *App) AutoScaleInfo() ([]provision.AutoScaleSpec, error) {
func (app *App) AutoScaleInfo() ([]provTypes.AutoScaleSpec, error) {
prov, err := app.getProvisioner()
if err != nil {
return nil, err
Expand All @@ -2801,7 +2801,7 @@ func (app *App) AutoScaleInfo() ([]provision.AutoScaleSpec, error) {
return autoscaleProv.GetAutoScale(app.ctx, app)
}

func (app *App) VerticalAutoScaleRecommendations() ([]provision.RecommendedResources, error) {
func (app *App) VerticalAutoScaleRecommendations() ([]provTypes.RecommendedResources, error) {
prov, err := app.getProvisioner()
if err != nil {
return nil, err
Expand All @@ -2825,7 +2825,7 @@ func (app *App) UnitsMetrics() ([]provTypes.UnitMetric, error) {
return metricsProv.UnitsMetrics(app.ctx, app)
}

func (app *App) AutoScale(spec provision.AutoScaleSpec) error {
func (app *App) AutoScale(spec provTypes.AutoScaleSpec) error {
prov, err := app.getProvisioner()
if err != nil {
return err
Expand Down
12 changes: 6 additions & 6 deletions app/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2653,7 +2653,7 @@ func (s *S) TestAppMarshalJSONWithAutoscaleProv(c *check.C) {
Routers: []appTypes.AppRouter{{Name: "fake", Opts: map[string]string{"opt1": "val1"}}},
Tags: []string{"tag a", "tag b"},
}
err = app.AutoScale(provision.AutoScaleSpec{Process: "p1"})
err = app.AutoScale(provTypes.AutoScaleSpec{Process: "p1"})
c.Assert(err, check.IsNil)
err = routertest.FakeRouter.AddBackend(context.TODO(), &app)
c.Assert(err, check.IsNil)
Expand Down Expand Up @@ -4220,7 +4220,7 @@ func (s *S) TestAppUnitsWithAutoscaler(c *check.C) {
err := CreateApp(context.TODO(), &a, s.user)
c.Assert(err, check.IsNil)

err = provisioner.SetAutoScale(context.TODO(), &a, provision.AutoScaleSpec{
err = provisioner.SetAutoScale(context.TODO(), &a, provTypes.AutoScaleSpec{
Process: "web",
Version: 1,
MinUnits: 1,
Expand Down Expand Up @@ -6202,21 +6202,21 @@ func (s *S) TestAutoscaleWithAutoscaleProvisioner(c *check.C) {
})
defer provision.Unregister("autoscaleProv")
a := App{Name: "my-test-app", TeamOwner: s.team.Name}
err := a.AutoScale(provision.AutoScaleSpec{Process: "p1"})
err := a.AutoScale(provTypes.AutoScaleSpec{Process: "p1"})
c.Assert(err, check.IsNil)
err = a.AutoScale(provision.AutoScaleSpec{Process: "p2"})
err = a.AutoScale(provTypes.AutoScaleSpec{Process: "p2"})
c.Assert(err, check.IsNil)
scales, err := a.AutoScaleInfo()
c.Assert(err, check.IsNil)
c.Assert(scales, check.DeepEquals, []provision.AutoScaleSpec{
c.Assert(scales, check.DeepEquals, []provTypes.AutoScaleSpec{
{Process: "p1"},
{Process: "p2"},
})
err = a.RemoveAutoScale("p1")
c.Assert(err, check.IsNil)
scales, err = a.AutoScaleInfo()
c.Assert(err, check.IsNil)
c.Assert(scales, check.DeepEquals, []provision.AutoScaleSpec{
c.Assert(scales, check.DeepEquals, []provTypes.AutoScaleSpec{
{Process: "p2"},
})
}
Expand Down
47 changes: 24 additions & 23 deletions provision/kubernetes/autoscale.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/pkg/errors"
tsuruErrors "github.com/tsuru/tsuru/errors"
"github.com/tsuru/tsuru/provision"
provTypes "github.com/tsuru/tsuru/types/provision"
appsv1 "k8s.io/api/apps/v1"
autoscalingv1 "k8s.io/api/autoscaling/v1"
autoscalingv2 "k8s.io/api/autoscaling/v2"
Expand All @@ -32,7 +33,7 @@ const (

var errNoDeploy = errors.New("no routable version found for app, at least one deploy is required before configuring autoscale")

func (p *kubernetesProvisioner) GetVerticalAutoScaleRecommendations(ctx context.Context, a provision.App) ([]provision.RecommendedResources, error) {
func (p *kubernetesProvisioner) GetVerticalAutoScaleRecommendations(ctx context.Context, a provision.App) ([]provTypes.RecommendedResources, error) {
client, err := clusterForPool(ctx, a.GetPool())
if err != nil {
return nil, err
Expand Down Expand Up @@ -74,16 +75,16 @@ func (p *kubernetesProvisioner) GetVerticalAutoScaleRecommendations(ctx context.
return nil, errors.WithStack(err)
}

var specs []provision.RecommendedResources
var specs []provTypes.RecommendedResources
for _, vpa := range vpas {
specs = append(specs, vpaToRecommended(*vpa))
}
return specs, nil
}

func vpaToRecommended(vpa vpav1.VerticalPodAutoscaler) provision.RecommendedResources {
func vpaToRecommended(vpa vpav1.VerticalPodAutoscaler) provTypes.RecommendedResources {
ls := labelSetFromMeta(&vpa.ObjectMeta)
rec := provision.RecommendedResources{
rec := provTypes.RecommendedResources{
Process: ls.AppProcess(),
}
if vpa.Status.Recommendation == nil {
Expand All @@ -93,22 +94,22 @@ func vpaToRecommended(vpa vpav1.VerticalPodAutoscaler) provision.RecommendedReso
if contRec.ContainerName != vpa.Name {
continue
}
rec.Recommendations = append(rec.Recommendations, provision.RecommendedProcessResources{
rec.Recommendations = append(rec.Recommendations, provTypes.RecommendedProcessResources{
Type: "target",
CPU: contRec.Target.Cpu().String(),
Memory: contRec.Target.Memory().String(),
})
rec.Recommendations = append(rec.Recommendations, provision.RecommendedProcessResources{
rec.Recommendations = append(rec.Recommendations, provTypes.RecommendedProcessResources{
Type: "uncappedTarget",
CPU: contRec.UncappedTarget.Cpu().String(),
Memory: contRec.UncappedTarget.Memory().String(),
})
rec.Recommendations = append(rec.Recommendations, provision.RecommendedProcessResources{
rec.Recommendations = append(rec.Recommendations, provTypes.RecommendedProcessResources{
Type: "lowerBound",
CPU: contRec.LowerBound.Cpu().String(),
Memory: contRec.LowerBound.Memory().String(),
})
rec.Recommendations = append(rec.Recommendations, provision.RecommendedProcessResources{
rec.Recommendations = append(rec.Recommendations, provTypes.RecommendedProcessResources{
Type: "upperBound",
CPU: contRec.UpperBound.Cpu().String(),
Memory: contRec.UpperBound.Memory().String(),
Expand All @@ -117,7 +118,7 @@ func vpaToRecommended(vpa vpav1.VerticalPodAutoscaler) provision.RecommendedReso
return rec
}

func (p *kubernetesProvisioner) GetAutoScale(ctx context.Context, a provision.App) ([]provision.AutoScaleSpec, error) {
func (p *kubernetesProvisioner) GetAutoScale(ctx context.Context, a provision.App) ([]provTypes.AutoScaleSpec, error) {
client, err := clusterForPool(ctx, a.GetPool())
if err != nil {
return nil, err
Expand Down Expand Up @@ -153,7 +154,7 @@ func (p *kubernetesProvisioner) GetAutoScale(ctx context.Context, a provision.Ap
return nil, err
}

var specs []provision.AutoScaleSpec
var specs []provTypes.AutoScaleSpec

hpas, err := hpaInformer.Lister().HorizontalPodAutoscalers(ns).List(labels.SelectorFromSet(labels.Set(ls.ToHPASelector())))
if err != nil {
Expand All @@ -179,9 +180,9 @@ func kedaScaledObjectName(hpa autoscalingv2.HorizontalPodAutoscaler) string {
return hpa.Labels["scaledobject.keda.sh/name"]
}

func scaledObjectToSpec(scaledObject kedav1alpha1.ScaledObject) provision.AutoScaleSpec {
func scaledObjectToSpec(scaledObject kedav1alpha1.ScaledObject) provTypes.AutoScaleSpec {
ls := labelSetFromMeta(&scaledObject.ObjectMeta)
spec := provision.AutoScaleSpec{
spec := provTypes.AutoScaleSpec{
MaxUnits: uint(*scaledObject.Spec.MaxReplicaCount),
MinUnits: uint(*scaledObject.Spec.MinReplicaCount),
Process: ls.AppProcess(),
Expand All @@ -192,7 +193,7 @@ func scaledObjectToSpec(scaledObject kedav1alpha1.ScaledObject) provision.AutoSc
if metric.Type == "cron" {
minReplicas, _ := strconv.Atoi(metric.Metadata["desiredReplicas"])

spec.Schedules = append(spec.Schedules, provision.AutoScaleSchedule{
spec.Schedules = append(spec.Schedules, provTypes.AutoScaleSchedule{
MinReplicas: minReplicas,
Start: metric.Metadata["start"],
End: metric.Metadata["end"],
Expand All @@ -213,9 +214,9 @@ func scaledObjectToSpec(scaledObject kedav1alpha1.ScaledObject) provision.AutoSc
return spec
}

func hpaToSpec(hpa autoscalingv2.HorizontalPodAutoscaler) provision.AutoScaleSpec {
func hpaToSpec(hpa autoscalingv2.HorizontalPodAutoscaler) provTypes.AutoScaleSpec {
ls := labelSetFromMeta(&hpa.ObjectMeta)
spec := provision.AutoScaleSpec{
spec := provTypes.AutoScaleSpec{
MaxUnits: uint(hpa.Spec.MaxReplicas),
Process: ls.AppProcess(),
Version: ls.AppVersion(),
Expand Down Expand Up @@ -316,15 +317,15 @@ func removeKEDAScaleObject(ctx context.Context, client *ClusterClient, ns string
return nil
}

func (p *kubernetesProvisioner) SetAutoScale(ctx context.Context, a provision.App, spec provision.AutoScaleSpec) error {
func (p *kubernetesProvisioner) SetAutoScale(ctx context.Context, a provision.App, spec provTypes.AutoScaleSpec) error {
client, err := clusterForPool(ctx, a.GetPool())
if err != nil {
return err
}
return setAutoScale(ctx, client, a, spec)
}

func setAutoScale(ctx context.Context, client *ClusterClient, a provision.App, spec provision.AutoScaleSpec) error {
func setAutoScale(ctx context.Context, client *ClusterClient, a provision.App, spec provTypes.AutoScaleSpec) error {
depInfo, err := minimumAutoScaleVersion(ctx, client, a, spec.Process)
if err != nil {
return err
Expand Down Expand Up @@ -356,7 +357,7 @@ func setAutoScale(ctx context.Context, client *ClusterClient, a provision.App, s

minUnits := int32(spec.MinUnits)

cpuValue, err := spec.ToCPUValue(a)
cpuValue, err := provision.CPUValueOfAutoScaleSpec(&spec, a)
if err != nil {
return errors.WithStack(err)
}
Expand Down Expand Up @@ -433,7 +434,7 @@ func setAutoScale(ctx context.Context, client *ClusterClient, a provision.App, s
return nil
}

func setKEDAAutoscale(ctx context.Context, client *ClusterClient, spec provision.AutoScaleSpec, a provision.App, depInfo *deploymentInfo, hpaName string, labels *provision.LabelSet) error {
func setKEDAAutoscale(ctx context.Context, client *ClusterClient, spec provTypes.AutoScaleSpec, a provision.App, depInfo *deploymentInfo, hpaName string, labels *provision.LabelSet) error {
kedaClient, err := KEDAClientForConfig(client.restConfig)
if err != nil {
return err
Expand Down Expand Up @@ -469,11 +470,11 @@ func setKEDAAutoscale(ctx context.Context, client *ClusterClient, spec provision
return err
}

func newKEDAScaledObject(ctx context.Context, spec provision.AutoScaleSpec, a provision.App, depInfo *deploymentInfo, ns string, hpaName string, labels *provision.LabelSet) (*kedav1alpha1.ScaledObject, error) {
func newKEDAScaledObject(ctx context.Context, spec provTypes.AutoScaleSpec, a provision.App, depInfo *deploymentInfo, ns string, hpaName string, labels *provision.LabelSet) (*kedav1alpha1.ScaledObject, error) {
kedaTriggers := []kedav1alpha1.ScaleTriggers{}

if spec.AverageCPU != "" {
cpu, err := spec.ToCPUValue(a)
cpu, err := provision.CPUValueOfAutoScaleSpec(&spec, a)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -743,7 +744,7 @@ func ensureHPA(ctx context.Context, client *ClusterClient, a provision.App, proc
return multiErr.ToError()
}

func getAutoScale(ctx context.Context, client *ClusterClient, a provision.App, process string) ([]provision.AutoScaleSpec, error) {
func getAutoScale(ctx context.Context, client *ClusterClient, a provision.App, process string) ([]provTypes.AutoScaleSpec, error) {
ns, err := client.AppNamespace(ctx, a)
if err != nil {
return nil, err
Expand All @@ -768,7 +769,7 @@ func getAutoScale(ctx context.Context, client *ClusterClient, a provision.App, p
return nil, errors.WithStack(err)
}

var specs []provision.AutoScaleSpec
var specs []provTypes.AutoScaleSpec
for _, hpa := range hpas.Items {
scaledObjectName := kedaScaledObjectName(hpa)
if scaledObjectName != "" {
Expand Down

0 comments on commit c7d44f9

Please sign in to comment.