xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: George Dunlap <george.dunlap@citrix.com>
To: <xen-devel@lists.xenproject.org>
Cc: Nick Rosbrook <rosbrookn@ainfosec.com>
Subject: Re: [Xen-devel] [PATCH v3 8/8] RFC: Sketch constructors, DomainCreateNew
Date: Fri, 17 Jan 2020 18:38:11 +0000	[thread overview]
Message-ID: <37c32141-ef33-f4ce-bf4a-7ab1d6cabb12@citrix.com> (raw)
In-Reply-To: <20200117155734.1067550-8-george.dunlap@citrix.com>

On 1/17/20 3:57 PM, George Dunlap wrote:
> This is a sketch of functionality suitable for creating a basic
> domain, with a disk and a vif.  DomainConfig, DeviceDisk, and
> DeviceNic types are all created using constructor functions, which
> initialize them with libxl's defaults.
> 
> DomainCreateNew takes the config and calls without any updates.
> 
> Obviously some of these will need to be changed it we switch to
> passing references to .toC() rather than passing back by value.
> 
> The main purpose of this is to allow testing of creating a hard-coded
> domain.
> 
> Creating a domain would look like this:
> 
> 	// type = "pv"
> 	dconf, err := xl.NewDomainConfig(xl.DomainTypePv)
> 	if err != nil {
> 		fmt.Printf("NewDomainConfig: %v\n", err)
> 		return
> 	}
> 	dconf.CInfo.Type = xl.DomainTypePv
> 	// name = "c6-01"
> 	dconf.CInfo.Name = "c6-01"
> 	// vcpus=4
> 	dconf.BInfo.MaxVcpus = 4
> 	// memory = "2048"
> 	dconf.BInfo.MaxMemkb = 2048 * 1024
> 	dconf.BInfo.TargetMemkb = 2048 * 1024
> 	// on_crash = 'destroy'
> 	dconf.OnCrash = xl.ActionOnShutdownDestroy
> 	// bootloader = "pygrub"
> 	dconf.BInfo.Bootloader = "pygrub"
> 	// disk = [ 'vdev=hda,format=raw,target=/images/c6-01.raw']
> 	{
> 		disk, err := xl.NewDeviceDisk()
> 		if err != nil {
> 			fmt.Printf("NewDeviceDisk: %v\n", err)
> 			return
> 		}
> 		disk.Vdev = "hda"
> 		//disk.DiskBackend = xl.DiskBackendPhy
> 		disk.Format = xl.DiskFormatRaw
> 		disk.Readwrite = 1
> 		disk.PdevPath = "/images/c6-01.raw"
> 		dconf.Disks = append(dconf.Disks, *disk)
> 	}
> 	// vif = [ 'mac=5a:5b:d6:f1:d6:b4' ]
> 	{
> 		vif, err := xl.NewDeviceNic()
> 		if err != nil {
> 			fmt.Printf("NewDeviceNic: %v\n", err)
> 			return
> 		}
> 		vif.Mac = xl.Mac{ 0x5a, 0x5b, 0xd6, 0x31, 0xd6, 0xb4 }
> 		dconf.Nics = append(dconf.Nics, *vif)
> 	}
> 	// serial='pty' # HVM only
> 
> 	did, err := ctx.DomainCreateNew(dconf)
> 
> 	if err != nil {
> 		fmt.Printf("Creating domain: %v\n", err)
> 		return
> 	}
> 
> 	fmt.Printf("Domain %s(%d) created successfully", dconf.CInfo.Name, did)
> 
> 
> Signed-off-by: George Dunlap <george.dunlap@citrix.com>
> ---
> CC: Nick Rosbrook <rosbrookn@ainfosec.com>
> ---
>  tools/golang/xenlight/xenlight.go | 66 +++++++++++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
> 
> diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
> index c462e4bb42..5a21a2b9b8 100644
> --- a/tools/golang/xenlight/xenlight.go
> +++ b/tools/golang/xenlight/xenlight.go
> @@ -1113,3 +1113,69 @@ func (Ctx *Context) PrimaryConsoleGetTty(domid uint32) (path string, err error)
>  	path = C.GoString(cpath)
>  	return
>  }
> +
> +func NewDomainConfig(t DomainType) (*DomainConfig, error) {
> +	var cconfig C.libxl_domain_config
> +
> +	C.libxl_domain_config_init(&cconfig)
> +	C.libxl_domain_build_info_init_type(&cconfig.b_info, C.libxl_domain_type(t))
> +
> +	gconfig := &DomainConfig{}
> +	err := gconfig.fromC(&cconfig)
> +	if err != nil {
> +		return nil, err
> +	}
> +
> +	return gconfig, nil
> +}
> +
> +func NewDeviceDisk() (*DeviceDisk, error) {
> +	var ctype C.libxl_device_disk
> +
> +	C.libxl_device_disk_init(&ctype)
> +
> +	gtype := &DeviceDisk{}
> +	err := gtype.fromC(&ctype)
> +
> +	if err != nil {
> +		return nil, err
> +	}
> +
> +	return gtype, nil
> +}
> +
> +func NewDeviceNic() (*DeviceNic, error) {
> +	var ctype C.libxl_device_nic
> +
> +	C.libxl_device_nic_init(&ctype)
> +
> +	gtype := &DeviceNic{}
> +	err := gtype.fromC(&ctype)
> +
> +	if err != nil {
> +		return nil, err
> +	}
> +
> +	return gtype, nil
> +}
> +
> +// int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
> +//                             uint32_t *domid,
> +//                             const libxl_asyncop_how *ao_how,
> +//                             const libxl_asyncprogress_how *aop_console_how)
> +func (Ctx *Context) DomainCreateNew(config *DomainConfig) (Domid, error) {
> +	var cdomid C.uint32_t
> +	var cconfig C.libxl_domain_config
> +	err := config.toC(&cconfig)
> +	if err != nil {
> +		return Domid(0), fmt.Errorf("converting domain config to C: %v", err)
> +	}
> +	defer C.libxl_domain_config_dispose(&cconfig)
> +
> +	ret := C.libxl_domain_create_new(Ctx.ctx, &cconfig, &cdomid, nil, nil)
> +	if ret != 0 {
> +		return Domid(0), Error(ret)
> +	}
> +
> +	return Domid(cdomid), nil
> +}

An alternate way to do this would be something like this:

---
func NewDomainConfig(t DomainType, populate func(*DomainConfig))
*DomainConfig {
	var ctype C.libxl_domain_config

	C.libxl_domain_config_init(&ctype)
	C.libxl_domain_build_info_init_type(&ctype.b_info, C.libxl_domain_type(t))

	gtype := &DomainConfig{}
	err := gtype.fromC(&ctype)
	if err != nil {
		panic("internal error: Can't convert empty DomainConfig")
	}

	if populate != nil {
		populate(gtype)
	}

	return gtype
}

func NewDeviceDisk(populate func(*DeviceDisk)) *DeviceDisk {
	var ctype C.libxl_device_disk

	C.libxl_device_disk_init(&ctype)

	gtype := &DeviceDisk{}
	err := gtype.fromC(&ctype)

	if err != nil {
		panic("internal error: Can't convert empty DeviceDisk")
	}

	if populate != nil {
		populate(gtype)
	}

	return gtype
}

func NewDeviceNic(populate func(*DeviceNic)) *DeviceNic {
	var ctype C.libxl_device_nic

	C.libxl_device_nic_init(&ctype)

	gtype := &DeviceNic{}
	err := gtype.fromC(&ctype)

	if err != nil {
		panic("internal error: Can't convert empty DeviceNic")
	}

	if populate != nil {
		populate(gtype)
	}

	return gtype
}
---

And then code to populate a domain config might look like this:

	dconf := xl.NewDomainConfig(xl.DomainTypePv, func(dconf *xl.DomainConfig) {
		dconf.CInfo.Type = xl.DomainTypePv
		// name = "c6-01"
		dconf.CInfo.Name = "c6-01"
		// vcpus=4
		dconf.BInfo.MaxVcpus = 4
		// memory = "2048"
		dconf.BInfo.MaxMemkb = 2048 * 1024
		dconf.BInfo.TargetMemkb = 2048 * 1024
		// on_crash = 'destroy'
		dconf.OnCrash = xl.ActionOnShutdownDestroy
		// bootloader = "pygrub"
		dconf.BInfo.Bootloader = "pygrub"
	})

	dconf.Disks = []xl.DeviceDisk{*xl.NewDeviceDisk(func(disk *xl.DeviceDisk) {
		disk.Vdev = "hda"
		//disk.DiskBackend = xl.DiskBackendPhy
		disk.Format = xl.DiskFormatRaw
		disk.Readwrite = 1
		disk.PdevPath = "/images/c6-01.raw"
		dconf.Disks = append(dconf.Disks, *disk)
	})}

	dconf.Nics = []xl.DeviceNic{*xl.NewDeviceNic(func(vif *xl.DeviceNic) {
		vif.Mac = xl.Mac{0x5a, 0x5b, 0xd6, 0x31, 0xd6, 0xb4}
	})}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2020-01-17 18:38 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-17 15:57 [Xen-devel] [PATCH v3 1/8] golang/xenlight: Don't try to marshall zero-length arrays in fromC George Dunlap
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 2/8] go/xenlight: Fix CpuidPoliclyList conversion George Dunlap
2020-01-20 23:30   ` Nick Rosbrook
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 3/8] go/xenlight: More informative error messages George Dunlap
2020-01-20 23:32   ` Nick Rosbrook
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 4/8] golang/xenlight: Errors are negative George Dunlap
2020-01-20 23:40   ` Nick Rosbrook
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 5/8] golang/xenlight: Default loglevel to DEBUG until we get everything working George Dunlap
2020-01-20 23:41   ` Nick Rosbrook
2020-01-21  9:55     ` George Dunlap
2020-01-24 19:51       ` Nick Rosbrook
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 6/8] golang/xenlight: Don't leak memory on context open failure George Dunlap
2020-01-20 23:43   ` Nick Rosbrook
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 7/8] golang/xenlight: Notify xenlight of SIGCHLD George Dunlap
2020-01-17 16:52   ` Ian Jackson
2020-01-17 17:33     ` George Dunlap
2020-01-17 18:12       ` [Xen-devel] [PATCH] libxl: event: Document lifetime API for libxl_childproc_setmode Ian Jackson
2020-01-20 12:06         ` Wei Liu
2020-01-17 18:13   ` [Xen-devel] [PATCH v3 7/8] golang/xenlight: Notify xenlight of SIGCHLD Nick Rosbrook
2020-01-17 18:28     ` George Dunlap
2020-01-17 15:57 ` [Xen-devel] [PATCH v3 8/8] RFC: Sketch constructors, DomainCreateNew George Dunlap
2020-01-17 18:38   ` George Dunlap [this message]
2020-01-22 10:32   ` George Dunlap
2020-01-24 19:32   ` Nick Rosbrook
2020-01-27 18:08     ` George Dunlap
2020-01-28 20:41       ` Nick Rosbrook
2020-01-29 14:17         ` Nick Rosbrook
2020-01-29 14:46         ` George Dunlap
2020-02-04 19:26           ` Nick Rosbrook
2020-01-17 16:04 ` [Xen-devel] [PATCH v3 1/8] golang/xenlight: Don't try to marshall zero-length arrays in fromC George Dunlap
2020-01-20 23:39 ` Nick Rosbrook
2020-01-21 17:35   ` George Dunlap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=37c32141-ef33-f4ce-bf4a-7ab1d6cabb12@citrix.com \
    --to=george.dunlap@citrix.com \
    --cc=rosbrookn@ainfosec.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).