overlord/ifacestate,daemon: setup security on conect and disconnect #948

Merged
merged 15 commits into from Apr 14, 2016

Conversation

Projects
None yet
2 participants
Contributor

zyga commented Apr 14, 2016

This branch makes connect/disconnect setup security of both affected snaps.

zyga added some commits Apr 14, 2016

overlord/ifacestate: make MockSecurityBackendsForSnap public
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
daemon: disable real security backends for all tests
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: setup security in doConnect
This patch ensures calls to Connect setup the security of the affected
snaps (the plug side snap and the slot side snap).

Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: setup security in doDisconnect
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
daemon/api_test.go
@@ -108,10 +110,15 @@ func (s *apiSuite) SetUpTest(c *check.C) {
configs: map[string]string{},
}
s.d = nil
+ // Disable real security backends for all API tests
+ s.restoreBackends = ifacestate.MockSecurityBackendsForSnap(
@niemeyer

niemeyer Apr 14, 2016

Contributor

How about making that simply MockSecurityBackends(nil)? I don't think any call site is using per-snap backends, which means all of that boilerplate is just unnecessary trouble.

@zyga

zyga Apr 14, 2016

Contributor

Good idea, done.

overlord/ifacestate,daemon: simplify usage of MockSecurityBackendsFor…
…Snap

Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate/ifacemgr.go
+// MockSecurityBackendsForSnap mocks the list of security backends that are used for setting up security.
+//
+// This function is public because it is referenced in the daemon
+func MockSecurityBackendsForSnap(fn func(snapInfo *snap.Info) []interfaces.SecurityBackend) func() {
@niemeyer

niemeyer Apr 14, 2016

Contributor

I actually meant this:

func MockSecurityBackends(backends []interfaces.SecurityBackend)
@zyga

zyga Apr 14, 2016

Contributor

Ahh, sorry. Will do in a sec.

@zyga

zyga Apr 14, 2016

Contributor

Done

overlord/ifacestate/ifacemgr.go
+ task.Errorf("cannot get state of snap %q: %s", snapInfo.Name(), err)
+ return state.Retry
+ }
+ for _, backend := range securityBackendsForSnap(snapInfo) {
@niemeyer

niemeyer Apr 14, 2016

Contributor

Similarly,

for _, backend := range securityBackends { ... }
@zyga

zyga Apr 14, 2016

Contributor

Done

zyga added some commits Apr 14, 2016

overlord/ifacestate,daemon: simplify mocking of security backends
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: shorten securityBackendsForSnap to securityBackends
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate/ifacemgr.go
@@ -365,8 +365,25 @@ func (m *InterfaceManager) doConnect(task *state.Task, _ *tomb.Tomb) error {
}
plug := m.repo.Plug(plugRef.Snap, plugRef.Name)
+ slot := m.repo.Slot(slotRef.Snap, slotRef.Name)
+
+ for _, snapInfo := range []*snap.Info{plug.Snap, slot.Snap} {
@niemeyer

niemeyer Apr 14, 2016

Contributor

Can we please do this here instead:

err := setupSnapSecurity(task, plug.Snap, m.repo)
if err != nil {
        return err
}
err = setupSnapSecurity(task, slot.Snap, m.repo)
if err != nil {
        return err
}
@zyga

zyga Apr 14, 2016

Contributor

Done

overlord/ifacestate/ifacemgr.go
+ plug := m.repo.Plug(plugRef.Snap, plugRef.Name)
+ slot := m.repo.Slot(slotRef.Snap, slotRef.Name)
+
+ for _, snapInfo := range []*snap.Info{plug.Snap, slot.Snap} {
@niemeyer

niemeyer Apr 14, 2016

Contributor

Same as above.

@zyga

zyga Apr 14, 2016

Contributor

Done

overlord/ifacestate/ifacemgr.go
+//
+// This function is public because it is referenced in the daemon
+func MockSecurityBackends(backends []interfaces.SecurityBackend) func() {
+ securityBackends = func(snapInfo *snap.Info) []interfaces.SecurityBackend {
@niemeyer

niemeyer Apr 14, 2016

Contributor

This should be

oldBackends = securityBackends
securityBackends = backends
return func() { securityBackends = oldBackends }
@zyga

zyga Apr 14, 2016

Contributor

Done now

zyga added some commits Apr 14, 2016

overlord/ifacestate: make securityBackends a simple list
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
interfaces/overlord: create setupSecurity helper and use it
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: unroll two setup loops
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: rename setupSecurity to setupSnapSecurity
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: tweak arguments to setupSnapSecurity
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: log errors in setupSnapSecurity
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate: return state.Retry if setupSnapSecurity fails
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
overlord/ifacestate/ifacemgr.go
+ }
+ for _, backend := range securityBackends {
+ if err := backend.Setup(snapInfo, snapState.DevMode, repo); err != nil {
+ task.Errorf("cannot setup security of snap %q (backend %s): %s", snapName, backend.Name(), err)
@niemeyer

niemeyer Apr 14, 2016

Contributor

("cannot setup %s for snap %q: %s", backend.Name(), snapName, err)

@zyga

zyga Apr 14, 2016

Contributor

Done, thanks for the suggestion :-)

overlord/ifacestate: tweak error message
Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
Contributor

niemeyer commented Apr 14, 2016

Int tests infra is broken. Merging based on unit tests.

@niemeyer niemeyer merged commit 18fd1c0 into snapcore:master Apr 14, 2016

0 of 3 checks passed

Integration tests Triggered
Details
autopkgtest Triggered
Details
continuous-integration/travis-ci/pr The Travis CI build is in progress
Details

@zyga zyga deleted the zyga:overlord-connect-disconnect-setup-security branch Apr 14, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment