Skip to content

Commit 8b6f348

Browse files
cemersozDerekTBrown
authored andcommitted
API refactoring. (#215)
* issue 32 fixed * removed swp * fixed nconf issues * issue 82, 84 fixes * fixed #82 * isse #77 * fixed tests * fixed files * fixed tests master * fixed comment * moved validator * removed duplicate file * fixed tests, removed duplicate underscore, publish * changes * fixed methods.ts import * fixed issues w methods * fixes * minor fixes * A * api changes * fixed api * comments * minor changes * minor fixes * api changes (#126) * issue 32 fixed * removed swp * fixed nconf issues * issue 82, 84 fixes * fixed #82 * isse #77 * fixed tests * fixed files * fixed tests master * fixed comment * moved validator * removed duplicate file * fixed tests, removed duplicate underscore, publish * changes * fixed methods.ts import * fixed issues w methods * fixes * minor fixes * A * api changes * fixed api * comments * minor changes * minor fixes * method implementations * before merge * removed testing change * fixed typo * fixed prepareLab * removed test methods * fix prepareLab * methods changes * removed swap file * fixed merge * fixes * prepareLab WORKS * further fixes * merge * all works * deleted debug line * fixed minor excess code * minor indentation fix * reference fixes * fixes to nextTask * merged with master * minor changes * fixed merge problems * fixed md view and swithces * fixed error messages * removed debug code * removed swp * fixes * fixed typescript warning * added student object * changed function calls * deleted unnecessary files * updated api, added md feedback * fixed ts warn * fixed example_data and partially tests * update validator, merge * fixed indentation * changes * it's pretty now * what * fixes to api changes * fixed api, deleted swap * fixed etcd add * fixed #187, #188 * minor fixes * fixed indentation * added equal sign * updated example courses to match schema * added md parser * removed debug code * fixed debug, import * changed dockerode settings * implemented to-from json * from-to json * fixed etcd err * etcd cache changes * added env.util * multiple os support * minor changes * added -system- variable * added attempted field to course_records * fixed cache, Collections issues * fixed minor env errors * minor docker fixes, debug logs * minor change for timeout * env refactoring with system * #211, #199 * api refactoring * api refactoring and fixes * some more refactoring. Removed debug code * updated readme * . * changes * wercks * fixed problems, #194 * moved debug code to TuxLog trace, fixes #214 * api refactoring for auto container delete
1 parent ff5945b commit 8b6f348

File tree

8 files changed

+103
-28
lines changed

8 files changed

+103
-28
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);

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);

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");

server/imports/startup/docker.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ var fs = require('fs');
33

44
var dockerode_options = {
55
host: nconf.get('swarm_node_ip'),
6-
port: nconf.get('swarm_node_port')//,
7-
// ca: fs.readFileSync(nconf.get('swarm_cert_dir')+"/ca.pem"),
8-
// cert: fs.readFileSync(nconf.get('swarm_cert_dir')+"/cert.pem"),
9-
//key: fs.readFileSync(nconf.get('swarm_cert_dir')+"/key.pem")
6+
port: nconf.get('swarm_node_port'),
7+
ca: fs.readFileSync(nconf.get('swarm_cert_dir')+"/ca.pem"),
8+
cert: fs.readFileSync(nconf.get('swarm_cert_dir')+"/cert.pem"),
9+
key: fs.readFileSync(nconf.get('swarm_cert_dir')+"/key.pem")
1010
};
1111
docker = new dockerode(dockerode_options);

0 commit comments

Comments
 (0)