1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# vim: set sw=4 sts=4 et :
# Copyright: 2008 Gentoo Foundation
# Author(s): Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
# License: GPL-2
#
# Immortal lh!
#
from django.db import models
from django.forms import ModelForm, ModelChoiceField
from django.contrib.auth.models import User
from autotua import jobuild, sync
import const, random, urllib2
####################
### Models begin ###
####################
class StageProvider(models.Model):
# Identifier for the stage provider.
# Ex: 'gentoo', 'funtoo', 'gentooexperimental'
name = models.CharField(max_length=25, unique=True)
def __unicode__(self):
return self.name
class Stage(models.Model):
# stage{1,2,3,4} etc
name = models.CharField(max_length=25)
# Stage provider that supports this stage
provider = models.ForeignKey(StageProvider)
class Meta:
unique_together = ['name', 'provider']
def __unicode__(self):
return '%s (%s)' % (self.stage, self.provider.name)
class Arch(models.Model):
# Specific arch i686, g4, ~amd64, core32 etc.
specific = models.CharField(max_length=25)
# The generic arch corresponding to the above specific arch
# Ex: 'specific': 'i686', 'generic': 'x86'
# This is needed for Gentoo mirrors
generic = models.CharField(max_length=25, blank=True)
# Stage provider that supports stages with this arch
provider = models.ForeignKey(StageProvider)
class Meta:
unique_together = ['specific', 'provider']
def __unicode__(self):
return '%s (%s)' % (self.arch, self.provider.name)
class Release(models.Model):
# Release number/identifier
name = models.CharField(max_length=25)
# Release provider
provider = models.ForeignKey(StageProvider)
class Meta:
unique_together = ['name', 'provider']
def __unicode__(self):
return '%s (%s)' % (self.release, self.provider.name)
class Mirror(models.Model):
# Mirror owner
owner = models.ForeignKey(StageProvider)
# Mirror root URL
# Ex: 'http://gentoo.osousl.org/', 'http://www.funtoo.org/'
server = models.URLField()
# Prefix to the stage file structure root
# Ex: 'releases/', 'linux/'
prefix = models.CharField(max_length=25)
# How to get a URI for a stage file by putting in various variables
# Ex: Gentoo mirrors are structured as follows:
# '%(gen_arch)s/%(release)s/stages/%(stage)s-%(arch)s-%(release)s.tar.bz2'
# Funtoo is structured as follows:
# '%(arch)s/%(owner)s-%(arch)s-%(release)/%(stage)s-%(arch)s-%(release)s.tar.bz2'
structure = models.CharField(max_length=200)
class Meta:
unique_together = ['server', 'prefix']
def __unicode__(self):
return '%s/%s (%s)' % (self.server, self.prefix, self.owner.name)
def save(self):
if not self.server.endswith('/'):
self.server += '/'
if not self.prefix.endswith('/'):
self.prefix += '/'
super(Mirror, self).save()
class Job(models.Model):
# Identifier for the job
name = models.CharField(max_length=30,
help_text="Identifier for the job")
# Name of maintainer
maintainer = models.ForeignKey(User, editable=False)
# Stage provider
provider = models.ForeignKey(StageProvider)
# Stage type
stage = models.ForeignKey(Stage)
# i686, amd64, g4, etc.
arch = models.ForeignKey(Arch)
# Release
release = models.ForeignKey(Release)
# Type of stage; hardened, uclibc, etc
#type = CharField(maxlength=25) # const.stage_types
# Revision of jobtage tree to use (not to be entered by user)
jobtagerev = models.CharField(max_length=50, editable=False)
# Root jobuild atom; auto-converted to deplist
atoms = models.TextField()
class Meta:
unique_together = ['name', 'maintainer']
def __unicode__(self):
return '%s/%s' % (self.maintainer, self.name)
def save(self):
atoms = self._get_deplist(self.atoms.split(), self.jobtagerev)
self.atoms = '\n'.join(atoms)
super(Job, self).save()
def _get_deplist(self, atoms, rev):
"""
Use autotua-slave to get the deplist
from the root jobuild atom
Support multiple atoms for the multiple-save case
"""
tmpdir = '%s-%s' % (const.TMPDIR, random.randint(0, 99999))
jobtage_exportdir = '%s/jobtage-export' % tmpdir
jobtagedir = const.JOBTAGE
# If not a filesystem path, clone is required before an export
if not urllib2.splittype(jobtagedir)[0] in ['file', None]:
jobtagedir = '%s/jobtage' % tmpdir
sync.Syncer(scheme='git', uri=const.JOBTAGE, destdir=jobtagedir).sync()
sync.Syncer(scheme='git-export', uri=jobtagedir, destdir=jobtage_exportdir, rev=rev).sync()
deplist = []
for atom in atoms:
resolver = jobuild.Resolver(jobuild.Jobuild(jobtage_exportdir, atom))
deplist.extend(resolver.resolve())
deplist.reverse()
# Fake jobuild.Resolver to get at _unique ;p
return jobuild.Resolver(None)._unique(deplist)
class Slave(models.Model):
# Which user owns this slave
owner = models.ForeignKey(User)
# Status of slave
#status = models.ForeignKey(Job)
###################
### Forms begin ###
###################
class JobForm(ModelForm):
# FIXME: Make the default here as 'gentoo' once db is populated.
provider = ModelChoiceField(label="Stage Provider",
queryset=StageProvider.objects.all())
# FIXME FIXME FIXME: All fields after this should filter on the
#basis of the above specified provider.
# Javascript? Two steps for form submission?
stage = ModelChoiceField(label="Stage type",
queryset=Stage.objects.all())
arch = ModelChoiceField(label="Arch",
queryset=Arch.objects.all())
release = ModelChoiceField(label="Release",
queryset=Release.objects.all())
class Meta:
model = Job
include = ('name', 'atoms')
|