弹性计算云Eucalyptus代码

来源:互联网 发布:如何确保数据准确性 编辑:程序博客网 时间:2024/05/01 18:58

A Eucalyptus cloud setup consists of three types of components -- the cloud controller, the cluster controller(s), and the node controller(s). The cloud controller is a Java program that, in addition to high-level resource scheduling and system accounting, offers a Web services interface and a Web interface to the outside world. Cluster controller and node controller are written in C and deployed as Web services inside Apache.

Eucalyptus使用了Axis2 ,啥是Axis2或者说Axis2有啥用。Axis就是快速发布web service的工具,提供了SOAP协议的封装,方便于client端于webservice通信。

log机制使用了log4j。

使用X509认证。

class AbstractIsomorph ,注释为MappedSuperclass,个人认为是一个保存用户信息和状态的抽象类。

class AbstractKeyStore ,这个抽象类很有意思,其静态方法调用了子类的构造函数。并且子类GenericKeyStore是其内部类。感觉设计得不好。其意图是让这个类含有几个抽象的方法,但是这几个抽象方法有一个默认的实现。AbstractKeyStore主要是为了添加证书查找证书,并查找用户名对应的password来认证。并且将alias,cert添加到某一文件中。并将此alias对应的password放入到keystore中。

class AbstractNamedRegistry ,这个抽象类将存放、更新某种继承自HasName接口的对象的两种状态。一种是active,一种是disable,这两种状态放在ConcurrentNavigableMap中,并且以对象的名作为key,value就是对象自身。

class AbstractOperation ,这个抽象类是操作的抽象,并认为凡是操作就应该有request和reply,并且request和reply继承自EucalyptusMessage

class AccessDeniedException ,就是一个禁止访问的异常,继承自EucalyptusCloudException。

class Address ,这是一个address类(废话),存放地址id,地址名(?? 个人认为可能是真实地址) ,cluster的地址,使用者的用户名,实例地址等(其实就是一个描述实例所需要的属性。)并使用高性能锁ReentrantReadWriteLock加以控制。加锁是为了将实例assign出去,或者收回。不过我个人觉得ReentrantReadWriteLock可能使用的有问题。以为我看到函数release()中有this.canHas.writeLock().lock();,并在之后调用了unassign()方法,而unassign()方法中也有this.canHas.writeLock().lock();...难道可以对同一写锁加两次lock?不过我没有研究过ReentrantReadWriteLock。

class Addresses, 这个类继承了 AbstractNamedRegistry, 并且可以填入Address .这就是说,这个类是用来active,disable一个address的。另外它是用来单实例模式,也就是整个cloud中只有这一份实例。(这里会不会崩溃后无法恢复的问题? )

class AddressManager ,继承了org.mule.api.lifecycle.Startable类,Startable可能是处理生命周期吧 ..不过这个类是和地址相关的,是用来分配,释放,将address和vm关联起来的类。

class AddressUpdateCallback 继承了QueuedEventCallback并且实现了Runnable,也就是说它可以作为一个线程类。另外它sleep的时间好像有点过长了5*1000.这个类的作用好像是将用户名封装到msg中,然后发送给cluster队列来处理。之后睡一个5*1000秒,然后再醒来看看是否有cluster的回复,然后根据回复设置实例的地址。这里采用线程,是因为需要一直监督address的更新。可以看成是守护线程。

add_key.pl,这个是perl文件,看不太明白,应该是加入了ssh的public key.不过中间为啥使用loop device,并且将图片加载到loop device上就不得而知了。后来发现,这里image的含义不是图片的意思,而是镜像,也就是将镜像加载到loop device上。

add_key~add_wsdllocation.pl都是perl写成的。

class Admin 是用来创建EucalyptusMessage的类。

admin.xml 用来配置www的conf的。
interface Allocator ,这接口用来分配的,根据String requestId, String userName, String vmtype, int min, int max, SortedSet<ClusterNodeState> clusters 来分配资源,会抛出NotEnoughResourcesAvailable异常

class AlreadyExistsException 继承了RuntimeException

class AOEManager 继承了StorageExportManager,是用来导出存储容量的?

interface AppMessages 继承了Messages,从其函数中看,是一个与页面控件事件相关的类。

class AssignAddressCallback ,分配地址的cluster,发送回消息后就会将network configure更新。

class AttachedVolumeInfo 这是一个将附加逻辑磁盘id,逻辑磁盘名,实例id,设备名,状态和添加时间合成的类。如果其为一行,那么一张表就是AttachedVolumes

interface Authenticator 是将X509证书和EucalyptusMessage中信息来生成是否授权的Msg的接口。

aws-base.xml~aws-zones.xml 是将java类映射为XML,是否为Hibernate就不得而知了。

Axis2.xml~class AxisHttpResponseImpl 可以认为是和Axis2打交道的东西。可以以后再研究下。

 

class BadPaddingException 这个类传说是sun的实现。
enum BaseDirectory ,枚举类型的类,其实就是来设置  HOME( "euca.home" ),VAR( "euca.var.dir" ),CONF( "euca.conf.dir" ),LOG( "euca.log.dir" )这四个变量的。
class BasicClient, 实现了Client,其中包含有serverclient和httpclient两个,主要使用uri进行连接的类。因为使用Axis2所以还没看懂。

class BCrypt ,这个类竟然有注释!BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres.实现了一个OpenBSD中的密码机制。来自于A Future-Adaptable Password Scheme一文。

bin-assembly.xml 主要是为了将各个文件war包,jar包,so文件等集合在一起,包括其依赖关系。可能有自动化的程序代为处理吧。

class Binding ,这个类看样子是一个抽象工厂的类,将class名和class的实例类型当做参数传入,然后得到IBindingFactory的某个实现类的实例。

class BindingManager ,其实就是一个map,关于Binding类和绑定名的map.

class BindingUtil ,这个类就是做了一个string中特殊字符的替换,先将http://和字符串末尾的"/"去掉,然后再将./-变为_,也就是说http://blog.csdn.net/cctt_1/将变为blog_csdn_net_cctt_1.

interface BlockStorageManager ,主要是管理逻辑磁盘,快照,得到某个逻辑盘集合状态的接口。

class BucketAlreadyExistsException ,这个异常类继承了EucalyptusCloudException ,而EucalyptusCloudException又继承了AxisFault 。不过这里的bucket是指的什么?

class BucketAlreadyOwnedByYouException ,这个异常类也继承了EucalyptusCloudException ,从名字上很明显就是不不能将已经分配给你的bucket再重复分配给你。

class BucketInfo ,这就是bucket的类了。里面有几个属性,bucketid,所有者的id,bucket的name,bucket创建的时间,是否全局读写,这个bucket所拥有的objects和那些objects的Info,global_read_acp和global_write_acp这里acp是什么? bucket的size,位置,bucket的所有授权和授权信息。授权里的信息可以表明能否有读写acp的权限。不过我还是不明白bucket是啥米?

class BucketNotEmptyException ,同样继承了EucalyptusCloudException,不过什么时候会抛出这个异常呢?

下面是一堆build.xml,这个是ant的build.xml.

class Bukkit  这个类是管理存储空间,bucket,image的类,应该是clc的核心类(image管理)。好像Eucalyptus中设置每个用户的最大bucketsize为5.其中也含有创建bucket的方法.终于渐渐有点眉目了,其实就是Eucalyptus中将image上传 Walrus的过程。详情查看 ,并且含有解密Image和检查Manifest的过程。其中这个java文件中还含有几个内部类:class ImageCacheFlusher ,这个是私有的。并且是个线程类,调用的是私有函数flushImageCache主要用于将Image写入并清除ImageCache.上面还有一个共有函数FlushImageCache,和这个私有函数的区别在于没有使用信号量,并且首字母是大写的。class ImageCacher 也是一个私有线程类,主要用于将Image做Cache.class StreamConsumer 同样是一个私有线程类,大意应该是做上传操作的。Eucalyptus中一个IO Chunk size的大小为102400byte也就是100KB.class Tar私有类主要是untar,解密Image用的。class Reader 是一个default的线程类,是用于读取一个Object用的也是每100KB一读。class SnapshotDeleter 也是私有线程类,用于快照的删除。

class BukkitImageTest 做测试用的,继承于TestCase

class BukkitTest ,继承于TestCase,是测试Bukkit用的。

 

c3p0-config.xml这个是用在何处的xml配置文件?在clc/module/core/resources中。
class CaseInsensitiveMap,这个就是一个并发的hashmap,也就是ConcurrentHashMap的一个展现,不过它将所有key中的string都变为小写存储。
CC-binding.xml,这个也是类映射到XML的文件。

cc-client-marshal-adb.c现在变为c语言了。

 

view plaincopy to clipboardprint?
  1. int cc_killallInstances(axutil_env_t *env, axis2_stub_t *stub);  
  2. 这个是杀死所有实例的方法,不过好像实例总数被限制在256以下。  
  3. int cc_getConsoleOutput(char *instId, axutil_env_t *env, axis2_stub_t *stub);用输入拿到控制台输出的函数,错误return 1,正确return 0  
  4. int cc_rebootInstances(char **instIds, int instIdsLen, axutil_env_t *env, axis2_stub_t *stub);重启实例。我觉得Eucalyptus的代码没有注释,但是起名字还是不错的。  
  5. int cc_terminateInstances(char **instIds, int instIdsLen, axutil_env_t *env, axis2_stub_t *stub);终止实例  
  6. int cc_configureNetwork(char *sourceNet, char *destName, char *protocol, int min, int max, char *type, axutil_env_t *env, axis2_stub_t *stub);配置网络,其中min和max是端口范围的最小值与最大值  
  7. int cc_stopNetwork(int vlan, char *netName, axutil_env_t *env, axis2_stub_t *stub);断开网络  
  8. int cc_attachVolume(char *volumeId, char *instanceId, char *remoteDev, char *localDev, axutil_env_t *env, axis2_stub_t *stub);添加逻辑分区  
  9. 后面还有解除逻辑分区,描述地址,运行实例,描述实例等方法  

 

cc-client-marshal.h是cc-client-marshal-adb.c的头文件。

cc-getlogs.xml~cc-vms.xml都是将类映射到XML

CCclient.c包含了cc-client-marshal.h,是cc控制的主函数入口。其实就是命令行参数的解析,用法为CCclient <host:port> <command> <opts>

class CertAuthentication,实现了Authenticator,使用AbstractKeyStore的getCertificateAlias()方法得到证书的useralias,然后这个alias和EucalyptusProperties.NAME也就是"eucalyptus"作比较。成功的话就将msg中的userID和effectiveUserID设置为"eucalyptus"。

class CertificateInfo,这个就是证书的信息:证书的id,alias,和value.

class Cipher,这个是sun的package javax.crypto中的。是用来加密解密的算法。

class CipherInputStream,这个同样也是sun的package javax.crypto中的。这个是用来返回通过Cipher处理过后的数据的。

class CipherOutputStream ,这个是用来写数据的。

class CipherSpi 这个是用来提供Cipher服务的抽象接口。也是sun的。我发现一条规律:凡是代码中出现多行注释的,都不是Eucalyptus的代码。

client-marshal-adb.c这个已经涉及到nc了。

 

view plaincopy to clipboardprint?
  1. ncStub * ncStubCreate (char *endpoint_uri, char *logfile, char *homedir) ;创建一个nc的桩。这里要根据远端uri,日志文件,主目录来创建,另外日志文件也是来创建env的。  
  2. int ncStubDestroy (ncStub * st);释放nc的桩  
  3. static int datetime_to_unix (axutil_date_time_t *dt, axutil_env_t *env);这里做了一个时间转化,将时间转为unix的时间。  
  4. static ncInstance * copy_instance_from_adb (adb_instanceType_t * instance, axutil_env_t * env);从adb中将实例copy出来,不过adb是啥米?  
  5. int ncRunInstanceStub (ncStub *st, ncMetadata *meta, char *instanceId, char *reservationId, ncInstParams *params, char *imageId, char *imageURL, char *kernelId, char *kernelURL, char *ramdiskId, char *ramdiskURL, char *keyName, char *privMac, char *pubMac, int vlan, char *userData, char *launchIndex, char **groupNames, int groupNamesSize, ncInstance **outInstPtr);哇,这参数的确多得可怕....以后再研究。  

 

 

view plaincopy to clipboardprint?
  1. int ncGetConsoleOutputStub (ncStub *st, ncMetadata *meta, char *instanceId, char **consoleOutput) ;貌似是通过stub来得到consoleOutpout的函数。不过结合cc中东西来看,这个应该是每个节点处的收发器。它将和cc中的几个函数远程作用。  
  2. int ncRebootInstanceStub (ncStub *st, ncMetadata *meta, char *instanceId) ;应该是cc中rebootInstance的桩。  
  3. 下面的函数基本和cc中的一致。都是安插下来的东东。  

 

client-marshal-local.c,这就是本地的方法,和桩不桩的就没有关系了。但是为了统一,还是和上面的函数签名一致。因为client-marshal-local.c和client-marshal-adb.c的头文件都是client-marshal.h

client-marshal.h,不再过多介绍

client-policy-template.xml这是x509的证书模板。

interface Client,含有发送msg,取消订阅某些消息,根据OMElement同步异步,返回uri的函数接口。OMElement是啥米?

原创粉丝点击