第一次任务完成经历的总结:

任务简介:

为Openstack的组件cloudkitty添加一个计费通知feature的子功能,通知发送功能。具体的要求是,提供4个邮件接口和一个短信接口给上游调用,并将上游传入的data分为四类渲染成指定的html并通过邮件发送api发送给客户,同时把一类data通过短信api发送给客户。
虽然这只是一个小小的功能但是花了1个礼拜(5个工作日完成了这个活)。

阅读准备:

首先先介绍下cloudkitty,cloudkitty是openstack项目的一个计费作为服务(Rating as a service)的项目。cloudkitty在以下四个层面高度组件话:

  • input data sources (collectors)
  • rating policies (rating pipeline)
  • output storage (storage)
  • output file format (writers, used to generate reports)

这次任务做的便是第三四层级的活。

任务抽象

简单任务抽象的缘由:

之前自己有写过一些程序,面向对象的编程思想也了解,但是从来都没有仔细的去思考过在实际的编码过程中更好地使用面向对象的思维方式来解决问题。在这次任务的一开始,我都没有考虑过用面向对象的方法去解决这个问题,但是项目使用的是stevedore来动态加载服务的,为了使整体更加的协调,同时为了与调度服务解耦,所以通知发送服务所以必须用类来封装方法。

抽象对我造成的挑战:

由于从通知方式出发去抽象的话,两种方式需要的接口数不一样,所以父类写接口不合适,所以我就想从发送的邮件内容来设置父类盒子类,父类实现发送邮件和短信的方法,子类直接调用就行。虽然这样实现了复用,但是调度程者得去初始化很多子类的实例,并要知道对应的子类是否需要发送短信。后来找了超哥聊了下,发现从方式的角度去抽象才是最好的。对于不需要使用的内容短信发送可以进行空实现,在父类中定义接口,调用者以下便可以看明白。
第一次使用python中的接口实现方式,这里记录下:

@six.add_metaclass(abc.ABCMeta)
class NotifierService(object):def __init__(self):pass@abc.abstractmethoddef notify_user_arrearing_lightly(self):"""send normal user arrearing notification in less than pridict_daydays."""@abc.abstractmethoddef notify_admin_arrearing_lightly(self):"""send admin all arrearing users in less than pridict_day days withemail."""@abc.abstractmethoddef notify_admin_arrearing_strongly(self):"""send admin all arrearing users in less than 30days with email."""@abc.abstractmethoddef notify_admin_releasing_strongly(self):"""send admin all resource releasing users in less than( max_day - float_variable ) days.

其他的就不写了。

stevedore之坑:

这个对象自动加载的包,会把对象初始化的报错信息给吃掉并且不会向外部调用抛异常,并把这个异常写入到日志中。这个即便是单步调试也无法定位问题。直到在超哥的帮助下逐个排除问题后,最后翻查日志的时候发现问题的。开发陌生项目的时候,有日志一定要关注,这样可以少走很多弯路,特别是使用一些库的时候。

oslo_config库之坑:

第一次使用这个库,看了下官方的文档就了解了下一些options的类型和demo却没有发现必须要将自己定义的Options注册到conf中才能使用其中的配置值,这里举个例子:

notification_opts = [cfg.StrOpt('origin',help='SMS and Email api origin'),cfg.ListOpt('emails',help='Emails of administrator of platform'), ]CONF = cfg.CONF
CONF.register_opts(notification_opts, 'notification')

在定义完option后必须要通过register_opts方法将options注册到conf对象中。

经验分享:

这次的部署是使用kolla-ansible的方式来进行的,所以所有的服务都跑在容器里面。如果想要测试的话,就得将代码更新到容器中,然后再重启容器服务才能才能够工作。但是这样操作的话非常麻烦,下面分享几个方便的小技巧:

修改容器启动命令,让工作远离重启:

玩过kolla-ansible的朋友都知道:每一个用kolla-ansible启动的容器在“/etc/kolla/容器名下”都会有一个config.json的文件。这个文件名中的command键值存放了容器中服务的启动命令,一旦这个命令启动的进程挂了,容器便会重启,这里我们改为sleep 111111111111111111 让其一直休眠。这样容器便不会挂了。

git更新代码:

当代码改动变得非常多而杂的时候手动更新代码便不再合适了。所以我们要借助工具来完成代码的更新,git是我们的首选,因为镜像中是使用pip安装的包,所以文件目录结构和项目的文件目录结构基本没什么变化。可以使用以下命令操作:

1.
#如果你修改的不再stage中
git diff  > patch
#如果在stage中
git diff  --cached > patchgit diff  branchname --cached > patch
2.将patch文件scp到部署机上
scp patch remote:/root3.使用docker cp指令将patch复制到容器中
docker cp patch cloudkitty_api:/root4.用git初始化项目的部署目录,并将当前的代码提交个patch,这步操作需要设置下邮箱
docker exec -u root -it cloudkitty bash
cd /var/lib/kolla/venv/lib/python2.7/site-packages/cloudkitty
git init
git add .
git config --global user.email "hi@openstack.com"
git commit -m 'init'5.在这里如果path中有requirements和setup.cfg文件请把他们删除掉,因为安装文件中不存在这些东西。
docker exec -u root -it cloudkitty bash
cd /var/lib/kolla/venv/lib/python2.7/site-packages/
git apply /root/patch

第一次任务完成经历的总结相关推荐

  1. 大三下,第一次前端面试经历

    前言 我,本科,大三下,软件工程专业,大学期间主要学习前端方向,由于大四没课,想着暑假可以找个实习,在暑假甚至大四可以为自己找工作创造机会,结果面试的时候才发现,自己在各个方面还真是不完善啊. 由于大 ...

  2. 搬砖,真的是我第一次赚钱的经历!

    1. 搬砖,真的是我第一次赚钱的经历! 记得高四(特指复读)毕业那年,在家里无所事事.高考再次落败--够不着二本线,三本又没钱上,这给我的打击是巨大的,就仿佛整个人跳进了冰窟窿.怎么办呢? 我二叔家开 ...

  3. 东华之旅vs第一次坐飞机经历2018-06-10

    东华校门 东华一食堂 最后一顿晚餐 环境能源夏令营 第一次坐飞机 五点多出发辛辛苦苦做了两个多小时的地铁,差一点没赶上21.00截止登机的飞机.第一次坐飞机的经历就是这么紧张,21.08全部乘客登机正 ...

  4. 记第一次实习面试经历(字节跳动)

    想要获取笔者自己整理的Android.Java面试资料原文文稿(markdown格式),可关注左边栏二维码所示公众号,公众号内回复"A3"(Android资料)."J4& ...

  5. Java第一次实习面试经历

    本人是普通二本大学的大三在校生,自学的方向是Java后端开发.校招的时候,投了一家公司的简历.虽然是一家小公司,但效率挺快的,第二天就通知我去面试了:下面我来说说我的经历. 面试时间是:2018/3/ ...

  6. 记第一次codeforces比赛经历

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~凑字数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  7. 第一次出省经历--美丽成都之行

    从小生活在大连,读书.就业就这样一直依赖着这个城市.因为家人都在这边,我的生命也就跟这个城市紧紧地联系到了一起,曾经也想过去外地发展,可一次次因为自己的心中的怯懦,而一次又一次地放弃了.不过,还好,大 ...

  8. S2SH 第一次整合的经历

    2019独角兽企业重金招聘Python工程师标准>>> 好不容易把S2SH整合到了一起 记下来  以后用到了直接复制粘贴... 第一步:定义了各种model 实现getter()和s ...

  9. 记录第一次出差的经历

    前奏篇 2020年6月19日的下午,是一个周五.在这个悠闲的时光里,我翘着二郎腿,写着再普通不过的curd. 突然,主管仿佛捕捉到了我迷离的眼神,慢慢地走到我的旁边,拉着我的衣角. 我想:该不会我摸鱼 ...

最新文章

  1. 关于云计算 你所知道的可能不是真的
  2. struts2 防止表单重复提交--令牌机制
  3. 恒生电子发布云计算金融应用“超云计划”
  4. 兼容IE678的placeholder
  5. VS中修改站点运行方式(集成 Or 经典)
  6. 怎样将employee 加到Territory里
  7. 学习手记(2021/3/19~?)
  8. 第一次ActiveX Fuzzing测试
  9. python带我起飞_Python带我起飞:入门、进阶、商业实战
  10. postman发送Post请求
  11. android log 如何获取double类型后小数点的值_【ES6基础】Symbol介绍:独一无二的值...
  12. android 颜色反转 api,来自Android camera2 API的图像数据在Galaxy S5上翻转和压缩
  13. C++ 一定要使用strcpy_s()函数 等来操作方法c_str()返回的指针
  14. Bailian2952 循环数【数学】
  15. Flutter实战之AS快键键
  16. 如何评价路孚特的Datastream工具?
  17. UI设计师的日常工作流程是怎样的?|优漫教育
  18. 卡塞格林光学系统_改进型卡塞格林光学系统的设计
  19. 大数据在推荐系统中的作用
  20. RocketMQ存储篇——整体结构以及MappedFile讲解

热门文章

  1. autojs发射广播源码,使用了sendBroadcast方法
  2. MySQL 优化:Explain 执行计划详解
  3. 大内密探HMM(转)
  4. python期货数据 库_如何用python或者基于vnpy框架将期货tick数据聚合成1分钟数据呢?...
  5. BootStrap之标签页切换
  6. 【数据库学习笔记】Day03 - SQL语言基础及数据库定义功能
  7. 台式电脑上没有显示计算机怎么办,电脑显示器无视频输入怎么办
  8. 闯荡江湖的必备指南(2)
  9. 公寓做网络管理300多个房间,怎么做?
  10. 苹果硅之后:PC市场会走向何方?