mirror of https://github.com/docker/docs.git
Merge pull request #5981 from philips/bump-go-systemd
vendor: bump github.com/coreos/go-systemd to v2
This commit is contained in:
commit
cedd76cb52
|
@ -60,4 +60,4 @@ mkdir -p src/code.google.com/p/go/src/pkg/archive
|
||||||
mv tmp-tar src/code.google.com/p/go/src/pkg/archive/tar
|
mv tmp-tar src/code.google.com/p/go/src/pkg/archive/tar
|
||||||
|
|
||||||
clone git github.com/godbus/dbus v1
|
clone git github.com/godbus/dbus v1
|
||||||
clone git github.com/coreos/go-systemd v1
|
clone git github.com/coreos/go-systemd v2
|
||||||
|
|
|
@ -204,7 +204,7 @@ func (c *Conn) GetUnitTypeProperties(unit string, unitType string) (map[string]i
|
||||||
// to modify. properties are the settings to set, encoded as an array of property
|
// to modify. properties are the settings to set, encoded as an array of property
|
||||||
// name and value pairs.
|
// name and value pairs.
|
||||||
func (c *Conn) SetUnitProperties(name string, runtime bool, properties ...Property) error {
|
func (c *Conn) SetUnitProperties(name string, runtime bool, properties ...Property) error {
|
||||||
return c.sysobj.Call("SetUnitProperties", 0, name, runtime, properties).Store()
|
return c.sysobj.Call("org.freedesktop.systemd1.Manager.SetUnitProperties", 0, name, runtime, properties).Store()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Conn) GetUnitTypeProperty(unit string, unitType string, propertyName string) (*Property, error) {
|
func (c *Conn) GetUnitTypeProperty(unit string, unitType string, propertyName string) (*Property, error) {
|
||||||
|
@ -253,6 +253,48 @@ type UnitStatus struct {
|
||||||
JobPath dbus.ObjectPath // The job object path
|
JobPath dbus.ObjectPath // The job object path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LinkUnitFileChange EnableUnitFileChange
|
||||||
|
|
||||||
|
// LinkUnitFiles() links unit files (that are located outside of the
|
||||||
|
// usual unit search paths) into the unit search path.
|
||||||
|
//
|
||||||
|
// It takes a list of absolute paths to unit files to link and two
|
||||||
|
// booleans. The first boolean controls whether the unit shall be
|
||||||
|
// enabled for runtime only (true, /run), or persistently (false,
|
||||||
|
// /etc).
|
||||||
|
// The second controls whether symlinks pointing to other units shall
|
||||||
|
// be replaced if necessary.
|
||||||
|
//
|
||||||
|
// This call returns a list of the changes made. The list consists of
|
||||||
|
// structures with three strings: the type of the change (one of symlink
|
||||||
|
// or unlink), the file name of the symlink and the destination of the
|
||||||
|
// symlink.
|
||||||
|
func (c *Conn) LinkUnitFiles(files []string, runtime bool, force bool) ([]LinkUnitFileChange, error) {
|
||||||
|
result := make([][]interface{}, 0)
|
||||||
|
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.LinkUnitFiles", 0, files, runtime, force).Store(&result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resultInterface := make([]interface{}, len(result))
|
||||||
|
for i := range result {
|
||||||
|
resultInterface[i] = result[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
changes := make([]LinkUnitFileChange, len(result))
|
||||||
|
changesInterface := make([]interface{}, len(changes))
|
||||||
|
for i := range changes {
|
||||||
|
changesInterface[i] = &changes[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dbus.Store(resultInterface, changesInterface...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return changes, nil
|
||||||
|
}
|
||||||
|
|
||||||
// EnableUnitFiles() may be used to enable one or more units in the system (by
|
// EnableUnitFiles() may be used to enable one or more units in the system (by
|
||||||
// creating symlinks to them in /etc or /run).
|
// creating symlinks to them in /etc or /run).
|
||||||
//
|
//
|
||||||
|
@ -317,7 +359,7 @@ type EnableUnitFileChange struct {
|
||||||
// symlink.
|
// symlink.
|
||||||
func (c *Conn) DisableUnitFiles(files []string, runtime bool) ([]DisableUnitFileChange, error) {
|
func (c *Conn) DisableUnitFiles(files []string, runtime bool) ([]DisableUnitFileChange, error) {
|
||||||
result := make([][]interface{}, 0)
|
result := make([][]interface{}, 0)
|
||||||
err := c.sysobj.Call("DisableUnitFiles", 0, files, runtime).Store(&result)
|
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.DisableUnitFiles", 0, files, runtime).Store(&result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,36 +36,38 @@ func setupConn(t *testing.T) *Conn {
|
||||||
return conn
|
return conn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findFixture(target string, t *testing.T) string {
|
||||||
|
abs, err := filepath.Abs("../fixtures/" + target)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return abs
|
||||||
|
}
|
||||||
|
|
||||||
func setupUnit(target string, conn *Conn, t *testing.T) {
|
func setupUnit(target string, conn *Conn, t *testing.T) {
|
||||||
// Blindly stop the unit in case it is running
|
// Blindly stop the unit in case it is running
|
||||||
conn.StopUnit(target, "replace")
|
conn.StopUnit(target, "replace")
|
||||||
|
|
||||||
// Blindly remove the symlink in case it exists
|
// Blindly remove the symlink in case it exists
|
||||||
targetRun := filepath.Join("/run/systemd/system/", target)
|
targetRun := filepath.Join("/run/systemd/system/", target)
|
||||||
err := os.Remove(targetRun)
|
os.Remove(targetRun)
|
||||||
|
}
|
||||||
// 1. Enable the unit
|
|
||||||
abs, err := filepath.Abs("../fixtures/" + target)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
func linkUnit(target string, conn *Conn, t *testing.T) {
|
||||||
|
abs := findFixture(target, t)
|
||||||
fixture := []string{abs}
|
fixture := []string{abs}
|
||||||
|
|
||||||
install, changes, err := conn.EnableUnitFiles(fixture, true, true)
|
changes, err := conn.LinkUnitFiles(fixture, true, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if install != false {
|
|
||||||
t.Fatal("Install was true")
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(changes) < 1 {
|
if len(changes) < 1 {
|
||||||
t.Fatalf("Expected one change, got %v", changes)
|
t.Fatalf("Expected one change, got %v", changes)
|
||||||
}
|
}
|
||||||
|
|
||||||
if changes[0].Filename != targetRun {
|
runPath := filepath.Join("/run/systemd/system/", target)
|
||||||
|
if changes[0].Filename != runPath {
|
||||||
t.Fatal("Unexpected target filename")
|
t.Fatal("Unexpected target filename")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +78,7 @@ func TestStartStopUnit(t *testing.T) {
|
||||||
conn := setupConn(t)
|
conn := setupConn(t)
|
||||||
|
|
||||||
setupUnit(target, conn, t)
|
setupUnit(target, conn, t)
|
||||||
|
linkUnit(target, conn, t)
|
||||||
|
|
||||||
// 2. Start the unit
|
// 2. Start the unit
|
||||||
job, err := conn.StartUnit(target, "replace")
|
job, err := conn.StartUnit(target, "replace")
|
||||||
|
@ -84,7 +87,7 @@ func TestStartStopUnit(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if job != "done" {
|
if job != "done" {
|
||||||
t.Fatal("Job is not done, %v", job)
|
t.Fatal("Job is not done:", job)
|
||||||
}
|
}
|
||||||
|
|
||||||
units, err := conn.ListUnits()
|
units, err := conn.ListUnits()
|
||||||
|
@ -130,28 +133,41 @@ func TestEnableDisableUnit(t *testing.T) {
|
||||||
conn := setupConn(t)
|
conn := setupConn(t)
|
||||||
|
|
||||||
setupUnit(target, conn, t)
|
setupUnit(target, conn, t)
|
||||||
|
abs := findFixture(target, t)
|
||||||
|
runPath := filepath.Join("/run/systemd/system/", target)
|
||||||
|
|
||||||
abs, err := filepath.Abs("../fixtures/" + target)
|
// 1. Enable the unit
|
||||||
|
install, changes, err := conn.EnableUnitFiles([]string{abs}, true, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
path := filepath.Join("/run/systemd/system/", target)
|
if install != false {
|
||||||
|
t.Fatal("Install was true")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(changes) < 1 {
|
||||||
|
t.Fatalf("Expected one change, got %v", changes)
|
||||||
|
}
|
||||||
|
|
||||||
|
if changes[0].Filename != runPath {
|
||||||
|
t.Fatal("Unexpected target filename")
|
||||||
|
}
|
||||||
|
|
||||||
// 2. Disable the unit
|
// 2. Disable the unit
|
||||||
changes, err := conn.DisableUnitFiles([]string{abs}, true)
|
dChanges, err := conn.DisableUnitFiles([]string{abs}, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(changes) != 1 {
|
if len(dChanges) != 1 {
|
||||||
t.Fatalf("Changes should include the path, %v", changes)
|
t.Fatalf("Changes should include the path, %v", dChanges)
|
||||||
}
|
}
|
||||||
if changes[0].Filename != path {
|
if dChanges[0].Filename != runPath {
|
||||||
t.Fatalf("Change should include correct filename, %+v", changes[0])
|
t.Fatalf("Change should include correct filename, %+v", dChanges[0])
|
||||||
}
|
}
|
||||||
if changes[0].Destination != "" {
|
if dChanges[0].Destination != "" {
|
||||||
t.Fatalf("Change destination should be empty, %+v", changes[0])
|
t.Fatalf("Change destination should be empty, %+v", dChanges[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +246,7 @@ func TestSetUnitProperties(t *testing.T) {
|
||||||
|
|
||||||
value := info["CPUShares"].(uint64)
|
value := info["CPUShares"].(uint64)
|
||||||
if value != 1023 {
|
if value != 1023 {
|
||||||
t.Fatal("CPUShares of unit is not 1023, %s", value)
|
t.Fatal("CPUShares of unit is not 1023:", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,7 +266,7 @@ func TestStartStopTransientUnit(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if job != "done" {
|
if job != "done" {
|
||||||
t.Fatal("Job is not done, %v", job)
|
t.Fatal("Job is not done:", job)
|
||||||
}
|
}
|
||||||
|
|
||||||
units, err := conn.ListUnits()
|
units, err := conn.ListUnits()
|
||||||
|
@ -295,6 +311,7 @@ func TestConnJobListener(t *testing.T) {
|
||||||
conn := setupConn(t)
|
conn := setupConn(t)
|
||||||
|
|
||||||
setupUnit(target, conn, t)
|
setupUnit(target, conn, t)
|
||||||
|
linkUnit(target, conn, t)
|
||||||
|
|
||||||
jobSize := len(conn.jobListener.jobs)
|
jobSize := len(conn.jobListener.jobs)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ func (c *Conn) Subscribe() error {
|
||||||
|
|
||||||
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
|
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Subscribe", 0).Store()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.sysconn.Close()
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +50,6 @@ func (c *Conn) Subscribe() error {
|
||||||
func (c *Conn) Unsubscribe() error {
|
func (c *Conn) Unsubscribe() error {
|
||||||
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
|
err := c.sysobj.Call("org.freedesktop.systemd1.Manager.Unsubscribe", 0).Store()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.sysconn.Close()
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +67,11 @@ func (c *Conn) initDispatch() {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
signal := <-ch
|
signal, ok := <-ch
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
switch signal.Name {
|
switch signal.Name {
|
||||||
case "org.freedesktop.systemd1.Manager.JobRemoved":
|
case "org.freedesktop.systemd1.Manager.JobRemoved":
|
||||||
c.jobComplete(signal)
|
c.jobComplete(signal)
|
||||||
|
|
|
@ -25,6 +25,7 @@ func TestSubscriptionSetUnit(t *testing.T) {
|
||||||
|
|
||||||
subSet.Add(target)
|
subSet.Add(target)
|
||||||
setupUnit(target, conn, t)
|
setupUnit(target, conn, t)
|
||||||
|
linkUnit(target, conn, t)
|
||||||
|
|
||||||
job, err := conn.StartUnit(target, "replace")
|
job, err := conn.StartUnit(target, "replace")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -47,7 +48,7 @@ func TestSubscriptionSetUnit(t *testing.T) {
|
||||||
tCh, ok := changes[target]
|
tCh, ok := changes[target]
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatal("Unexpected event %v", changes)
|
t.Fatal("Unexpected event:", changes)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tCh.ActiveState == "active" && tCh.Name == target {
|
if tCh.ActiveState == "active" && tCh.Name == target {
|
||||||
|
@ -63,5 +64,3 @@ func TestSubscriptionSetUnit(t *testing.T) {
|
||||||
success:
|
success:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ func TestSubscribeUnit(t *testing.T) {
|
||||||
evChan, errChan := conn.SubscribeUnits(time.Second)
|
evChan, errChan := conn.SubscribeUnits(time.Second)
|
||||||
|
|
||||||
setupUnit(target, conn, t)
|
setupUnit(target, conn, t)
|
||||||
|
linkUnit(target, conn, t)
|
||||||
|
|
||||||
job, err := conn.StartUnit(target, "replace")
|
job, err := conn.StartUnit(target, "replace")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -119,7 +119,7 @@ func appendVariable(w io.Writer, name, value string) {
|
||||||
fmt.Fprintln(w, value)
|
fmt.Fprintln(w, value)
|
||||||
} else {
|
} else {
|
||||||
/* just write the variable and value all on one line */
|
/* just write the variable and value all on one line */
|
||||||
fmt.Fprintln(w, "%s=%s", name, value)
|
fmt.Fprintf(w, "%s=%s\n", name, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
Copyright 2014 CoreOS Inc.
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Integration with the systemd logind API. See http://www.freedesktop.org/wiki/Software/systemd/logind/
|
||||||
|
package login1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/godbus/dbus"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
dbusInterface = "org.freedesktop.login1.Manager"
|
||||||
|
dbusPath = "/org/freedesktop/login1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Conn is a connection to systemds dbus endpoint.
|
||||||
|
type Conn struct {
|
||||||
|
conn *dbus.Conn
|
||||||
|
object *dbus.Object
|
||||||
|
}
|
||||||
|
|
||||||
|
// New() establishes a connection to the system bus and authenticates.
|
||||||
|
func New() (*Conn, error) {
|
||||||
|
c := new(Conn)
|
||||||
|
|
||||||
|
if err := c.initConnection(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Conn) initConnection() error {
|
||||||
|
var err error
|
||||||
|
c.conn, err = dbus.SystemBusPrivate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only use EXTERNAL method, and hardcode the uid (not username)
|
||||||
|
// to avoid a username lookup (which requires a dynamically linked
|
||||||
|
// libc)
|
||||||
|
methods := []dbus.Auth{dbus.AuthExternal(strconv.Itoa(os.Getuid()))}
|
||||||
|
|
||||||
|
err = c.conn.Auth(methods)
|
||||||
|
if err != nil {
|
||||||
|
c.conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = c.conn.Hello()
|
||||||
|
if err != nil {
|
||||||
|
c.conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.object = c.conn.Object("org.freedesktop.login1", dbus.ObjectPath(dbusPath))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reboot asks logind for a reboot optionally asking for auth.
|
||||||
|
func (c *Conn) Reboot(askForAuth bool) {
|
||||||
|
c.object.Call(dbusInterface+".Reboot", 0, askForAuth)
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
Copyright 2014 CoreOS Inc.
|
||||||
|
|
||||||
|
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 login1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestNew ensures that New() works without errors.
|
||||||
|
func TestNew(t *testing.T) {
|
||||||
|
_, err := New()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue