Skip to content

Commit 2c34c78

Browse files
committed
2 parents c214643 + 8b6f348 commit 2c34c78

File tree

10 files changed

+102
-37
lines changed

10 files changed

+102
-37
lines changed

client/imports/ui/pages/lab/labview.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,7 @@ export default class LabView extends MeteorComponent {
7171
ngAfterViewInit(){
7272
var slf = this;
7373
Meteor.call('prepareLab',"1", function(err,res){
74-
console.log('here');
75-
console.log("fired",err,res);
76-
//slf.labMarkdown = "# Sander \n ## are you sure this will work?";
74+
7775
slf.tasks = res.taskList;
7876
slf.toTask(slf.tasks[0]);
7977
slf.labProgress = "0 / "+slf.tasks.length;
@@ -94,7 +92,6 @@ export default class LabView extends MeteorComponent {
9492
Meteor.call('verifyTask',"1",function(err,res){
9593
var slf = this;
9694
if(err){
97-
console.log("something went horribly wrong");
9895
}
9996
else{
10097
if(res.verified){
@@ -110,12 +107,12 @@ export default class LabView extends MeteorComponent {
110107

111108
// Called by Next button
112109
nextTask(){
113-
console.log("proceeding");
114110
var slf = this;
115111
Meteor.call('nextTask',"1",function(err,res){
116112
if(err){
117113
slf.nextButton = false;
118114
console.log("try again");
115+
//TODO: @sandershihacker, change this from console.log to alert/something else
119116
}
120117
else{
121118
console.log(res);

client/imports/ui/routes/course.guard.course.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,13 @@ export class CourseGuardRecord implements CanActivate{
2929
var obs : Observable<boolean> = Observable.fromPromise(new Promise<boolean> (function(resolve, reject){
3030

3131
Meteor.subscribe('courses', function(){
32-
33-
// Enroll Authenticated Users
34-
var course_record = Collections.course_records.findOne({user_id: slf.user._id, course_id: course_id});
32+
var course = Collections.course_records.findOne({user_id: slf.user._id, course_id: course_id});
3533
if (typeof course_record !== "undefined" && course_record !== null){
3634
resolve(true);
3735
}
3836
else{
3937

4038
}
41-
4239
});
4340
}));
4441

collections/users.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ if (Meteor.isServer){
106106
defaultValue: []
107107
},
108108
sessions:{
109-
type: sessionSchema
109+
type: [sessionSchema],
110+
defaultValue: []
110111
}
111112
});
112113
(<any> Meteor.users).attachSchema(userSchema);

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"es6-promise": "^3.2.1",
4040
"es6-shim": "^0.35.1",
4141
"eval": "^0.1.1",
42+
"http-proxy": "^1.14.0",
4243
"marked": "^0.3.5",
4344
"meteor-node-stubs": "^0.2.3",
4445
"mongodb": "^2.1.18",

server/imports/api/lab.env.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ env.prototype.system = {
3535
key: "",
3636
os_family: "",
3737
image: "",
38+
labVm_id: "",
39+
containers: [],
3840
ssh_port: null,
3941
node_ip: null
4042
}
@@ -97,7 +99,8 @@ env.deleteRecords = function(user,callback){
9799
{dockerodeStartOptions: {--your options here--}}
98100
*/
99101
env.prototype.init = function(system){
100-
console.log("env.init");
102+
103+
TuxLog.log("trace","initalizing the user environment");
101104
var slf = this;
102105

103106
/* create unique labVm name to avoid collisions
@@ -366,6 +369,7 @@ env.prototype.createVm = function(opts) {
366369

367370
//add container to slf.vmList to keep track
368371
slf.vmList[crtOpt.name] = cName;
372+
slf.system.containers.push(container.id);
369373
resolve();
370374
}
371375
});
@@ -497,7 +501,6 @@ env.prototype.shell = function(vmName,command,opts) {
497501
}
498502
});
499503
stream.on('end',function(){
500-
console.log(dat);
501504
resolve(dat,stdErr);
502505
});
503506
}

server/imports/api/lab.session.js

-5
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ session.prototype.env = null;
4848
session.prototype.lab = null;
4949
session.prototype.student = null;
5050
session.prototype.pass = null;
51-
session.prototype.started = false;
5251
session.prototype.courseId = null;
5352
session.prototype.user = null;
5453
session.prototype.userId = null;
@@ -80,10 +79,6 @@ session.prototype.fromJson = function(data, callback){
8079
});
8180

8281
}
83-
session.prototype.changeStarted = function(){
84-
this.started = true;
85-
console.log(this.started);
86-
}
8782
/* init: pulls labFile and initializes session object from it
8883
*/
8984
session.prototype.init = function(user,userId,labId,callback){

server/imports/lab/methods.ts

+86-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ declare var TuxLog : any;
55
declare var SessionCache : any;
66
declare var nconf : any;
77
declare var _ : any;
8+
declare var async : any;
89

10+
import{ Roles } from '../../../collections/users.ts';
911
//import session constructor
1012
var LabSession = require('../api/lab.session.js');
1113

@@ -21,12 +23,11 @@ Meteor.methods({
2123
* implement loading wheel, md fetch, course record create in callback
2224
*/
2325
'prepareLab': function(labId : string){
24-
2526
TuxLog.log("trace","preparing lab");
2627

27-
// Meteor.user().sessions.push({labId: labId,started: Date.now()});
28+
(<any>Meteor.user()).sessions.push({labId: labId,started: Date.now()});
2829

29-
// Collections.users.update({_id: Meteor.userId()},{$set:{sessions: this.user.sessions}});
30+
Meteor.users.update({_id: Meteor.userId()},{$set:{sessions: this.user.sessions}});
3031
//get course Id
3132
var courseId = Collections.labs.findOne({_id: labId}).course_id;
3233

@@ -141,7 +142,7 @@ Meteor.methods({
141142
},
142143

143144
'getLastLab' : function(){
144-
var sessions = Collections.users.findOne({_id: Meteor.userId()}).sessions;
145+
var sessions = (<any>Meteor.user()).sessions;
145146

146147
var labId = sessions.reduce(function(total,current){
147148
if(current.started < total){
@@ -153,5 +154,86 @@ Meteor.methods({
153154
var courseId = Collections.labs.findOne({_id: labId}).course_id;
154155

155156
return {labId: labId, courseId: courseId};
157+
},
158+
159+
'addInstructor' : function(course_id, instructor_id){
160+
161+
if(!(Roles.isAdministratorFor(course_id, Meteor.userId()) || Roles.isInstructorFor(course_id,instructor_id))){
162+
throw new Meteor.Error("only administrators or instructors can modify instructors");
163+
}
164+
else{
165+
var inst : any = Meteor.users.findOne({_id: instructor_id});
166+
167+
if(!inst){
168+
throw new Meteor.Error("no user found with given id");
169+
}
170+
else{
171+
inst.roles.instructor.push(course_id);
172+
173+
Meteor.users.update({id: instructor_id},{$set: {roles: inst.roles}});
174+
175+
var instructor = {
176+
name: inst.profile.first_name + " "+ inst.profile.last_name,
177+
id: instructor_id
178+
};
179+
180+
Collections.courses.update({_id: course_id},{$push:{instructors: instructor}});
181+
}
182+
}
183+
},
184+
185+
'removeInstructor' : function(course_id, instructor_id){
186+
187+
if(!(Roles.isAdministratorFor(course_id, Meteor.userId()) || Roles.isInstructorFor(course_id, instructor_id))){
188+
throw new Meteor.Error("only administrators or instructors can modify instructors");
189+
}
190+
else{
191+
var inst : any = Meteor.users.findOne({_id: instructor_id});
192+
193+
if(!inst){
194+
throw new Meteor.Error("no user found with given id");
195+
}
196+
else{
197+
Collections.courses.update({_id: course_id},{$pull:{instructors: {id: instructor_id}}});
198+
199+
inst.roles.instructor.delete(inst.roles.instructor.indexOf(course_id));
200+
Meteor.users.update({_id: instructor_id},{$set: {roles: inst.roles}});
201+
}
202+
}
203+
},
204+
205+
'createCourse' : function(course_name, userId, course_number){
206+
if(!Roles.isGlobalAdministrator(Meteor.userId())){
207+
throw new Meteor.Error("only administrators can create courses")
208+
}
209+
else{
210+
var user = Meteor.users.findOne({_id: userId});
211+
if(!user){
212+
throw new Meteor.Error("the instructor id does not match that of a registered user");
213+
}
214+
else{
215+
if(!course_number){
216+
course_number = "";
217+
}
218+
var course = {
219+
course_number: course_number,
220+
course_name: course_name,
221+
}
222+
var courseId = Collections.courses.insert(course);
223+
224+
Meteor.call('addInstructor',courseId, userId);
225+
}
226+
}
227+
},
228+
229+
'deleteCourse' : function(course_id){
230+
var course = Collections.courses.findOne({_id: course_id});
231+
232+
var instructors = course.instructors;
233+
234+
async.map(instructors,function(instructor){
235+
Meteor.call('removeInstructor',course_id,instructor.id);
236+
});
237+
156238
}
157239
});

server/imports/startup/auth.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Accounts.onCreateUser(function(options, user){
2222
'instructor' : [],
2323
'administrator' : []
2424
}
25-
25+
user.sessions = [];
2626
// Return User
2727
return user;
2828
});

server/imports/startup/cache.js

+3-6
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ var Session = require('../api/lab.session.js');
6363
else{
6464
try{
6565
var data = etcd.getSync('/tuxlab/sessions/'+userid+'/'+labid);
66-
console.log("DATA",data);
6766
if(data && data.body && data.body.node && data.body.node.value){
6867
TuxLog.log("warn","Pulling session from etcd");
6968
var sess = new Session();
@@ -91,7 +90,7 @@ var Session = require('../api/lab.session.js');
9190
callback(success) - returns boolean if success
9291
*/
9392
SessionCache.add = function(userid, labid, session){
94-
console.log("in add");
93+
TuxLog.log("trace","adding session to cache");
9594
async.series([
9695
function(cb){
9796
SessionCache._NodeCache.set(userid+'#'+labid, session, function(err, success){
@@ -100,25 +99,23 @@ var Session = require('../api/lab.session.js');
10099
cb(true);
101100
}
102101
else{
102+
TuxLog.log("trace","added session to cache successfully");
103103
cb(false);
104104
}
105105
});
106106
},
107107
function(cb){
108-
//TODO @cemersoz to_data method
109108

110109
var json = {
111110
taskNo: session.lab.taskNo,
111+
system: session.env.system,
112112
taskUpdates: session.taskUpdates,
113-
pass: session.pass,
114113
user:session.user,
115114
userId: session.userId,
116115
labId: labid,
117116
courseId: session.courseId
118117
};
119118

120-
console.log("setting: "+json);
121-
122119
etcd.set('tuxlab/sessions/'+session.env.system.node_ip+ '/' + userid + '/' + labid, JSON.stringify(json), function(err){
123120
if(err){
124121
TuxLog.log("warn","etcd.set err");

wercker.yml

+1-9
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,10 @@ build:
1414
name: install meteor
1515
code: "curl https://install.meteor.com/ | sh"
1616

17-
- script:
18-
name: install typings
19-
code: sudo meteor npm install -g typings
20-
2117
- script:
2218
name: install npm dependencies
2319
code: meteor npm install
24-
25-
- script:
26-
name: typings install
27-
code: typings install
28-
20+
2921
- script:
3022
name: running gagarin tests
3123
code: meteor npm test

0 commit comments

Comments
 (0)