This repository has been archived by the owner on Nov 9, 2017. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathrestapi.py
135 lines (122 loc) · 5.15 KB
/
restapi.py
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
from rest_framework.response import Response
from rest_framework import routers
from rest_framework import serializers
from rest_framework import viewsets
from . import pulpapi
from . import coprapi
from . import models
#TODO: Automatically translate requests exceptions to error responses
#TODO: Override the default browsable API layout with the RepoFunnel layout
#=============
# Serializers
#=============
class FeedSerializer(serializers.HyperlinkedModelSerializer):
#TODO: Delete the Pulp repo when deleting the tracking feed
#TODO: Support recreating the Pulp repo from the RepoFunnel state
_pulp_prefix = "feed-"
class Meta:
model = models.Feed
fields = ("id", "name", "url", "feed_url")
def create(self, validated_data):
feed_repo = models.Feed.objects.create(**validated_data)
repo_name = self._pulp_prefix + validated_data["name"]
# Create a new feed repository in Pulp
pulp_repo = pulpapi.create_repo(repo_name, repo_name)
# Configure the remote content feed
add_importer = pulpapi.set_feed(repo_name,
validated_data["feed_url"])
pulpapi.wait_for_task(add_importer["spawned_tasks"][0]["task_id"])
pulp_importer = pulpapi.get_feed(repo_name)
# Start the initial content sync
pulp_sync = pulpapi.start_sync(repo_name)
# Save the new tracking feed to the database
feed_repo.pulp_repo = repo_name
feed_repo.save()
# Show the Pulp details in the creation response
self.fields["_debug_info"] = serializers.DictField(read_only=True)
feed_repo._debug_info = {
"pulp_repo_creation": pulp_repo,
"pulp_importer": pulp_importer,
"pulp_initial_sync": pulp_sync
}
return feed_repo
class FunnelSerializer(serializers.HyperlinkedModelSerializer):
#TODO: Delete the Pulp repo when deleting the merge funnel
_pulp_prefix = "funnel-"
feeds = FeedSerializer(many=True, read_only=True)
class Meta:
model = models.Funnel
fields = ("id", "name", "url", "feeds", "funnel_url")
read_only_fields = ("funnel_url",)
def create(self, validated_data):
funnel = models.Funnel.objects.create(**validated_data)
repo_name = self._pulp_prefix + validated_data["name"]
# Create a new funnel RPM repository in Pulp
pulp_repo = pulpapi.create_repo(repo_name, repo_name)
add_importer = pulpapi.set_feed(repo_name)
pulpapi.wait_for_task(add_importer["spawned_tasks"][0]["task_id"])
pulp_importer = pulpapi.get_feed(repo_name)
# Configure the funnel for publishing
pulp_distributor, funnel_url = pulpapi.set_target(repo_name)
funnel.funnel_url = funnel_url
# Merge content into the funnel from the feed repositories
#TODO: Specify which feeds to link. For now, always link all of them
feeds = models.Feed.objects.all()
pulp_merges = {}
for feed in feeds.all():
#TODO: Support filtering merged content
source_id = feed.pulp_repo
pulp_merges[source_id] = pulpapi.start_merge(source_id, repo_name)
#TODO: Configure event listeners for feed repo updates
# Start the initial repo publication
pulp_publish = pulpapi.start_publish(repo_name)
# Save the new merge funnel to the database
funnel.feeds = feeds
funnel.pulp_repo = repo_name
funnel.save()
# Show the Pulp details in the creation response
self.fields["_debug_info"] = serializers.DictField(read_only=True)
funnel._debug_info = {
"pulp_repo_creation": pulp_repo,
"pulp_importer": pulp_importer,
"pulp_initial_merges": pulp_merges,
"pulp_distributor": pulp_distributor,
"pulp_publish": pulp_publish,
}
return funnel
#==========
# ViewSets
#==========
class _DestroyPulpRepoMixin:
def destroy(self, request, *, pk):
instance = self._model_manager.get(pk=pk)
repo_name = instance.name
pulp_repo_id = instance.pulp_repo
if pulp_repo_id is None:
pulp_repo_id = self.serializer_class._pulp_prefix + repo_name
pulp_delete = pulpapi.delete_repo(pulp_repo_id)
super().destroy(request, pk=pk)
details = {
"id": pk,
"name": repo_name,
"_debug_info": {"pulp_repo_deletion": pulp_delete}
}
return Response(details)
class FeedViewSet(_DestroyPulpRepoMixin, viewsets.ModelViewSet):
_model_manager = models.Feed.objects
queryset = _model_manager.all()
serializer_class = FeedSerializer
class FunnelViewSet(_DestroyPulpRepoMixin, viewsets.ModelViewSet):
_model_manager = models.Funnel.objects
queryset = _model_manager.all()
serializer_class = FunnelSerializer
#=========================
# Hooking up the API URLs
#=========================
def make_urls():
router = routers.DefaultRouter()
router.register( "feed", FeedViewSet)
router.register( "funnel", FunnelViewSet)
pulpapi.add_to_router(router, "pulp")
coprapi.add_to_router(router, "copr")
return router.urls