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

Add support for RebootMethod_HALT for Reboot API #286

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
3 changes: 3 additions & 0 deletions common_utils/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ const (
DBUS_STOP_SERVICE
DBUS_RESTART_SERVICE
DBUS_FILE_STAT
DBUS_HALT_SYSTEM
COUNTER_SIZE
)

Expand Down Expand Up @@ -91,6 +92,8 @@ func (c CounterType) String() string {
return "DBUS restart service"
case DBUS_FILE_STAT:
return "DBUS file stat"
case DBUS_HALT_SYSTEM:
return "DBUS halt system"
default:
return ""
}
Expand Down
48 changes: 37 additions & 11 deletions gnmi_server/gnoi.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,20 @@ func (srv *SystemServer) KillProcess(ctx context.Context, req *gnoi_system_pb.Ki
return &resp, nil
}

func HaltSystem() error {
sc,err := ssc.NewDbusClient()
if err != nil {
return err
}

log.V(2).Infof("Halting the system..")
err = sc.HaltSystem()
if err != nil {
log.V(2).Infof("Failed to Halt the system %v", err);
}
return err
}

func RebootSystem(fileName string) error {
log.V(2).Infof("Rebooting with %s...", fileName)
sc, err := ssc.NewDbusClient()
Expand All @@ -158,18 +172,30 @@ func (srv *SystemServer) Reboot(ctx context.Context, req *gnoi_system_pb.RebootR
}
log.V(1).Info("gNOI: Reboot")
log.V(1).Info("Request:", req)
log.V(1).Info("Reboot system now, delay is ignored...")
// TODO: Support GNOI reboot delay
// Delay in nanoseconds before issuing reboot.
// https://github.com/openconfig/gnoi/blob/master/system/system.proto#L102-L115
config_db_json, err := io.ReadFile(fileName)
if errors.Is(err, os.ErrNotExist) {
fileName = ""
}
err = RebootSystem(string(config_db_json))
if err != nil {
return nil, err

// Check the reboot type
switch req.GetMethod() {
case gnoi_system_pb.RebootMethod_HALT:
log.V(1).Info("Reboot method is HALT. Halting the system...")
err = HaltSystem()
if err != nil {
return nil, err
}
default:
log.V(1).Info("Reboot system now, delay is ignored...")
// TODO: Support GNOI reboot delay
// Delay in nanoseconds before issuing reboot.
// https://github.com/openconfig/gnoi/blob/master/system/system.proto#L102-L115
config_db_json, err := io.ReadFile(fileName)
if errors.Is(err, os.ErrNotExist) {
fileName = ""
}
err = RebootSystem(string(config_db_json))
if err != nil {
return nil, err
}
}

var resp gnoi_system_pb.RebootResponse
return &resp, nil
}
Expand Down
21 changes: 20 additions & 1 deletion sonic_service_client/dbus_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type Service interface {
StopService(service string) error
RestartService(service string) error
GetFileStat(path string) (map[string]string, error)
HaltSystem() error
}

type DbusClient struct {
Expand Down Expand Up @@ -190,4 +191,22 @@ func (c *DbusClient) GetFileStat(path string) (map[string]string, error) {
}
data, _ := result.(map[string]string)
return data, nil
}
}

func (c *DbusClient) HaltSystem() error {
// Increment the counter for the DBUS_HALT_SYSTEM event
common_utils.IncCounter(common_utils.DBUS_HALT_SYSTEM)

// Set the module name and update the D-Bus properties
modName := "systemd"
busName := c.busNamePrefix + modName
busPath := c.busPathPrefix + modName
intName := c.intNamePrefix + modName + ".execute_reboot"

//Set the method to HALT(3) the system
const RebootMethod_HALT = 3

// Invoke the D-Bus API to execute the halt command
_, err := DbusApi(busName, busPath, intName, 10, RebootMethod_HALT)
return err
}
13 changes: 12 additions & 1 deletion test/test_gnoi.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,17 @@ def test_gnoi_reboot(self):
assert ret == 0, 'Fail to read counter'
assert new_cnt == old_cnt+1, 'DBUS API is not invoked'

def test_gnoi_reboot_halt(self):
ret, old_cnt = gnmi_dump('DBUS halt system')
assert ret == 0, 'Fail to read counter'

ret, msg = gnoi_reboot(3, 0, 'Test halt system')
assert ret == 0, msg

ret, new_cnt = gnmi_dump('DBUS halt system')
assert ret == 0, 'Fail to read counter'
assert new_cnt == old_cnt+1, 'DBUS API is not invoked'

def test_gnoi_rebootstatus(self):
ret, msg = gnoi_rebootstatus()
assert ret != 0, 'RebootStatus should fail' + msg
Expand Down Expand Up @@ -74,4 +85,4 @@ def test_gnoi_restartprocess_invalid(self):

ret, new_cnt = gnmi_dump('DBUS restart service')
assert ret == 0, 'Fail to read counter'
assert new_cnt == old_cnt, 'DBUS API invoked unexpectedly'
assert new_cnt == old_cnt, 'DBUS API invoked unexpectedly'
Loading