/*
Copyright 2022 The Kruise Authors.

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 canarystyle

import (
	"github.com/openkruise/rollouts/api/v1alpha1"
	batchcontext "github.com/openkruise/rollouts/pkg/controller/batchrelease/context"
	"github.com/openkruise/rollouts/pkg/util"
)

type Interface interface {
	CanaryInterface
	StableInterface
	// BuildStableController will get stable workload object and parse
	// stable workload info, and return a controller for stable workload.
	BuildStableController() (StableInterface, error)
	// BuildCanaryController will get canary workload object and parse
	// canary workload info, and return a controller for canary workload.
	BuildCanaryController(release *v1alpha1.BatchRelease) (CanaryInterface, error)
	// CalculateBatchContext calculate the current batch context according to
	// our release plan and the statues of stable workload and canary workload.
	CalculateBatchContext(release *v1alpha1.BatchRelease) *batchcontext.BatchContext
}

// CanaryInterface contains the methods about canary workload
type CanaryInterface interface {
	// GetCanaryInfo return the information about canary workload
	GetCanaryInfo() *util.WorkloadInfo
	// UpgradeBatch upgrade canary workload according to current batch context
	UpgradeBatch(*batchcontext.BatchContext) error
	// Create creates canary workload before rolling out
	Create(controller *v1alpha1.BatchRelease) error
	// Delete deletes canary workload after rolling out
	Delete(controller *v1alpha1.BatchRelease) error
}

// StableInterface contains the methods about stable workload
type StableInterface interface {
	// GetStableInfo return the information about stable workload
	GetStableInfo() *util.WorkloadInfo
	// Initialize claim the stable workload is under rollout control
	Initialize(controller *v1alpha1.BatchRelease) error
	// Finalize do something after rolling out, for example:
	// - free the stable workload from rollout control;
	// - resume stable workload and wait all pods updated if we need.
	Finalize(controller *v1alpha1.BatchRelease) error
}
