Skip to content

Commit

Permalink
Add support for RebootMethod_HALT for Reboot API
Browse files Browse the repository at this point in the history
  • Loading branch information
vvolam committed Sep 20, 2024
1 parent 95f4400 commit 333b570
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 13 deletions.
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'

0 comments on commit 333b570

Please sign in to comment.