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

feat: scheduled custom resource #40

Open
AmitKumarDas opened this issue Apr 17, 2020 · 1 comment
Open

feat: scheduled custom resource #40

AmitKumarDas opened this issue Apr 17, 2020 · 1 comment
Assignees

Comments

@AmitKumarDas
Copy link

litmuschaos/litmus#1223

@AmitKumarDas AmitKumarDas changed the title usecase: scheduled chaos feat: scheduled custom resource Apr 17, 2020
@AmitKumarDas
Copy link
Author

Draft Design

// ScheduleType is a typed definition to determine the type
// of a schedule
type ScheduleType string

const (
	// ScheduleTypeRepeat creates & deletes the resource
	// repeatedly based on schedule specifications
	ScheduleTypeRepeat ScheduleType = "Repeat"

	// ScheduleTypeHourly creates & deletes the resource
	// once every hour
	ScheduleTypeHourly ScheduleType = "Hourly"

	// ScheduleTypeDaily creates & deletes the resource
	// once everyday
	ScheduleTypeDaily ScheduleType = "Daily"

	// ScheduleTypeWeekly creates & deletes the resource
	// once every week
	ScheduleTypeWeekly ScheduleType = "Weekly"

	// ScheduleTypeOnce triggers creation & deletion of the
	// the target resource only once at a specific time in
	// the lifetime of this CronResource
	ScheduleTypeOnce ScheduleType = "Once"

	// ScheduleTypeImmediately triggers creation & deletion
	// of the the target resource immediately & then as
	// specified in the schedule specifications
	ScheduleTypeImmediately ScheduleType = "Immediately"

	// ScheduleTypeImmediatelyOnce triggers creation & deletion
	// of the the target resource immediately & only once in the
	// lifetime of this CronResource
	ScheduleTypeImmediatelyOnce ScheduleType = "ImmediatelyOnce"
)

// ScheduleDay is a typed definition to define supported
// days to schedule a resource
type ScheduleDay string

const (
	// ScheduleDayEveryday represents all days as supported
	// schedule days
	ScheduleDayEveryday ScheduleDay = "Everyday"

	// ScheduleDaySun represents Sunday as a supported schedule day
	ScheduleDaySun ScheduleDay = "Sun"

	// ScheduleDaySunday represents Sunday as a supported schedule day
	ScheduleDaySunday ScheduleDay = "Sunday"

	// ScheduleDayMon represents Monday as a supported schedule day
	ScheduleDayMon ScheduleDay = "Mon"

	// ScheduleDayMonday represents Monday as a supported schedule day
	ScheduleDayMonday ScheduleDay = "Monday"

	// ScheduleDayTue represents Tuesday as a supported schedule day
	ScheduleDayTue ScheduleDay = "Tue"

	// ScheduleDayTuesday represents Tuesday as a supported schedule day
	ScheduleDayTuesday ScheduleDay = "Tuesday"

	// ScheduleDayWed represents Wednesday as a supported schedule day
	ScheduleDayWed ScheduleDay = "Wed"

	// ScheduleDayWednesday represents Wednesday as a supported schedule day
	ScheduleDayWednesday ScheduleDay = "Wednesday"

	// ScheduleDayThu represents Thursday as a supported schedule day
	ScheduleDayThu ScheduleDay = "Thu"

	// ScheduleDayThursday represents Thursday as a supported schedule day
	ScheduleDayThursday ScheduleDay = "Thursday"

	// ScheduleDayFri represents Friday as a supported schedule day
	ScheduleDayFri ScheduleDay = "Fri"

	// ScheduleDayFriday represents Friday as a supported schedule day
	ScheduleDayFriday ScheduleDay = "Friday"

	// ScheduleDaySat represents Saturday as a supported schedule day
	ScheduleDaySat ScheduleDay = "Sat"

	// ScheduleDaySaturday represents Saturday as a supported schedule day
	ScheduleDaySaturday ScheduleDay = "Saturday"
)

// CronResource is a kubernetes custom resource that defines
// the specifications to create & delete any kubernetes resource
// at specified intervals
type CronResource struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata"`

	Spec CronResourceSpec `json:"spec"`
}

// CronResourceSpec defines the configuration required
// to create & delete a kubernetes resource at specified intervals
type CronResourceSpec struct {
	// Supend indicates if all operations of this cron
	// schedule should be stopped. The relevant resources
	// created due to CronResource should be deleted.
	Suspend *bool `json:"suspend,omitempty"`

	// CompletionCriteria can be specified to mark the
	// current schedule as completed or not
	CompletionCriteria CronResourceCompletionCriteria `json:"completionCriteria,omitempty"`

	// Schedule to be followed for this CronResource
	Schedule CronResourceSchedule `json:"schedule,omitempty"`

	// Template has the desired state of the resource that
	// needs to be created or deleted as part of CronResource
	// schedule
	Template CronResourceTemplateReference `json:"template,omitempty"`
}

// CronResourceSchedule provides the schedule details that the
// entire CronResource reconciliation is based on
type CronResourceSchedule struct {
	// ScheduleType provides the frequency of this schedule
	//
	// Defaults to Hourly schedule
	ScheduleType ScheduleType `json:"scheduleType,omitempty"`

	// Time to start the schedule. In other words, post this
	// time schedule get activated.
	//
	// StartTime is optional
	StartTime metav1.Time `json:"startTime,omitempty"`

	// Time to end the schedule. Post this time resources created
	// due to this CronResource will get deleted.
	//
	// EndTime is optional
	EndTime metav1.Time `json:"endTime,omitempty"`

	// RepeatInterval indicates the interval post which a new
	// schedule instance gets triggered. In other words post
	// this interval the existing resource created due to the
	// schedule gets deleted & a new resource takes its place.
	// The repeat interval is ignored if existing resource is
	// not completed.
	//
	// RepeatInterval is used for ScheduleType **Repeat**
	//
	// RepeatInterval is optional & defaults to 1 hour if
	// ScheduleType is Repeat
	RepeatInterval time.Duration `json:"repeatInterval,omitempty"`

	// RepeatCount provides the maximum number of times a schedule
	// instance gets triggered
	//
	// If MaxCount is 5 and ScheduleType is Daily then, this
	// CronResource is supposed to run only for the next 5 days
	// with each new schedule occuring after 24 hours.
	//
	// RepeatCount is optional
	MaxCount *int `json:"maxCount,omitempty"`

	// Replicas / InstanceCount ?
	// cc @karthik can you clarify ?
	Replicas *int `json:"replicas,omitempty"`

	// EligibleDays provides the list of days that are eligible
	// to run this schedule. If there are any resources left due
	// to an earlier schedule on a non-eligible day, then this
	// resource gets deleted. No new resource will get created
	// on a non-eligible day.
	//
	// EligibleDays provides an extra filter to evaluate if
	// CronResource should be run or not.
	//
	// EligibleDays is optional & marks every day as eligible to
	// run this schedule
	EligibleDays []ScheduleDay `json:"eligibleDays,omitempty"`
}

// CronResourceCompletionCriteria is used to mark a CronResource
// schedule as completed or not
type CronResourceCompletionCriteria struct {
	// Select terms applied over the resource to mark the
	// current schedule as complete
	Selector metac.ResourceSelector `json:"selector,omitempty"`

	// Timeout indicates the time taken after which the
	// current schedule can be marked as completed
	Timeout time.Duration `json:"timeout,omitempty"`
}

// CronResourceTemplateReference provides the reference to the
// resource state or object or both. This is the resource that
// gets created & deleted as part of CronResource reconciliation.
type CronResourceTemplateReference struct {
	// Desired state that gets created & deleted as part of
	// CronResource reconciliation. This state can be in partial
	// form which in turn gets applied against the specifications
	// found in ObjectReference to arrive at the full resource
	// specs.
	//
	// NOTE:
	// - State is optional
	// - Both State & ObjectReference can not be empty
	// - Both State & ObjectReference can be set in a CronResource
	State map[string]interface{} `json:"state,omitempty"`

	// Resource instance has the resource state that gets created
	// & deleted as part of CronResource reconciliation
	//
	// NOTE:
	// - ObjectReference is optional
	// - Both ObjectReference & State can not be empty
	// - Both ObjectReference & State can be set in a CronResource
	ObjectReference CronResourceTemplateObjectReference `json:"objectReference,omitempty"`
}

// CronResourceTemplateObjectReference refers to the resource
// observed in the cluster that will be created & deleted as
// part of CronResource reconciliation
type CronResourceTemplateObjectReference struct {
	Name      string `json:"objectName"`
	Namespace string `json:"objectNamespace"`
}

// CronResourceTemplate is the placeholder for desired or default
// state of resource that gets created & deleted as part of
// CronResource reconciliation. This is a custom resource that can
// be applied separately against the kubernetes cluster.
type CronResourceTemplate struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata"`

	Spec CronResourceTemplateSpec `json:"spec"`
}

// CronResourceTemplateSpec refers to the desired or default
// state of the resource that gets created & deleted as part
// of CronResource reconciliation
type CronResourceTemplateSpec struct {
	// State represents the desired state of the resource
	// that gets created & deleted as part of CronResource
	// reconciliation.
	State map[string]interface{} `json:"state,omitempty"`
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants