aboutsummaryrefslogtreecommitdiff
blob: ea39dd72916d84ed91f01173b9e40eb927567eef (plain)
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
# 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

####################
### 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
        """
        # FIXME: Re-implement using git-fuse?
        jobtagedir = '%s/jobtage-%s' % (const.TMPDIR, random.randint(0, 99999))
        sync.Syncer(scheme='git-export', uri=const.JOBTAGE, destdir=jobtagedir).sync()

        deplist = []
        for atom in atoms:
            resolver = jobuild.Resolver(jobuild.Jobuild(jobtagedir, 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')