// Copyright 2015 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.

// +build go1.3

package lxdclient

import (
	"github.com/juju/errors"
	"github.com/lxc/lxd"
)

// Client is a high-level wrapper around the LXD API client.
type Client struct {
	raw       rawClientWrapper
	namespace string
	remote    string
}

// Connect opens an API connection to LXD and returns a high-level
// Client wrapper around that connection.
func Connect(cfg Config) (*Client, error) {
	if err := cfg.Apply(); err != nil {
		return nil, errors.Trace(err)
	}
	remote := cfg.Remote.ID()

	raw, err := newRawClient(remote)
	if err != nil {
		return nil, errors.Trace(err)
	}

	conn := &Client{
		raw:       raw,
		namespace: cfg.Namespace,
		remote:    remote,
	}
	return conn, nil
}

func newRawClient(remote string) (*lxd.Client, error) {
	logger.Debugf("loading LXD client config from %q", lxd.ConfigDir)

	cfg, err := lxd.LoadConfig()
	if err != nil {
		return nil, errors.Trace(err)
	}

	logger.Debugf("using LXD remote %q", remote)
	client, err := lxd.NewClient(cfg, remote)
	if err != nil {
		return nil, errors.Trace(err)
	}

	return client, nil
}

// Copyright 2015 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.

// +build go1.3

package lxdclient

import (
	"github.com/juju/errors"
	"github.com/lxc/lxd"
)

// Client is a high-level wrapper around the LXD API client.
type Client struct {
	raw       rawClientWrapper
	namespace string
}

// Connect opens an API connection to LXD and returns a high-level
// Client wrapper around that connection.
func Connect(cfg Config) (*Client, error) {
	if err := cfg.Apply(); err != nil {
		return nil, errors.Trace(err)
	}

	raw, err := newRawClient(cfg.Remote)
	if err != nil {
		return nil, errors.Trace(err)
	}

	conn := &Client{
		raw:       raw,
		namespace: cfg.Namespace,
	}
	return conn, nil
}

func newRawClient(remote Remote) (*lxd.Client, error) {
	cfg, err := lxd.LoadConfig()
	if err != nil {
		return nil, errors.Trace(err)
	}

	client, err := lxd.NewClient(cfg, remote.ID())
	if err != nil {
		return nil, errors.Trace(err)
	}

	return client, nil
}

--- 
+++ 
@@ -14,6 +14,7 @@
 type Client struct {
 	raw       rawClientWrapper
 	namespace string
+	remote    string
 }
 
 // Connect opens an API connection to LXD and returns a high-level
@@ -22,8 +23,9 @@
 	if err := cfg.Apply(); err != nil {
 		return nil, errors.Trace(err)
 	}
+	remote := cfg.Remote.ID()
 
-	raw, err := newRawClient(cfg.Remote)
+	raw, err := newRawClient(remote)
 	if err != nil {
 		return nil, errors.Trace(err)
 	}
@@ -31,17 +33,21 @@
 	conn := &Client{
 		raw:       raw,
 		namespace: cfg.Namespace,
+		remote:    remote,
 	}
 	return conn, nil
 }
 
-func newRawClient(remote Remote) (*lxd.Client, error) {
+func newRawClient(remote string) (*lxd.Client, error) {
+	logger.Debugf("loading LXD client config from %q", lxd.ConfigDir)
+
 	cfg, err := lxd.LoadConfig()
 	if err != nil {
 		return nil, errors.Trace(err)
 	}
 
-	client, err := lxd.NewClient(cfg, remote.ID())
+	logger.Debugf("using LXD remote %q", remote)
+	client, err := lxd.NewClient(cfg, remote)
 	if err != nil {
 		return nil, errors.Trace(err)
 	}
Add "remote" field to lxdclient.Config.
