xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Ronald Rojas <ronladred@gmail.com>
To: xen-devel <xen-devel@lists.xen.org>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Wei Liu <wei.liu2@citrix.com>,
	George Dunlap <george.dunlap@citrix.com>,
	George Dunlap <dunlapg@umich.edu>
Subject: [PATCH RFC 07/59] controller: Introduce basic Xen functionality
Date: Wed, 28 Dec 2016 20:14:00 -0500	[thread overview]
Message-ID: <1482974092-15891-7-git-send-email-ronladred@gmail.com> (raw)
In-Reply-To: <1482974092-15891-1-git-send-email-ronladred@gmail.com>

From: George Dunlap <george.dunlap@citrix.com>

Rough-and-ready execution of xl commands, but they work, amazingly.

Signed-off-by: George Dunlap <george.dunlap@citrix.com>
---
 Makefile     |   2 +-
 main.go      |   3 +-
 xenworker.go | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 234 insertions(+), 2 deletions(-)
 create mode 100644 xenworker.go

diff --git a/Makefile b/Makefile
index 332c8d9..16af528 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ BINALL = $(BIN)
 .PHONY: all
 all: $(BIN)
 
-controller: main.go processworker.go
+controller: main.go processworker.go xenworker.go
 	go build -o $@ $^
 
 .PHONY: clean
diff --git a/main.go b/main.go
index 90388dd..04c8467 100644
--- a/main.go
+++ b/main.go
@@ -75,7 +75,8 @@ func main() {
 	Workers := WorkerList(make([]WorkerState, count))
 	
 	for i = 0; i< count; i++ {
-		Workers[i].w = &ProcessWorker{}
+		//Workers[i].w = &ProcessWorker{}
+		Workers[i].w = &XenWorker{}
 		Workers[i].w.SetId(i)
 		
 		Workers[i].w.Init(WorkerParams{[]string{"burnwait", "20", "20000000"}})
diff --git a/xenworker.go b/xenworker.go
new file mode 100644
index 0000000..6023c50
--- /dev/null
+++ b/xenworker.go
@@ -0,0 +1,231 @@
+package main
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"encoding/json"
+	"bufio"
+	"io"
+)
+
+type XenWorker struct {
+	id int
+	vmname string
+	domid int
+	consoleCmd *exec.Cmd
+	console io.ReadCloser
+	jsonStarted bool
+}
+
+// We have to capitalize the element names so that the json class can
+// get access to it; so annotate the elements so they come out lower
+// case
+type RumpRunConfigBlk struct {
+	Source string     `json:"source"`
+	Path string       `json:"path"`
+	Fstype string     `json:"fstype"` 
+	Mountpoint string `json:"mountpoint"`
+}
+
+type RumpRunConfig struct {
+	Blk RumpRunConfigBlk `json:"blk"`
+	Cmdline string       `json:"cmdline"`
+	Hostname string      `json:"hostname"`
+}
+
+func (w *XenWorker) SetId(i int) {
+	w.id = i
+	w.vmname = fmt.Sprintf("worker-%d", i)
+	w.domid = -1 // INVALID DOMID
+}
+
+func (w *XenWorker) Init(p WorkerParams) (err error) {
+	mock := false
+	
+	// Make xl config file
+	//  name=worker-$(id)
+
+	cfgName := os.TempDir()+"/schedbench-"+w.vmname+".cfg"
+
+	cfg, err := os.Create(cfgName)
+	//defer os.Remove(cfgName)
+
+	if err != nil {
+		fmt.Printf("Error creating configfile %s: %v\n", cfgName, err)
+		return
+	}
+
+	fmt.Fprintf(cfg, "name = '%s'\n", w.vmname)
+	fmt.Fprintf(cfg, "kernel = 'worker-xen.img'\n")
+	fmt.Fprintf(cfg, "memory = 32\n")
+	fmt.Fprintf(cfg, "vcpus = 1\n")
+	fmt.Fprintf(cfg, "on_crash = 'destroy'\n")
+
+	
+	// xl create -p [filename]
+	{
+		args := []string{"xl", "create", "-p", cfgName}
+		if mock {
+			args = append([]string{"echo"}, args...)
+		}
+		e := exec.Command(args[0], args[1:]...)
+		
+		e.Stdout = os.Stdout
+		e.Stderr = os.Stderr
+
+		err = e.Run()
+		if err != nil {
+			fmt.Printf("Error creating domain: %v\n", err)
+			return
+		}
+	}
+
+	// Get domid
+	{
+		var domidString []byte
+		var args []string
+		
+		if mock {
+			args = []string{"echo", "232"}
+		} else {
+			args = []string{"xl", "domid", w.vmname}
+		}
+		e := exec.Command(args[0], args[1:]...)
+
+		domidString, err = e.Output()
+		if err != nil {
+			fmt.Printf("Error getting domid: %v\n", err)
+			return
+		}
+
+		_, err = fmt.Sscanf(string(domidString), "%d\n", &w.domid)
+		if err != nil {
+			fmt.Printf("Error converting domid: %v\n", err)
+			return
+		}
+
+		fmt.Printf(" %s domid %d\n", w.vmname, w.domid)
+	}
+	
+	// Set xenstore config
+	{
+		rcfg := RumpRunConfig{
+			Blk:RumpRunConfigBlk{Source:"dev",
+				Path:"virtual",
+				Fstype:"kernfs",
+				Mountpoint:"/kern"},
+			Hostname:w.vmname}
+		
+		rcfg.Cmdline = "worker-xen.img"
+		for _, a := range p.Args {
+			rcfg.Cmdline += fmt.Sprintf(" %s", a)
+		}
+
+		var rcfgBytes []byte
+	
+		rcfgBytes, err = json.Marshal(rcfg)
+		if err != nil {
+			fmt.Printf("Error marshalling rumprun json: %v\n", err)
+			return
+		}
+
+		//fmt.Printf("json:\n%s\n", string(rcfgBytes))
+		rcfgPath := fmt.Sprintf("/local/domain/%d/rumprun/cfg", w.domid)
+
+		fmt.Printf("Writing to %s, json config %s\n", rcfgPath, rcfgBytes)
+		
+		args := []string{"xenstore-write", rcfgPath, string(rcfgBytes)}
+		if mock {
+			args = append([]string{"echo"}, args...)
+		}
+		e := exec.Command(args[0], args[1:]...)
+		
+		e.Stdout = os.Stdout
+		e.Stderr = os.Stderr
+
+		err = e.Run()
+		if err != nil {
+			fmt.Printf("Error writing json into xenstore: %v\n", err)
+			return
+		}
+	}
+	
+
+	// Run console command, attach to w.console
+	{
+		args := []string{"xl", "console", w.vmname}
+		if mock {
+			args = append([]string{"echo"}, args...)
+		}
+		w.consoleCmd = exec.Command(args[0], args[1:]...)
+
+		w.console, err = w.consoleCmd.StdoutPipe()
+		if err != nil {
+			fmt.Print("Conneting to stdout: ", err)
+			return
+		}
+
+		w.consoleCmd.Start()
+	}
+	
+	return
+}
+
+// FIXME: Return an error
+func (w *XenWorker) Shutdown() {
+	// xl destroy [vmname]
+	e := exec.Command("xl", "destroy", w.vmname)
+
+	e.Stdout = os.Stdout
+	e.Stderr = os.Stderr
+
+	err := e.Run()
+	if err != nil {
+		fmt.Printf("Error destroying domain: %v\n", err)
+		return
+	}
+}
+
+// FIXME: Return an error
+func (w *XenWorker) Process(report chan WorkerReport, done chan bool) {
+	mock := false
+	
+	// xl unpause [vmname]
+	args := []string{"xl", "unpause", w.vmname}
+	if mock {
+		args = append([]string{"echo"}, args...)
+	}
+	e := exec.Command(args[0], args[1:]...)
+
+	err := e.Run()
+	if err != nil {
+		fmt.Printf("Error unpausing domain: %v\n", err)
+		return
+	}
+
+	scanner := bufio.NewScanner(w.console)
+
+	for scanner.Scan() {
+		s := scanner.Text()
+		
+		//fmt.Println("Got these bytes: ", s);
+
+		if w.jsonStarted {
+			var r WorkerReport
+			json.Unmarshal([]byte(s), &r)
+			r.Id = w.id
+			report <- r
+		} else {
+			if s == "START JSON" {
+				//fmt.Println("Got token to start parsing json")
+				w.jsonStarted = true
+			}
+		}
+	}
+
+	done <- true
+
+	w.consoleCmd.Wait()
+}
+
-- 
2.7.4


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

  parent reply	other threads:[~2016-12-29  1:14 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-29  1:13 [PATCH RFC 01/59] Initial controller framework Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 02/59] controller: Revamp communication structure Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 03/59] controller: Initial attempt to generalize process / vm creation Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 04/59] Controller: Move process worker into its own file Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 05/59] controller: Add WorkerParams argument to Init in Worker interface Ronald Rojas
2016-12-29  1:13 ` [PATCH RFC 06/59] Reorganize to enable "Dist" directory Ronald Rojas
2016-12-29  1:14 ` Ronald Rojas [this message]
2016-12-29  1:14 ` [PATCH RFC 08/59] controller: Exit after second SIGINT Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 09/59] controller: Refactor creation and stopping of workers into WorkerList methods Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 10/59] controller: First cut at BenchmarkParams Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 11/59] Refactor to move towards benchmark "plans" and data analysis Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 12/59] Basic 'report' functionality Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 13/59] Add GPL headers / COPYING file (v2 only) Ronald Rojas
2016-12-29 10:51   ` Wei Liu
2016-12-29  1:14 ` [PATCH RFC 14/59] benchmark: Store data in terms of worker sets and worker ids Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 15/59] controller: Move "running" code to a separate file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 16/59] controller: Rename an element in BenchmarkRun to be more accurate Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 17/59] controller: Collect and display statistics on WorkerSets Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 18/59] controller: Add cpupool global config Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 19/59] Add basic libxl framework, get domain cpu_time Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 20/59] xenworker: Use libxl_domain_unpause rather than forking xl Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 21/59] Report utilization statistics Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 22/59] Use tsc for time rather than rumpkernel clock_gettime() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 23/59] run: Don't collect results reported after command to stop guests is issued Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 24/59] report: Lots of changes Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 25/59] main: Change default workload to something a bit more extreme Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 26/59] Use kops rather than mops Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 27/59] report: Allow report verbosity to be specified Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 28/59] controller: Handle worker early death Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 29/59] report: Add basic html report Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 30/59] htmlreport: Include utilization scatterplots Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 31/59] Make a binary that can run reports on a system without libxl Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 32/59] controller: Allow specification of an input file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 33/59] controller: Add verbosity argument and update README with new instructions Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 34/59] controller: Make a useful config file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 35/59] libxl: Add ListCpupool Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 36/59] controller: Make 'dummy' at the level of 'run' rather than xenworker Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 37/59] libxl.go: Provide a single global context by default Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 38/59] controller: Allow multiple schedulers in the same benchmark file Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 39/59] libxl.go: Put common link flags in libxl.go Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 40/59] controller: Add / update GPL text Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 41/59] libxl.go: Link statically rather than dynamically Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 42/59] plan: Allow "templating" from other runs Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 43/59] libxl: Add bitmap support Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 44/59] libxl: Implement CpupoolCreate Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 45/59] libxl: Implement Destroy, Add/Remove operations Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 46/59] libxl: Reorganize bitmapGotoC Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 47/59] libxl: Reorganize code Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 48/59] libxl: Add Ctx.CheckOpen Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 49/59] libxl: Implement libxl_cpupool_info and Scheduler.FromString() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 50/59] libxl: Fix Bitmap.Max(), make Test() / Clear() more robust Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 51/59] controller: Make and/or modify cpupools when possible Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 52/59] libxl: Implement Bitmap.String() Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 53/59] controller: Add WorkerConfig.SoftAffinity Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 54/59] controller/run: Add RunConfig.NumaDisable Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 55/59] plan: Make the matrix generation more programmatic Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 56/59] controller/plan: Add NumaDisable to SimpleMatrix Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 57/59] tools/blktap2: remove unused inclusion of sys/sysctl.l Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 58/59] remove irrelevant files from old repository Ronald Rojas
2016-12-29  1:14 ` [PATCH RFC 59/59] tools/xenlight: Create interface for xenlight info Ronald Rojas
2016-12-29 10:34   ` George Dunlap
2016-12-29 10:52     ` Wei Liu
2016-12-29 13:49       ` Ronald Rojas
2016-12-29 13:45   ` George Dunlap
2016-12-29 20:20     ` George Dunlap
2017-01-03 17:45     ` Ronald Rojas
2017-01-04 16:44       ` 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=1482974092-15891-7-git-send-email-ronladred@gmail.com \
    --to=ronladred@gmail.com \
    --cc=dunlapg@umich.edu \
    --cc=george.dunlap@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.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).