// Copyright 2021 Google LLC
//
// 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 policyenforcer

import "policy_manager/policymanagerproto"

// PolicyEnforcer is the generic interface for applying COS device policy
// and status check.
type PolicyEnforcer interface {
	// UpdateHealthMonitorState reads device policy file and applies health monitor
	// related change to the instance.
	UpdateHealthMonitorState() error

	// GetHealthMonitorStatus returns the status of health monitor logging and
	// monitoring.
	GetHealthMonitorStatus() (status *policymanagerproto.HealthMonitorStatus, err error)
}
