aboutsummaryrefslogtreecommitdiffstats
path: root/bin/forcebuild.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/forcebuild.py')
-rwxr-xr-xbin/forcebuild.py187
1 files changed, 0 insertions, 187 deletions
diff --git a/bin/forcebuild.py b/bin/forcebuild.py
deleted file mode 100755
index e6770a4f..00000000
--- a/bin/forcebuild.py
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/usr/bin/env python
-
-# YoctoAutobuilder force build script
-#
-# Copyright (C) 2017 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-import urllib2
-import urllib
-import cookielib
-import uuid
-import sys
-import argparse
-import json
-from bs4 import BeautifulSoup
-
-class YoctoAutobuilderAPI(object):
- def __init__(self, server):
- self.server = server
- self.opener = urllib2.build_opener(
- urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
-
- def login(self, user, passwd):
- data = urllib.urlencode(dict(username=user,
- passwd=passwd))
- url = self.server + "/login"
- request = urllib2.Request(url, data)
- result = self.opener.open(request).read()
- if result.find("The username or password you entered were not correct") > 0:
- print("Invalid username or password")
- return 1
- return 0
-
- def _get_builders(self):
- url = "%s/json/builders/?as_text=1" % (self.server)
- request = urllib2.Request(url)
- json_raw_data = self.opener.open(request)
-
- return json.load(json_raw_data)
-
- def list_builders(self):
- builders = self._get_builders()
-
- if builders:
- print('Available builders:\n')
- for builder in builders:
- print(builder)
- return 0
- else:
- print('No available builders in this server.')
- return 1
-
- def _get_options_by_builder(self, builder):
- options = {}
-
- url = "%s/builders/%s" % (self.server, builder)
- request = urllib2.Request(url)
- html = self.opener.open(request).read()
-
- inputs = BeautifulSoup(html, 'lxml').find_all('input')
- for input in inputs:
- type = input.attrs['type']
- if type == 'submit':
- continue
-
- options[input.attrs['name']] = input.attrs['value']
-
- selects = BeautifulSoup(html, 'lxml').find_all('select')
- for select in selects:
- value = select.find_all('option', selected=True)[0].getText()
- options[select.attrs['name']] = value
-
- return options
-
- def list_options(self, builder):
- builders = self._get_builders()
- if not builder in builders:
- print('Builder %s specified isn\'t available' % builder)
- return 1
-
- opts = self._get_options_by_builder(builder)
- print('Available options in builder %s:\n' % (builder))
- for name in opts:
- value = opts[name]
- print('Name: %s, Default value: %s' % (name, value))
-
- def force_build(self, builder, opts, idle_check=False):
- builders = self._get_builders()
- if not builder in builders:
- print('Builder specified isn\'t available')
- return 1
-
- state = builders[builder]['state']
- if idle_check and not state == 'idle':
- print('Builder %s specified isn\'t IDLE, current state %s' \
- % (builder, state))
- return 1
-
- if opts:
- # FIXME: transform string argument into dictionary, security?
- opts = eval(opts)
- else:
- opts = {}
- current_opts = self._get_options_by_builder(builder)
- for opt in opts:
- if not opt in current_opts:
- print('Option %s isn\'t supported by builder %s' % \
- (opt, builder))
- return 1
- else:
- current_opts[opt] = opts[opt]
-
- url_params = urllib.urlencode(current_opts)
- url = "%s/builders/%s/force" % (self.server, builder)
- request = urllib2.Request(url, url_params)
- result = self.opener.open(request)
- if 'Forced build' in result.read():
- return 0
- else:
- print("Failed to force build")
- return 1
-
-def main():
- parser = argparse.ArgumentParser(description="Yocto Autobuilder force build script",
- add_help=False)
- parser.add_argument('-s', '--server', help='Server URL',
- action='store', required=True)
-
- parser.add_argument('-u', '--username', action='store', required=True)
- parser.add_argument('-p', '--password', action='store', required=True)
-
- group = parser.add_mutually_exclusive_group()
- group.add_argument('--list-builders', help='List available builders',
- action='store_true')
- group.add_argument('--list-options', help='List options by builder',
- action='store', metavar='BUILDER')
- group.add_argument('--force-build', help='Force build by builder',
- action='store', metavar='BUILDER')
- group.add_argument('--force-build-idle', help='Force build by builder if is idle',
- action='store', metavar='BUILDER')
-
- parser.add_argument('-o', '--options', help='Custom options by operation',
- action='store')
-
- parser.add_argument('-d', '--debug', help='Enable debug output',
- action='store_true')
- parser.add_argument('-q', '--quiet', help='Print only errors',
- action='store_true')
-
- parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
- help='show this help message and exit')
-
- args = parser.parse_args()
-
- api = YoctoAutobuilderAPI(args.server)
- if api.login(args.username, args.password):
- return 1
-
- if args.list_builders:
- return api.list_builders()
- elif args.list_options:
- return api.list_options(args.list_options)
- elif args.force_build:
- return api.force_build(args.force_build, args.options)
- elif args.force_build_idle:
- return api.force_build(args.force_build_idle, args.options, idle_check=True)
-
-if __name__ == '__main__':
- try:
- ret = main()
- except Exception:
- ret = 1
- import traceback
- traceback.print_exc()
- sys.exit(ret)