mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-24 14:00:19 +00:00
134 lines
3.5 KiB
Go
134 lines
3.5 KiB
Go
/*
|
|
Copyright 2015 The Kubernetes 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 dbus
|
|
|
|
import (
|
|
godbus "github.com/godbus/dbus"
|
|
)
|
|
|
|
// Interface is an interface that presents a subset of the godbus/dbus API. Use this
|
|
// when you want to inject fakeable/mockable D-Bus behavior.
|
|
type Interface interface {
|
|
// SystemBus returns a connection to the system bus, connecting to it
|
|
// first if necessary
|
|
SystemBus() (Connection, error)
|
|
// SessionBus returns a connection to the session bus, connecting to it
|
|
// first if necessary
|
|
SessionBus() (Connection, error)
|
|
}
|
|
|
|
// Connection represents a D-Bus connection
|
|
type Connection interface {
|
|
// Returns an Object representing the bus itself
|
|
BusObject() Object
|
|
|
|
// Object creates a representation of a remote D-Bus object
|
|
Object(name, path string) Object
|
|
|
|
// Signal registers or unregisters a channel to receive D-Bus signals
|
|
Signal(ch chan<- *godbus.Signal)
|
|
}
|
|
|
|
// Object represents a remote D-Bus object
|
|
type Object interface {
|
|
// Call synchronously calls a D-Bus method
|
|
Call(method string, flags godbus.Flags, args ...interface{}) Call
|
|
}
|
|
|
|
// Call represents a pending or completed D-Bus method call
|
|
type Call interface {
|
|
// Store returns a completed call's return values, or an error
|
|
Store(retvalues ...interface{}) error
|
|
}
|
|
|
|
// Implements Interface in terms of actually talking to D-Bus
|
|
type dbusImpl struct {
|
|
systemBus *connImpl
|
|
sessionBus *connImpl
|
|
}
|
|
|
|
// Implements Connection as a godbus.Conn
|
|
type connImpl struct {
|
|
conn *godbus.Conn
|
|
}
|
|
|
|
// Implements Object as a godbus.Object
|
|
type objectImpl struct {
|
|
object godbus.BusObject
|
|
}
|
|
|
|
// Implements Call as a godbus.Call
|
|
type callImpl struct {
|
|
call *godbus.Call
|
|
}
|
|
|
|
// New returns a new Interface which will use godbus to talk to D-Bus
|
|
func New() Interface {
|
|
return &dbusImpl{}
|
|
}
|
|
|
|
// SystemBus is part of Interface
|
|
func (db *dbusImpl) SystemBus() (Connection, error) {
|
|
if db.systemBus == nil {
|
|
bus, err := godbus.SystemBus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.systemBus = &connImpl{bus}
|
|
}
|
|
|
|
return db.systemBus, nil
|
|
}
|
|
|
|
// SessionBus is part of Interface
|
|
func (db *dbusImpl) SessionBus() (Connection, error) {
|
|
if db.sessionBus == nil {
|
|
bus, err := godbus.SessionBus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.sessionBus = &connImpl{bus}
|
|
}
|
|
|
|
return db.sessionBus, nil
|
|
}
|
|
|
|
// BusObject is part of the Connection interface
|
|
func (conn *connImpl) BusObject() Object {
|
|
return &objectImpl{conn.conn.BusObject()}
|
|
}
|
|
|
|
// Object is part of the Connection interface
|
|
func (conn *connImpl) Object(name, path string) Object {
|
|
return &objectImpl{conn.conn.Object(name, godbus.ObjectPath(path))}
|
|
}
|
|
|
|
// Signal is part of the Connection interface
|
|
func (conn *connImpl) Signal(ch chan<- *godbus.Signal) {
|
|
conn.conn.Signal(ch)
|
|
}
|
|
|
|
// Call is part of the Object interface
|
|
func (obj *objectImpl) Call(method string, flags godbus.Flags, args ...interface{}) Call {
|
|
return &callImpl{obj.object.Call(method, flags, args...)}
|
|
}
|
|
|
|
// Store is part of the Call interface
|
|
func (call *callImpl) Store(retvalues ...interface{}) error {
|
|
return call.call.Store(retvalues...)
|
|
}
|